2017-09-19 117 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標準,這是個精細位,但有點混亂,如果你想跟着源碼。