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);
      }
    }
  • 相关阅读:
    9、Spring Boot 2.x 集成 Thymeleaf
    【专题】Spring Boot 2.x 面试题
    8、Spring Boot 2.x 服务器部署
    7、Spring Boot 2.x 集成 Redis
    6、Spring Boot 2.x 集成 MyBatis
    5、Spring Boot 2.x 启动原理解析
    4、Spring Boot 2.x 自动配置原理
    3、Spring Boot 2.x 核心技术
    2、Spring Boot 2.x 快速入门
    centOS下安装JDK1.8.60,glassfish4.1.1以及MySQL
  • 原文地址:https://www.cnblogs.com/huahuayu/p/8670223.html
Copyright © 2011-2022 走看看