2017-09-19 89 views
0

我看了几个智能合同模板,并通过几个教程。但是他们都没有一行一行地详细说明这些代码。我想添加一个让客户回报公司利润分红的功能,我应该在哪里添加它?例如下面的代码模板,我可以在代码块中添加我的函数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; 
    } 

}

回答

1

TL; DR;此代码只是使用块号定义ICO的开始和结束,但它扩展了各种其他来源以实现令牌等。修改它不会导致任何问题。

我想你是从错误的地方开始的。首先,您可以将任何代码添加到任何合同中,而不会暗示其现有功能。我知道这有点不成熟,但我打算在第二天做两个教程,这些教程是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标准,这是个精细位,但有点混乱,如果你想跟着源码。