イーサー坊ネットワークの構築、契約のコンパイル、導入

7735 ワード

イーサー坊ネットワークの構築、契約のコンパイル、導入
ローカルにイーサー坊のプライベートチェーンを構築し、スマート契約の開発テストを行います.開発されたインテリジェント契約切替インタフェースは、エーテル坊公有チェーンに配備されています.
オープンソースツールのインストール
  • install Go compiler
  • go-ethereumコンパイルインストール
  • 太坊インテリジェント契約言語solidityで
  • をインストール
    プライベートチェーンの構築
  • プライベートチェーンデータ
      mkdir privateChain
      cd privateChain
    
  • を格納するフォルダを作成する.
  • gethを使用して
      geth --networkid 123 --dev --datadir data1 --rpc --rpcaddr 192.168.11.243 --rpcport 8989 --port 3000
      // --identity     ID
      // --networkid    id,          id
      // --dev   
      // --datadir            
      // --rpc     HTTP-RPC  
      // --rpcaddr  HTTP-RPC  ip  
      // --rpcport HTTP-RPC       (default:8545)
      // --port                (default:30303)
      // --nodiscover          ,                
    
  • をロード
  • オープンノード
      cd /home/jianhuaixie/blockchain/privateChain/data1
      geth attach ipc:geth.ipc
    
  • コンソールを開き、いくつかのJSのインタラクションを実現します.この環境には、イーサー坊を操作するためのJavaScriptオブジェクトが内蔵されています.これらのオブジェクトを直接使用することができます.これらのオブジェクトは主に次のとおりです.
    - eth:               
    - net:      p2p       
    - admin:              
    - miner:    &         
    - personal:             
    - txpool:              
    - web3:       ,            
    
  • アカウント
      personal.listAccounts  //      
      personal.newAccount("jianhuaixie")  //             
      eth.coinbase  //     0   
      eth.getBalance(eth.coinbase)  //  coinbase    
      miner.start();  //    ,Block sealing failed        err="waiting for transactions"    ,Geth   ,      ,            ,  
      miner.stop();   //    
    
      user1=eth.accounts[0]
      user2=eth.accounts[1]
      eth.blockNumber  //      
      personal.unlockAccount(user1)  //    ,      user1,      
      eth.sendTransaction({from:user1,to:user2,value:web3.toWei(3,"ether")})   //           
      eth.blockNumber
    
      miner.setEtherbase(eth.accounts[1])  //      
    
  • を作成
  • インテリジェント契約書作成
      pragma solidity ^0.4.21;
      contract WiairRouteToken {
          function multiply(uint a) constant returns(uint d){
              return a*7;
          }
      }
    
  • スマート契約バイトコードとABI
  • を取得
    バイトコード
    {
        "linkReferences": {},
        "object": "6060604052341561000f57600080fd5b60b18061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60006007820290509190505600a165627a7a7230582072d602b915fc4c683527b7f04dbf273e779da8101cb0bcfbe7894b9664c139fb0029",
        "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE CALLVALUE ISZERO PUSH2 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xB1 DUP1 PUSH2 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x3F JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0xC6888FA1 EQ PUSH1 0x44 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE ISZERO PUSH1 0x4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x62 PUSH1 0x4 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP2 SWAP1 POP POP PUSH1 0x78 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH1 0x7 DUP3 MUL SWAP1 POP SWAP2 SWAP1 POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH19 0xD602B915FC4C683527B7F04DBF273E779DA810 SHR 0xb0 0xbc CREATE2 0xe7 DUP10 0x4b SWAP7 PUSH5 0xC139FB0029 ",
        "sourceMap": "26:114:0:-;;;;;;;;;;;;;;;;;"
    }
    

    abi
    [
        {
            "constant": true,
            "inputs": [
                {
                    "name": "a",
                    "type": "uint256"
                }
            ],
            "name": "multiply",
            "outputs": [
                {
                    "name": "d",
                    "type": "uint256"
                }
            ],
            "payable": false,
            "stateMutability": "view",
            "type": "function"
        }
    ]
    

    コードコピー先https://remix.ethereum.org、コンパイルし、バイトコードとABIをコピーします.
  • bejsonでグラデーションABIを文字列に変換http://www.bejson.com
      [{\"constant\":true,\"inputs\":[{\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"multiply\",\"outputs\":[{\"name\":\"d\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]     
    
  • abiによる契約オブジェクト
      > var abi = JSON.parse('[{\"constant\":true,\"inputs\":[{\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"multiply\",\"outputs\":[{\"name\":\"d\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]')
      > var myContract = web3.eth.contract(abi)
    
  • の作成
  • 見積手数料
      > var bytecode = "0x   "  //0x  16  ,       
      //   gas   ,          ,               gas  
      > web3.eth.estimateGas({data:bytecode})
    
  • 導入契約は、便宜上、コールバック関数
      > personal.unlockAccount(user1) 
      
      > var contractInstance = myContract.new({data:bytecode gas:1000000,from:user1},
          function(e,contract){
              if(!e){
                  if(!contract.address){
                      console.log("Contract transaction send:Transation Hash:"+contract.transactionHash+" waiting to be mined...");
                  }else{
                      console.log("Contract mined Address:"+contract.address);
                      console.log(contract);
                  }   
              }else{
                  console.log(e)
              }
          }
      )
    
      > miner.start();
    
  • を設定する.
  • 契約メソッド
      > contractInstance.multiply(6)
    
  • を呼び出す
    Ethernetプライベートネットワークによる複数のノードの作成
    創世ブロックの初期化
    geth --networkid 123 --datadir data1 --rpc --rpcaddr 192.168.11.243 --rpcport 8989 --port 3000 console
    //        ,    rpcaddr  
    //         ,       rpcport   port  datadir
    

    マルチノード接続
    > admin.nodeInfo.enode
    // Enode url                 id
    > web3.net.peerCount  //       
    > admin.peers  //    
    > admin.addPeer("enode://...")
    

    創世ブロックによるブロックチェーンの初期化
    genesis block file example
    {
        "config":{
            "chainId":15,
            "homesteadBlock":0,
            "eip155Block":0,
            "eip158Block":0
        },
        "difficulty":"4",
        "gasLimit":"2100000",
        "alloc":{
            "0xd8fac16ffe306a7e0006eb1e3817cc7039796e48":{
                "balance":"300000"
            },
            "0xdc59af2a8c245af2f526fabef80514291bb8b937":{
                "balance":"400000"
            }
        }
    }
    
  • 創世ブロックJSONファイル
      cat > genesis.json  // genesis file  
    
  • を生成
  • ブロックチェーンを初期化し、ブロックデータ
      geth init genesis.json --datadir blockchainData
    
  • を格納するフォルダを作成する.
  • 端末
      geth --networkid 123 --datadir blockchainData console
    
  • を開く.
  • minerのcoinbaseアカウント
      miner.setEtherbase("0xd8fac16ffe306a7e0006eb1e3817cc7039796e48")
    
  • を設定する