zoukankan      html  css  js  c++  java
  • Solidity 合约调用合约

    原文地址:https://medium.com/@k3no/making-a-birthday-contract-858fd3f63618

    先将datetime合约部署:https://github.com/pipermerriam/ethereum-datetime

    pragma solidity ^0.4.16;
    
    contract DateTime {
            /*
             *  Date and Time utilities for ethereum contracts
             *
             */
            struct _DateTime {
                    uint16 year;
                    uint8 month;
                    uint8 day;
                    uint8 hour;
                    uint8 minute;
                    uint8 second;
                    uint8 weekday;
            }
    
            uint constant DAY_IN_SECONDS = 86400;
            uint constant YEAR_IN_SECONDS = 31536000;
            uint constant LEAP_YEAR_IN_SECONDS = 31622400;
    
            uint constant HOUR_IN_SECONDS = 3600;
            uint constant MINUTE_IN_SECONDS = 60;
    
            uint16 constant ORIGIN_YEAR = 1970;
    
            function isLeapYear(uint16 year) public pure returns (bool) {
                    if (year % 4 != 0) {
                            return false;
                    }
                    if (year % 100 != 0) {
                            return true;
                    }
                    if (year % 400 != 0) {
                            return false;
                    }
                    return true;
            }
    
            function leapYearsBefore(uint year) public pure returns (uint) {
                    year -= 1;
                    return year / 4 - year / 100 + year / 400;
            }
    
            function getDaysInMonth(uint8 month, uint16 year) public pure returns (uint8) {
                    if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
                            return 31;
                    }
                    else if (month == 4 || month == 6 || month == 9 || month == 11) {
                            return 30;
                    }
                    else if (isLeapYear(year)) {
                            return 29;
                    }
                    else {
                            return 28;
                    }
            }
    
            function parseTimestamp(uint timestamp) internal pure returns (_DateTime dt) {
                    uint secondsAccountedFor = 0;
                    uint buf;
                    uint8 i;
    
                    // Year
                    dt.year = getYear(timestamp);
                    buf = leapYearsBefore(dt.year) - leapYearsBefore(ORIGIN_YEAR);
    
                    secondsAccountedFor += LEAP_YEAR_IN_SECONDS * buf;
                    secondsAccountedFor += YEAR_IN_SECONDS * (dt.year - ORIGIN_YEAR - buf);
    
                    // Month
                    uint secondsInMonth;
                    for (i = 1; i <= 12; i++) {
                            secondsInMonth = DAY_IN_SECONDS * getDaysInMonth(i, dt.year);
                            if (secondsInMonth + secondsAccountedFor > timestamp) {
                                    dt.month = i;
                                    break;
                            }
                            secondsAccountedFor += secondsInMonth;
                    }
    
                    // Day
                    for (i = 1; i <= getDaysInMonth(dt.month, dt.year); i++) {
                            if (DAY_IN_SECONDS + secondsAccountedFor > timestamp) {
                                    dt.day = i;
                                    break;
                            }
                            secondsAccountedFor += DAY_IN_SECONDS;
                    }
    
                    // Hour
                    dt.hour = getHour(timestamp);
    
                    // Minute
                    dt.minute = getMinute(timestamp);
    
                    // Second
                    dt.second = getSecond(timestamp);
    
                    // Day of week.
                    dt.weekday = getWeekday(timestamp);
            }
    
            function getYear(uint timestamp) public pure returns (uint16) {
                    uint secondsAccountedFor = 0;
                    uint16 year;
                    uint numLeapYears;
    
                    // Year
                    year = uint16(ORIGIN_YEAR + timestamp / YEAR_IN_SECONDS);
                    numLeapYears = leapYearsBefore(year) - leapYearsBefore(ORIGIN_YEAR);
    
                    secondsAccountedFor += LEAP_YEAR_IN_SECONDS * numLeapYears;
                    secondsAccountedFor += YEAR_IN_SECONDS * (year - ORIGIN_YEAR - numLeapYears);
    
                    while (secondsAccountedFor > timestamp) {
                            if (isLeapYear(uint16(year - 1))) {
                                    secondsAccountedFor -= LEAP_YEAR_IN_SECONDS;
                            }
                            else {
                                    secondsAccountedFor -= YEAR_IN_SECONDS;
                            }
                            year -= 1;
                    }
                    return year;
            }
    
            function getMonth(uint timestamp) public pure returns (uint8) {
                    return parseTimestamp(timestamp).month;
            }
    
            function getDay(uint timestamp) public pure returns (uint8) {
                    return parseTimestamp(timestamp).day;
            }
    
            function getHour(uint timestamp) public pure returns (uint8) {
                    return uint8((timestamp / 60 / 60) % 24);
            }
    
            function getMinute(uint timestamp) public pure returns (uint8) {
                    return uint8((timestamp / 60) % 60);
            }
    
            function getSecond(uint timestamp) public pure returns (uint8) {
                    return uint8(timestamp % 60);
            }
    
            function getWeekday(uint timestamp) public pure returns (uint8) {
                    return uint8((timestamp / DAY_IN_SECONDS + 4) % 7);
            }
    
            function toTimestamp(uint16 year, uint8 month, uint8 day) public pure returns (uint timestamp) {
                    return toTimestamp(year, month, day, 0, 0, 0);
            }
    
            function toTimestamp(uint16 year, uint8 month, uint8 day, uint8 hour) public pure returns (uint timestamp) {
                    return toTimestamp(year, month, day, hour, 0, 0);
            }
    
            function toTimestamp(uint16 year, uint8 month, uint8 day, uint8 hour, uint8 minute) public pure returns (uint timestamp) {
                    return toTimestamp(year, month, day, hour, minute, 0);
            }
    
            function toTimestamp(uint16 year, uint8 month, uint8 day, uint8 hour, uint8 minute, uint8 second) public pure returns (uint timestamp) {
                    uint16 i;
    
                    // Year
                    for (i = ORIGIN_YEAR; i < year; i++) {
                            if (isLeapYear(i)) {
                                    timestamp += LEAP_YEAR_IN_SECONDS;
                            }
                            else {
                                    timestamp += YEAR_IN_SECONDS;
                            }
                    }
    
                    // Month
                    uint8[12] memory monthDayCounts;
                    monthDayCounts[0] = 31;
                    if (isLeapYear(year)) {
                            monthDayCounts[1] = 29;
                    }
                    else {
                            monthDayCounts[1] = 28;
                    }
                    monthDayCounts[2] = 31;
                    monthDayCounts[3] = 30;
                    monthDayCounts[4] = 31;
                    monthDayCounts[5] = 30;
                    monthDayCounts[6] = 31;
                    monthDayCounts[7] = 31;
                    monthDayCounts[8] = 30;
                    monthDayCounts[9] = 31;
                    monthDayCounts[10] = 30;
                    monthDayCounts[11] = 31;
    
                    for (i = 1; i < month; i++) {
                            timestamp += DAY_IN_SECONDS * monthDayCounts[i - 1];
                    }
    
                    // Day
                    timestamp += DAY_IN_SECONDS * (day - 1);
    
                    // Hour
                    timestamp += HOUR_IN_SECONDS * (hour);
    
                    // Minute
                    timestamp += MINUTE_IN_SECONDS * (minute);
    
                    // Second
                    timestamp += second;
    
                    return timestamp;
            }
    }

    然后获取datetime utility的地址,再部署另一个合约:

    pragma solidity ^ 0.4.0;
    contract DateTime {
            function getYear(uint timestamp) public constant returns (uint16);
            function getMonth(uint timestamp) public constant returns (uint8);
            function getDay(uint timestamp) public constant returns (uint8);
    }
    contract BirthDay {
      uint public bday;
      address public dateTimeAddr = 0xb23e0bfaeedcfce82ea2011f2a2726584e611e57;
      DateTime dateTime = DateTime(dateTimeAddr);
      function BirthDay() public  {
        bday = now;
      }
      function getBirthYear() view public returns (uint16){
          return dateTime.getYear(bday);
      }
      function getBirthMonth() view public returns (uint8){
          return dateTime.getMonth(bday);
      }
      function getBirthDay() view public returns (uint8){
          return dateTime.getDay(bday);
      }
    }
  • 相关阅读:
    std::exception标准和各平台实现的不同
    学习Linux必备的硬件基础一网打尽
    Git安装及SSH Key管理之Windows篇
    简要介绍一下Dos/Windows格式文件和Unix/Linux格式文件(剪不断理还乱的 和 )
    C/C++中的序列点
    STL容器之vector 的下标越界是否报错
    二维数组与指针的联系与区别
    C/C++ strlen函数为什么不能传入空指针NULL?
    棋盘游戏
    Knight Moves
  • 原文地址:https://www.cnblogs.com/huahuayu/p/8670223.html
Copyright © 2011-2022 走看看