0

いくつかのスマート コントラクト テンプレートを見て、いくつかのチュートリアルを実行しました。しかし、これらのコードの詳細を 1 行ずつ調べているものはありません。会社の利益の配当を顧客に還元する機能を追加したいのですが、どこに追加すればよいですか?たとえば、次のコード テンプレートでは、コード ブロックに関数 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;
  }

}

4

1 に答える 1

1

TL;DR; このコードは、ブロック番号を使用して ICO の開始と終了を定義するだけですが、他のさまざまなソースを拡張してトークンなどを実装します。変更しても問題は発生しません。

あなたは間違った場所から始めていると思います。まず、既存の機能に影響を与えることなく、任意のコードを任意のコントラクトに追加できます。少し時期尚早であることは承知していますが、トークンの設計基準である ERC20 および ERC223 標準について、翌日かそこらで 2 つのチュートリアルを行う予定です。これは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 標準の一部を使用しているように見えますが、これは問題ありませんが、ソース コードに従おうとすると少し混乱します。

于 2017-09-20T16:21:15.987 に答える