以太坊学习路线——(二、下)以太坊プログラミングインターフェース:web 3.js
このブログのプレゼンテーションの基本的なオペレーティングシステム環境はCentOS 7で、参考書:以太坊開発実戦--以太坊の肝心な技術と実例分析第6章(呉寿鶴、馮翔、劉濤、周広益著).本博文関連プログラムを実行するには、エーテル坊のプライベートチェーンを構築し、testrpcをインストールする必要があります.
文書構造:
一.Web 3のインストールと起動js
二.アカウント関連API
1.利用可能なすべてのアカウントの表示
2.口座残高の表示
三、取引関連API
1.口座間振込取引
2.署名された振込取引を送信する
3.呼び出し契約
まず、testrpcを1つの端末で実行してテストチェーンを起動し、別の端末で関連jsファイルを作成します.ここではtestを書きます.jsファイルは次のとおりです.
1.利用可能なすべてのアカウントの表示
2.口座残高の表示
イーサー坊の2つの口座間の振り替え操作は、時1つの取引とすることができ、スマート契約を呼び出す関数も時1つの取引とすることができる.
1.口座間振込取引
振り替えの前に取引にどれだけのgasを設定する必要があるか分からない場合は、次の文で、今回の取引で消費されるgasを推定することができます.
一般的に簡単な振り替え取引は通常21000 gasかかり、gasを得ると振り替え取引を構築することができます.振込取引の構成部分: from:トランザクションはこのアドレスを送信し、このトランザクションは最後にfromの秘密鍵署名が必要です. to:この振替の宛先を受信します. value:wei単位でこの取引の振り替えを受信します. gas:この取引で使用可能なgasは、未使用のgasが返されます. gasPrice:この取引に追加されたgas価格は、デフォルトではネットワークgas価格の平均値です.
2.署名された振込取引を送信する
上記の取引を開始したアカウントは、私たちが接続しているイーサ坊ノードに格納されています.もし私たちが自分でアカウントを持っていて、このアカウントが私たちが接続しているイーサ坊ノードに格納されていない場合は、web 3を通過する必要があります.eth.sendRawTransactionメソッドは、トランザクションの署名と送信を完了します.
後の操作で、作成したばかりのトランザクションrawTxに署名するには、別のライブラリを使用する必要があります.
testを作成します.jsは、次のような内容を編集し、完了後test.js同じディレクトリの下でnode testを実行する.jsは実行をロードします.
実行に成功すると、コンソールは署名後の取引情報と取引送信に成功した取引hash値を返す.
3.呼び出し契約
エーテル坊では、スマート契約の関数を取引で呼び出すことができます.まず、使用する契約のみを記述します.
その後、契約をイーサー坊ネットワークに導入し、契約の導入に成功すると、3つの重要なものが得られます.
(1).契約住所:「0 xb 69 ff 7 afae 8 e 014 f 76 a 4 ad 1 a 693076 f 9197620 f 8」
(2).契約のインタフェース記述ファイル:
(3).契約の署名、契約関数の取得方法は以下の通りです.
契約を呼び出すには、次の2つの方法があります.契約アドレスと契約インタフェース記述ファイルを介して. は、呼び出された契約の関数署名を契約アドレスに付加する.
ここでは、getメソッドを呼び出すトランザクションを最初に構築する2つ目の方法について説明します. from:取引開始者アドレス. to:契約住所. data:契約に伝達されるパラメータは、0 x、6 d 4 ce 63 c、およびパラメータ0000000000000000000000000000000000000000000000000000000000000000000000000000000000000からなり、getメソッドを呼び出すにはパラメータを伝達する必要がないため、ここでは伝達されるのは0です.
取引の実行:
storedDataに値が設定されていないため、実行が完了すると0が返されます.したがって、setメソッドを呼び出してstoredDataに値を設定する必要があります.まず、setメソッドのトランザクションを構築し、set関数の入力値を1に設定する必要があります.
文書構造:
一.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を得ると振り替え取引を構築することができます.振込取引の構成部分:
//
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"
};
取引の実行:
> 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