以太坊学习路线——(二、下)以太坊プログラミングインターフェース:web 3.js


このブログのプレゼンテーションの基本的なオペレーティングシステム環境はCentOS 7で、参考書:以太坊開発実戦--以太坊の肝心な技術と実例分析第6章(呉寿鶴、馮翔、劉濤、周広益著).本博文関連プログラムを実行するには、エーテル坊のプライベートチェーンを構築し、testrpcをインストールする必要があります.
文書構造:
一.Web 3のインストールと起動js
二.アカウント関連API
1.利用可能なすべてのアカウントの表示
2.口座残高の表示
三、取引関連API
1.口座間振込取引
2.署名された振込取引を送信する
3.呼び出し契約

一.Web 3のインストールと起動js

$ npm install --save [email protected]

まず、testrpcを1つの端末で実行してテストチェーンを起動し、別の端末で関連jsファイルを作成します.ここではtestを書きます.jsファイルは次のとおりです.
var Web3 = require("web3");
//  web  
var web3 = new Web3();
//        
web3.setProvider(new Web3.providers.HttpProvider('http://localhost:8545'));

//         
var accounts = web3.eth.accounts;
console.info(accounts);
//             js  
[root@localhost geth]# node test.js 


//       ,       
[ '0x623053f6e32ea1740ab791fae0e2e402b367e501',
  '0xc8f4672e8e988df4d5f6ee9c1322eba005583267',
  '0x242e2ad79192f5f28c13d6d9ee57976ef346d63f',
  '0x88304656b1031469af4412df4b2de8b2c7759385',
  '0x55b0d4de3900b00c7ac1c5ede911a832c3f0ec91',
  '0xaf767e3d3da4b8bcba5ca9978d5ca4a7bdf6532f',
  '0x7ce1fd31c404682eba0d7fd33d8635c47ee2cc4b',
  '0x40023a7f603fd4fc9675c1670b249d054ae33eef',
  '0xa723cea532564ded55ad8e6256fb016d25cf18b5',
  '0x49ab097da3c5089764e0d5c4117f950263274c0b' ]


//  testrpc   ,           :eth_accounts
…………
…………
HD Wallet
==================
Mnemonic:      penalty silk correct trial good drama action arctic drip rebel weather level
Base HD Path:  m/44'/60'/0'/0/{account_index}

Listening on localhost:8545
eth_accounts

二.アカウント関連API


1.利用可能なすべてのアカウントの表示
var accounts = web3.eth.accounts;
console.info(accounts);

2.口座残高の表示
//  accounts[0]     ,       wei      
var balance_1 = web3.eth.getBalance(web3.eth.accounts[0]);
//    ether     
var balance_eth = web3.fromWei(balance_1,"ether");
console.log(balance_eth.toString());

三、取引関連API


イーサー坊の2つの口座間の振り替え操作は、時1つの取引とすることができ、スマート契約を呼び出す関数も時1つの取引とすることができる.
1.口座間振込取引
振り替えの前に取引にどれだけのgasを設定する必要があるか分からない場合は、次の文で、今回の取引で消費されるgasを推定することができます.
var estimate_gas = web3.eth.estimateGas({
	from: web3.eth.accounts[0],
	to: web3.eth.accounts[1],
	value: web3.toWei(1,"ether")

});
console.log(estimate_gas);//21000

一般的に簡単な振り替え取引は通常21000 gasかかり、gasを得ると振り替え取引を構築することができます.振込取引の構成部分:
  • from:トランザクションはこのアドレスを送信し、このトランザクションは最後にfromの秘密鍵署名が必要です.
  • to:この振替の宛先を受信します.
  • value:wei単位でこの取引の振り替えを受信します.
  • gas:この取引で使用可能なgasは、未使用のgasが返されます.
  • gasPrice:この取引に追加されたgas価格は、デフォルトではネットワークgas価格の平均値です.
  • //      
    var txId = web3.eth.sendTransaction({
    	from: web3.eth.accounts[0],
    	to: web3.eth.accounts[1],
    	value: web3.toWei(1,"ether"),
    	gas: estimate_gas
    });
    //      hash
    console.log(txId);//0x24ab2da77fe1cc65e75a7b9e8d51b058becd4fd8a3a67b765974bf2f692bd898
    testrpc      :
     Transaction: 0x24ab2da77fe1cc65e75a7b9e8d51b058becd4fd8a3a67b765974bf2f692bd898
      Gas usage: 21000
      Block Number: 1
      Block Time: Sat Mar 30 2019 17:44:04 GMT+0800 (Hong Kong Standard Time)
    //        
    var tx = web3.eth.getTransaction(txId);
    console.log(tx);
    
    
    //    
    { hash:
       '0x498c3835a3eeeb8d9a8f398aa036cd6c59a81bdd5af2390bd518bb9aa7622c70',
      nonce: 1,
      blockHash:
       '0x51b5cb1aa7a1258070ba2586c57f224ead9fd10c745af802f018ea56a41e09a1',
      blockNumber: 2,
      transactionIndex: 0,
      from: '0x623053f6e32ea1740ab791fae0e2e402b367e501',
      to: '0xc8f4672e8e988df4d5f6ee9c1322eba005583267',
      value: BigNumber { s: 1, e: 18, c: [ 10000 ] },
      gas: 21000,
      gasPrice: BigNumber { s: 1, e: 0, c: [ 1 ] },
      input: '0x0' }
    
    //        
    var tx_receipt = web3.eth.getTransactionReceipt(txId);
    console.log(tx_receipt);
    
    
    //    
    { transactionHash:
       '0x498c3835a3eeeb8d9a8f398aa036cd6c59a81bdd5af2390bd518bb9aa7622c70',
      transactionIndex: 0,
      blockHash:
       '0x51b5cb1aa7a1258070ba2586c57f224ead9fd10c745af802f018ea56a41e09a1',
      blockNumber: 2,
      gasUsed: 21000,
      cumulativeGasUsed: 21000,
      contractAddress: null,
      logs: [],
      status: 1 }
    

    2.署名された振込取引を送信する
    上記の取引を開始したアカウントは、私たちが接続しているイーサ坊ノードに格納されています.もし私たちが自分でアカウントを持っていて、このアカウントが私たちが接続しているイーサ坊ノードに格納されていない場合は、web 3を通過する必要があります.eth.sendRawTransactionメソッドは、トランザクションの署名と送信を完了します.
    後の操作で、作成したばかりのトランザクションrawTxに署名するには、別のライブラリを使用する必要があります.
    $ npm install --save [email protected]

    testを作成します.jsは、次のような内容を編集し、完了後test.js同じディレクトリの下でnode testを実行する.jsは実行をロードします.
    //  web3
    var Web3 = require("web3");
    //  web3  
    var web3 = new Web3();
    //        
    web3.setProvider(new Web3.providers.HttpProvider('http://localhost:8545'));
    
    /** (1)         */
    var address = "0xeaf9e84c229c9b1023dd9f8315c01045dd7b741d";
    var nonce = web3.eth.getTransactionCount(address,'pending');
    var amount = web3.toWei(1,"ether");
    var rawTx = {
            from:address,
            to:"0xb4f58a932a1cadf638f8e0eafce9bda71144c56e",
            value:web3.toHex(amount),
            nonce:web3.toHex(nonce),
            gasLimit:web3.toHex("49674")
    }
    
    /**(2).        */
    //  'ethereumjs-tx' 
    var Tx = require('ethereumjs-tx');
    
    //  raw transaction
    var tx = new Tx(rawTx);
    
    //from     
    var privateKey = new Buffer('9ff1ba4ce83afdfb326fb68b00997f93277d3fd4c606fd61b5c5484bed92d369','hex');
    
    //     rawTx  
    tx.sign(privateKey);
    
    //      
    var serializedTx = tx.serialize();
    //            
    console.log(serializedTx.toString('hex'));
    
    /**(3)       */
    //             hash 
    web3.eth.sendRawTransaction('0x' + serializedTx.toString('hex'), function(err,hash) {
            if (!err) {
                    console.log(hash);
            } else {
                    console.log(err);
            }
    });
    

    実行に成功すると、コンソールは署名後の取引情報と取引送信に成功した取引hash値を返す.
    f867808082c20a94b4f58a932a1cadf638f8e0eafce9bda71144c56e880de0b6b3a7640000801ba04538ca57dd5b47173e58a4fe6868408ddeb2e6832524517c423e9e421e4bb736a01b4cd69f9519549bcf53b87edb364958aed0846194ee820fbf34affa7bf20445
    0x9b1ef283db7211968b76520466942ae417cc1ac18ec761202a01065e71c768a3
    

    3.呼び出し契約
    エーテル坊では、スマート契約の関数を取引で呼び出すことができます.まず、使用する契約のみを記述します.
    pragma solidity >=0.4.21 <0.6.0;
    
    contract Storage {
    
        uint256 public storedData;
    
        function set(uint256 data) public {
            storedData = data;
        }
    
        function get() public returns (uint256) {
            return storedData;
        }
    }
    

    その後、契約をイーサー坊ネットワークに導入し、契約の導入に成功すると、3つの重要なものが得られます.
    (1).契約住所:「0 xb 69 ff 7 afae 8 e 014 f 76 a 4 ad 1 a 693076 f 9197620 f 8」
    (2).契約のインタフェース記述ファイル:
    abi: [{
          constant: true,
          inputs: [],
          name: "storedData",
          outputs: [{...}],
          payable: false,
          stateMutability: "view",
          type: "function"
      }, {
          constant: false,
          inputs: [{...}],
          name: "set",
          outputs: [],
          payable: false,
          stateMutability: "nonpayable",
          type: "function"
      }, {
          constant: true,
          inputs: [],
          name: "get",
          outputs: [{...}],
          payable: false,
          stateMutability: "view",
          type: "function"
      }]

    (3).契約の署名、契約関数の取得方法は以下の通りです.
    //    get()    sha3   ,   0x     8 
    > var get_func_sign = web3.sha3('get()').substr(2,8);
    //    set(uint256)    sha3   ,   0x     8 
    > var set_func_sign = web3.sha3('set(uint256)').substr(2,8);
    
    //      
    > set_func_sign
    "60fe47b1"
    > get_func_sign
    "6d4ce63c"
    

    契約を呼び出すには、次の2つの方法があります.
  • 契約アドレスと契約インタフェース記述ファイルを介して.
  • は、呼び出された契約の関数署名を契約アドレスに付加する.

  • ここでは、getメソッドを呼び出すトランザクションを最初に構築する2つ目の方法について説明します.
    var tx_get = {
        "from": "0x8c7ae59ab7e5d510ae3f09a9544978f50315b5f5",
        "to": "0xb69ff7afae8e014f76a4ad1a693076f9197620f8",
        "data": "0x" + "6d4ce63c" + "0000000000000000000000000000000000000000000000000000000000000000"
    };
  • from:取引開始者アドレス.
  • to:契約住所.
  • data:契約に伝達されるパラメータは、0 x、6 d 4 ce 63 c、およびパラメータ0000000000000000000000000000000000000000000000000000000000000000000000000000000000000からなり、getメソッドを呼び出すにはパラメータを伝達する必要がないため、ここでは伝達されるのは0です.

  • 取引の実行:
    > var result = web3.eth.call(tx_get);
    undefined
    > console.info(result);
    0x

    storedDataに値が設定されていないため、実行が完了すると0が返されます.したがって、setメソッドを呼び出してstoredDataに値を設定する必要があります.まず、setメソッドのトランザクションを構築し、set関数の入力値を1に設定する必要があります.
    var tx_set = {
        "from": "0x8c7ae59ab7e5d510ae3f09a9544978f50315b5f5",
        "to": "0xb69ff7afae8e014f76a4ad1a693076f9197620f8",
        "gaslimit": web3.toHex("50000"),
        "data": "0x" + "60fe47b1" + "0000000000000000000000000000000000000000000000000000000000000001"
    };
    //    ,(      、  )    hash
    > var txId = web3.eth.sendTransaction(tx_set);
    > txId
    "0xb20213f7e852a619a81abe0019da3c998ea84ac94953443b5afb6903044584a7"
    > var result = web3.eth.call(tx_get);
    console.info(result);
    //         1