以太坊教程- Web3.js 開發基礎
簡介
web3.js 是一個通過RPC 呼叫 和本地以太坊節點進行通訊的js庫。web3.js可以與任何暴露了RPC介面的以太坊節點連線。
web3中提供了eth物件 - web3.eth來與以太坊區塊鏈進行互動。
安裝 Testrpc
安裝Ethereum客戶端來支援JSON RPC API呼叫開發環境,推薦使用EthereumJS。
安裝命令:
sudo npm install -g ethereumjs-testrpc
啟動 testrpc
在命令列執行
testrpc EthereumJS TestRPC v6.0.3 (ganache-core: 2.0.2) Available Accounts ================== (0) 0x1abb473c627e690c048dbf7a9f9cc54b25dea42a (1) 0xd50fadba656c8f78916f9c1a1b78fd3d35dad0aa (2) 0x69e0159cf8e6fc81e8e71479aea0e8984d7daf48 (3) 0x5f1ebce982445a02ff4530f4d53cd09cb2a6addf (4) 0x746f6a0192cf42001ded53a55932a6dff754e143 (5) 0x685dcca08e5efc905a300eff68bf2e8a81989966 (6) 0x08eed3a1a801be6af543105cb9bfc27b6401c020 (7) 0xc8fd99bde94fbfab654c8cffda6047b16306cc07 (8) 0xc28e0b677883f809faa1eaf563a5f4b794dcbaeb (9) 0xd02b16bbaa70b2cba4ea173009f2fdf829a8ffba Private Keys ================== (0) d233ec4635ed0fe5c61977c9442d6233c599cd3591107b9a017f7ea6077da3bc (1) a02a88b2c04aed72b55cdd6f6212e1f560dd02767f0a03627fac97b64b64086d (2) 833dd28ab15388ba162862c365313978dabb96d209c311bca7d9a7bfdb2ecb6f (3) 47c7ae2635fed1b4f5e442496fd364cdaa91ae6e950b45f36aa4ac6c172cffb5 (4) 4b8ee2ee44eab299cbeff51bbf6fb74572e493409556e728a385dcf9e4dc4f84 (5) 50cdb8a14babddcbb79f14ad7b5cc55e95a0b8ce72659eec1c9b8d798ff52369 (6) becc6dd7a41564aaf3f2f1711eb102032ace0c4e4b561fc7c922ea92f1a81c5a (7) cc82c2ad095b32bd23e33bc9c3ef6b69ad8b76de07a9e02714760d2fd843efa5 (8) 44f9c35f62ffe1aa3b85bb6e557569beb396ced7d5ab8a75345d9a8ab1283bca (9) 3d7ec84ed3253366f744a754ccdc2187d65856c2b264e9fbd651c59896aac229 HD Wallet ================== Mnemonic: tilt oyster obtain car venture party power exclude fire price senior blue Base HD Path: m/44'/60'/0'/0/{account_index} Listening on localhost:8545
會自動建立10個賬戶,每個賬戶預設有100個以太幣。
安裝和和獲取web3物件
安裝
npm: npm install web3
bower: bower install web3
metor: meteor add ethereum:web3
vanilla: dist./web3.min.js
獲得web3例項
if (typeof web3 !== 'undefined') { web3 = new Web3(web3.currentProvider); } else { // set the provider you want from Web3.providers web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); }
使用例項
一、賬戶操作:
獲取賬戶
web3.eth.getAccounts(function(error, result){
res.send(result)
})
建立新賬戶
web3.eth.accounts.create();
> {
address: "0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01",
privateKey: "0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709",
signTransaction: function(tx){...},
sign: function(data){...},
encrypt: function(password){...}
}
web3.eth.accounts.create(' [email protected]#@#@±±±±!!!!678543213456764321§34567543213456785432134567');
> {
address: "0xF2CD2AA0c7926743B1D4310b2BC984a0a453c3d4",
privateKey: "0xd7325de5c2c1cf0009fac77d3d04a9c004b038883446b065871bc3e831dcd098",
signTransaction: function(tx){...},
sign: function(data){...},
encrypt: function(password){...}
}
web3.eth.accounts.create(web3.utils.randomHex(32));
> {
address: "0xe78150FaCD36E8EB00291e251424a0515AA1FF05",
privateKey: "0xcc505ee6067fba3f6fc2050643379e190e087aeffe5d958ab9f2f3ed3800fa4e",
signTransaction: function(tx){...},
sign: function(data){...},
encrypt: function(password){...}
}
使用私鑰建立賬戶
web3.eth.accounts.privateKeyToAccount(privateKey);
web3.eth.accounts.privateKeyToAccount('0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709');
> {
address: '0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01',
privateKey: '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709',
signTransaction: function(tx){...},
sign: function(data){...},
encrypt: function(password){...}
}
web3.eth.accounts.privateKeyToAccount('0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709');
> {
address: '0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01',
privateKey: '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709',
signTransaction: function(tx){...},
sign: function(data){...},
encrypt: function(password){...}
}
使用私鑰簽名一個交易
web3.eth.accounts.signTransaction(tx, privateKey [, callback]);
web3.eth.accounts.signTransaction({
to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55',
value: '1000000000',
gas: 2000000
}, '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318')
.then(console.log);
> {
messageHash: '0x88cfbd7e51c7a40540b233cf68b62ad1df3e92462f1c6018d6d67eae0f3b08f5',
v: '0x25',
r: '0xc9cf86333bcb065d140032ecaab5d9281bde80f21b9687b3e94161de42d51895',
s: '0x727a108a0b8d101465414033c3f705a9c7b826e596766046ee1183dbc8aeaa68',
rawTransaction: '0xf869808504e3b29200831e848094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca008025a0c9cf86333bcb065d140032ecaab5d9281bde80f21b9687b3e94161de42d51895a0727a108a0b8d101465414033c3f705a9c7b826e596766046ee1183dbc8aeaa68'
}
web3.eth.accounts.signTransaction({
to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55',
value: '1000000000',
gas: 2000000,
gasPrice: '234567897654321',
nonce: 0,
chainId: 1
}, '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318')
.then(console.log);
> {
messageHash: '0x6893a6ee8df79b0f5d64a180cd1ef35d030f3e296a5361cf04d02ce720d32ec5',
r: '0x9ebb6ca057a0535d6186462bc0b465b561c94a295bdb0621fc19208ab149a9c',
s: '0x440ffd775ce91a833ab410777204d5341a6f9fa91216a6f3ee2c051fea6a0428',
v: '0x25',
rawTransaction: '0xf86a8086d55698372431831e848094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca008025a009ebb6ca057a0535d6186462bc0b465b561c94a295bdb0621fc19208ab149a9ca0440ffd775ce91a833ab410777204d5341a6f9fa91216a6f3ee2c051fea6a0428'
}
雜湊一個訊息
web3.eth.accounts.hashMessage(message);
web3.eth.accounts.hashMessage("Hello World")
> "0xa1de988600a42c4b4ab089b619297c17d53cffae5d5120d82d8a92d0bb3b78f2"
// the below results in the same hash
web3.eth.accounts.hashMessage(web3.utils.utf8ToHex("Hello World"))
> "0xa1de988600a42c4b4ab089b619297c17d53cffae5d5120d82d8a92d0bb3b78f2"
sign 給任意一個內容使用私鑰簽名
web3.eth.accounts.sign(data, privateKey);
web3.eth.accounts.sign('Some data', '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318');
> {
message: 'Some data',
messageHash: '0x1da44b586eb0729ff70a73c326926f6ed5a25f5b056e7f47fbc6e58d86871655',
v: '0x1c',
r: '0xb91467e570a6466aa9e9876cbcd013baba02900b8979d43fe208a4a4f339f5fd',
s: '0x6007e74cd82e037b800186422fc2da167c747ef045e5d18a5f5d4300f8e1a029',
signature: '0xb91467e570a6466aa9e9876cbcd013baba02900b8979d43fe208a4a4f339f5fd6007e74cd82e037b800186422fc2da167c747ef045e5d18a5f5d4300f8e1a0291c'
}
使用web3.eth.personal 新建賬戶
web3.eth.personal.newAccount(password, [callback])
web3.eth.personal.newAccount('[email protected]')
.then(console.log);
> '0x1234567891011121314151617181920212223456'
獲得賬戶餘額
web3.eth.getBalance('0xe70c4835b29e2fd35bd3f60c0a76413f70f17115').then(function(balance){
console.log('balance:',balance)
balance = new BigNumber(balance)
console.log('balance:',balance)
})
這裡使用了BigNumber.js 處理餘額顯示,參考我另一片博文。
utils工具函式
#####web3.utils.toHex 將任何值轉為HEX 16進位制
String|Number|Object|Array|BigNumber - 需要轉化為HEX的值。如果是一個物件或陣列型別,將會先用JSON.stringify1進行轉換成字串。如果傳入的是BigNumber2,則將得到對應的Number的HEX
var str = "abcABC";
var obj = {abc: 'ABC'};
var bignumber = new BigNumber('12345678901234567890');
var hstr = web3.utils.toHex(str);
var hobj = web3.utils.toHex(obj);
var hbg = web3.utils.toHex(bignumber);
console.log("Hex of Sring:" + hstr);
console.log("Hex of Object:" + hobj);
console.log("Hex of BigNumber:" + hbg);
web3.utils.isHex(hex) 判斷輸入是不是16進位制
web3.utils.isHex('0xc1912');
判斷輸入是不是一個地址
web3.utils.isAddress('0xc1912fee45d61c87cc5ea59dae31190fffff232d');
把金額單位換成wei
web3.utils.toWei(number [, unit])
web3.utils.toWei('1', 'ether');
> "1000000000000000000"
web3.utils.toWei('1', 'finney');
> "1000000000000000"
web3.utils.toWei('1', 'szabo');
> "1000000000000"
web3.utils.toWei('1', 'shannon');
/> "1000000000"
把單位為wei的以太幣換成 ether
web3.utils.fromWei(number [, unit])
web3.utils.fromWei('1', 'ether');
> "0.000000000000000001"
web3.utils.fromWei('1', 'finney');
> "0.000000000000001"
web3.utils.fromWei('1', 'szabo');
> "0.000000000001"
web3.utils.fromWei('1', 'shannon');
> "0.000000001"
判斷給定的資料是否是 BigNumber
web3.utils.isBigNumber(bignumber)
var number = new BigNumber(10);
web3.utils.isBigNumber(number);
sha3演算法
// web3.utils.sha3(string)
// web3.utils.keccak256(string) // ALIAS
web3.utils.sha3('234'); // taken as string
> "0xc1912fee45d61c87cc5ea59dae311904cd86b84fee17cc96966216f811ce6a79"
web3.utils.sha3(new BN('234'));
> "0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a"
web3.utils.sha3(234);
> null // can't calculate the has of a number
web3.utils.sha3(0xea); // same as above, just the HEX representation of the number
> null
web3.utils.sha3('0xea'); // will be converted to a byte array first, and then hashed
> "0x2f20677459120677484f7104c76deb6846a2c071f9b3152c103bb12cd54d1a4a"