【问题标题】:how to modify smart contract template for self defined functionality如何为自定义功能修改智能合约模板
【发布时间】:2017-09-19 20:54:05
【问题描述】:

我查看了几个智能合约模板并学习了几个教程。但是他们都没有逐行查看这些代码的细节。我想添加一个将公司利润分红回馈给客户的功能,我应该在哪里添加呢?例如下面的代码模板,我可以在代码块中添加我的函数 giveBackDividend() 吗?

谁能告诉我 ICO 智能合约的一般结构?

contract HubiiCrowdsale is Crowdsale {
  uint private constant chunked_multiple = 18000 * (10 ** 18); // in wei
  uint private constant limit_per_address = 100000 * (10 ** 18); // in wei
  uint private constant hubii_minimum_funding = 17000 * (10 ** 18); // in wei
  uint private constant token_initial_supply = 0;
  uint8 private constant token_decimals = 15;
  bool private constant token_mintable = true;
  string private constant token_name = "Hubiits";
  string private constant token_symbol = "HBT";
  uint private constant token_in_wei = 10 ** 15;
  // The fraction of 10,000 out of the total target tokens that is used to mint bonus tokens. These are allocated to the team's multisig wallet.
  uint private constant bonus_base_points = 3000;
  function HubiiCrowdsale(address _teamMultisig, uint _start, uint _end) Crowdsale(_teamMultisig, _start, _end, hubii_minimum_funding) public {
      PricingStrategy p_strategy = new FlatPricing(token_in_wei);
      CeilingStrategy c_strategy = new FixedCeiling(chunked_multiple, limit_per_address);
      FinalizeAgent f_agent = new BonusFinalizeAgent(this, bonus_base_points, _teamMultisig); 
      setPricingStrategy(p_strategy);
      setCeilingStrategy(c_strategy);
      // Testing values
      token = new CrowdsaleToken(token_name, token_symbol, token_initial_supply, token_decimals, _teamMultisig, token_mintable);
      token.setMintAgent(address(this), true);
      token.setMintAgent(address(f_agent), true);
      token.setReleaseAgent(address(f_agent));
      setFinalizeAgent(f_agent);
  }

  // These two setters are present only to correct block numbers if they are off from their target date by more than, say, a day
  function setStartingBlock(uint startingBlock) public onlyOwner inState(State.PreFunding) {
      require(startingBlock > block.number && startingBlock < endsAt);
      startsAt = startingBlock;
  }

  function setEndingBlock(uint endingBlock) public onlyOwner notFinished {
      require(endingBlock > block.number && endingBlock > startsAt);
      endsAt = endingBlock;
  }

}

【问题讨论】:

    标签: blockchain solidity ico smartcontracts


    【解决方案1】:

    TL;DR;这段代码使用区块号简单地定义了 ICO 的开始和结束,但它扩展了各种其他来源以实现 Token 等。修改它不会导致任何问题。

    我认为你从错误的地方开始。首先,您可以在不影响其现有功能的情况下向任何合约添加任何代码。我知道这有点为时过早,但我计划在接下来的一天左右完成 2 个关于 ERC20 和 ERC223 标准的教程,这就是代币应该围绕的设计标准。这将发布在https://www.youtube.com/channel/UCaWes1eWQ9TbzA695gl_PtA

    ERC20

    contract ERC20 {
        function totalSupply() constant returns (uint totalSupply);
        function balanceOf(address _owner) constant returns (uint balance);
        function transfer(address _to, uint _value) returns (bool success);
        function transferFrom(address _from, address _to, uint _value) returns (bool success);
        function approve(address _spender, uint _value) returns (bool success);
        function allowance(address _owner, address _spender) constant returns (uint remaining);
        event Transfer(address indexed _from, address indexed _to, uint _value);
        event Approval(address indexed _owner, address indexed _spender, uint _value);
    }
    

    ERC223

    contract ERC223 {
        uint public totalSupply;
        function balanceOf(address who) constant returns (uint);
        function name() constant returns (string _name);
        function symbol() constant returns (string _symbol);
        function decimals() constant returns (uint8 _decimals);
        function totalSupply() constant returns (uint256 _supply);
        function transfer(address to, uint value) returns (bool ok);
        function transfer(address to, uint value, bytes data) returns (bool ok);
        function transfer(address to, uint value, bytes data, string custom_fallback) returns (bool ok);
        event Transfer(address indexed from, address indexed to, uint value, bytes indexed data);
    }
    

    在您签订代币合同后,您需要考虑 ICO。使用 ICO,您应该定义起点和终点。在上面的示例中,这是基于块,这就是您拥有的原因:

      require(startingBlock > block.number && startingBlock < endsAt);
    

      require(endingBlock > block.number && endingBlock > startsAt);
    

    此合约继承自名为“Crowdsale”的合约,您的大部分实现看起来都来自该合约。完整的源代码可以在https://etherscan.io/address/0xb9aac097f4dadcd6f06761eb470346415ef28d5a#code 上找到。这个令牌基于 ERC20 标准,有相当多的继承树。

    令牌的代码在 BasicToken 中完成:

    /**
     * @title Basic token
     * @dev Basic version of StandardToken, with no allowances. 
     */
    contract BasicToken is ERC20Basic {
      using SafeMath for uint;
    
      mapping(address => uint) balances;
    
      /**
       * Obsolete. Removed this check based on:
       * https://blog.coinfabrik.com/smart-contract-short-address-attack-mitigation-failure/
       * @dev Fix for the ERC20 short address attack.
       *
       * modifier onlyPayloadSize(uint size) {
       *    require(msg.data.length >= size + 4);
       *    _;
       * }
       */
    
      /**
      * @dev transfer token for a specified address
      * @param _to The address to transfer to.
      * @param _value The amount to be transferred.
      */
      function transfer(address _to, uint _value) public returns (bool success) {
        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        Transfer(msg.sender, _to, _value);
        return true;
      }
    
      /**
      * @dev Gets the balance of the specified address.
      * @param _owner The address to query the the balance of. 
      * @return An uint representing the amount owned by the passed address.
      */
      function balanceOf(address _owner) public constant returns (uint balance) {
        return balances[_owner];
      }
    
    }
    

    看起来它使用了一些 ERC20 和 ERC223 标准,这很好,但如果您尝试遵循源代码,则会有点混乱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多