92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

智能合約 web3.js ABI Address三者的關系

2021-9-24    前端達人

web3.js是以太坊提供的一個Javascript庫,它封裝了以太坊的JSON RPC API,提供了一系列與區塊鏈交互的Javascript對象和函數,包括查看網絡狀態,查看本地賬戶、查看交易和區塊、發送交易、編譯/部署智能合約、調用智能合約等,其中最重要的就是與智能合約交互的API。

下面就介紹如何使用web3.js提供的接口調用智能合約。

系統和軟件


  1. Ubuntu 16.04 64
  2. nodejs 6.10.0
  3. npm 3.10.10

示例合約

本文以下面的MetaCoin合約為例,說明在應用中使用web3.js操作智能合約的方法。


  1. // 本文中用到的MetaCoin合約
  2. pragma solidity ^0.4.2;
  3. contract MetaCoin {
  4. mapping (address => uint) balances;
  5. event Transfer(address indexed _from, address indexed _to, uint256 _value);
  6. function MetaCoin() {
  7. balances[tx.origin] = 10000;
  8. }
  9. function sendCoin(address receiver, uint amount) returns(bool sufficient) {
  10. if (balances[msg.sender] < amount) return false;
  11. balances[msg.sender] -= amount;
  12. balances[receiver] += amount;
  13. Transfer(msg.sender, receiver, amount);
  14. return true;
  15. }
  16. function getBalance(address addr) returns(uint) {
  17. return balances[addr];
  18. }
  19. }

這個合約有三個函數:

MetaCoin:構造函數,在合約被部署到區塊鏈時執行 
getBalance:返回某賬戶的余額,它只讀數據,不會修改數據 
sendCoin:向另一個賬戶發送指定數量的MetaCoin,它會改變狀態變量balances 
啟動一個以太坊節點,將上面的合約部署到區塊鏈中,并記錄下合約的地址,可以通過truffle部署,具體參考這篇文章。 接下來就可以按照下面的步驟在項目中通過web3.js來使用這個合約。

添加web3到項目中

首先新建一個Nodejs項目并初始化:


  1. $ mkdir web3test && cd web3test
  2. $ npm init

會提示輸入項目信息,全部默認即可。 
接下來下載web3.js到項目中:

$ npm install web3 --save 
  • 1
  • 2

以上命令會將web3.js下載到web3test/node_modules目錄下,其中–save參數會web3.js添加到package.json配置文件中。

創建web3對象

要使用web3.js與區塊鏈交互,需要先創建web3對象,然后連接到以太坊節點。 在web3test目錄下新建index.js文件,在其中輸入以下代碼:


  1. var Web3 = require("web3");
  2. // 創建web3對象
  3. var web3 = new Web3();
  4. // 連接到以太坊節點
  5. web3.setProvider(new Web3.providers.HttpProvider("http://localhost:8545"));

獲取已部署的合約實例

要使用智能合約,必須先從區塊鏈中獲取到合約實例,獲取合約實例需要合約的ABI和合約的地址:


  1. // 合約ABI
  2. var abi = [{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"amount","type":"uint256"}],"name":"sendCoin","outputs":[{"name":"sufficient","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"}];
  3. // 合約地址
  4. var address = "0xb2cdd356e58280906ce53e1665697b50f88aac56";
  5. // 通過ABI和地址獲取已部署的合約對象
  6. var metacoin = web3.eth.contract(abi).at(address);

metacoin就是獲取到的合約對象實例,此時metacoin對象中就包含了與合約函數同名的Javascript函數,之后就可以通過metacoin對象來調用合約中的函數了。

調用合約函數

MetaCoin合約中有兩個函數:getBalance和sendCoin,可以通過metacoin對象直接調用這兩個函數。

首先來看getBalance,由于getBalance函數只是從區塊鏈中讀數據,而不修改數據,因此我們通過在getBalance后面加上.call()的方式調用:


  1. var account_one = web3.eth.accounts[0];
  2. var account_one_balance = metacoin.getBalance.call(account_one);
  3. console.log("account one balance: ", account_one_balance.toNumber());

這里:

在getBalance后加上.call()來顯式指明用call的方式調用 
通過call的方式調用可以得到getBalance函數的返回值 
通過call的方式調用的函數只在節點本地虛擬機中執行,不會產生交易,不會花費費用,不會修改數據 
下面來看sendCoin函數,由于sendCoin要修改合約內部的數據,所以要使sendCoin生效,必須要向區塊鏈發送交易,可以在sendCoin后面加上.sendTransaction()來指明這是一筆交易:


  1. var account_one = web3.eth.accounts[0];
  2. var account_two = web3.eth.accounts[1];
  3. // 提交交易到區塊鏈,會立即返回交易hash,但是交易要等到被礦工收錄到區塊中后才生效
  4. var txhash = metacoin.sendCoin.sendTransaction(account_two, 100, {from:account_one});
  5. console.log(txhash);

這里:

在sendCoin函數后加上.sendTransaction()指明要向區塊鏈發送交易 
合約代碼中sendCoin函數只有兩個參數,而在web3中通過.sendTransaction()調用合約函數的時候需要增加最后一個參數,它是一個javascript對象,里面可以指定from/value/gas等屬性,上面的例子用from來指定交易的發送者 
上面的調用語句執行后,會向區塊鏈提交一筆交易,這筆交易的發送者是account_one,接收者是metacoin的地址,交易的作用是以account_two和100作為參數執行合約的sendCoin函數 
函數會立即返回交易的hash,表明交易已經提交到區塊鏈,但是并不知道交易何時處理完成,交易要等到被曠工收錄到區塊中后才會生效 
監聽合約事件

當通過.sendTransaction()調用合約的時候,交易會被提交到區塊鏈進行處理,這個處理需要一定的時間,如果需要等交易完成之后再執行其他操作,就必須要知道交易何時完成,那么如何知道交易何時完成呢?可以通過監聽合約事件來實現。

在合約中可以定義事件,事件可以帶有參數,在合約函數內部完成某些操作時,可以觸發事件,向外界傳達一些信息。例如,在MetaCoin合約中定義了一個事件叫做Transfer,表示一個轉賬的事件,它帶有三個參數:交易的發送者、接受者、轉賬數量。在sendCoin函數中,轉賬成功后就會觸發Transfer事件,將對應的參數傳給該事件,這樣外部監聽到事件后,可以取出事件的參數來獲得交易發送者、接收者、數量。同時事件中還帶有其他信息,比如交易hash等。

在web3中使用事件,要首先獲取事件對象,然后監聽事件,如果事件發生,就會在回調函數中獲取到事件信息:


  1. // 獲取事件對象
  2. var myEvent = metacoin.Transfer();
  3. // 監聽事件,監聽到事件后會執行回調函數
  4. myEvent.watch(function(err, result) {
  5. if (!err) {
  6. console.log(result);
  7. } else {
  8. console.log(err);
  9. }
  10. myEvent.stopWatching();
  11. });
  12. // 輸出:
  13. { address: '0xb2cdd356e58280906ce53e1665697b50f88aac56',
  14. blockNumber: 651,
  15. transactionIndex: 0,
  16. transactionHash: '0xcc71bc2824cc84d1ee831c46189e3a80cf0af05697ba0370693aa97390c8067b',
  17. blockHash: '0x1d53f04206f3926d0f311b1230a9dd0b0c5aadac35b169a6a609e384ab130c6f',
  18. logIndex: 0,
  19. removed: false,
  20. event: 'Transfer',
  21. args:
  22. { _from: '0x68b73956d704007514e9257813bdc58cdf3c969a',
  23. _to: '0x9c3c1a2f5ef913fac44f0348a78f68d835f3f26e',
  24. _value: { [String: '100'] s: 1, e: 2, c: [Object] } } }


從輸出可以看出,獲取到的事件信息包括事件的參數、事件名、區塊號、交易hash等。

通過檢測事件中的transactionHash與調用合約函數返回的交易hash是否一致,可以判定某一筆交易是否已完成:


  1. var account_one = web3.eth.accounts[0];
  2. var account_two = web3.eth.accounts[1];
  3. var account_one_balance = metacoin.getBalance.call(account_one);
  4. console.log("account one balance:", account_one_balance.toNumber());
  5. var txhash = metacoin.sendCoin.sendTransaction(account_two, 100, { from: account_one });
  6. var myEvent = metacoin.Transfer();
  7. myEvent.watch(function (err, result) {
  8. if (!err) {
  9. if (result.transactionHash == txhash) {
  10. var account_one_balance = metacoin.getBalance.call(account_one);
  11. console.log("account one balance after sendCoin:", account_one_balance.toNumber());
  12. }
  13. } else {
  14. console.log(err);
  15. }
  16. myEvent.stopWatching();
  17. });
  18. // 輸出:
  19. account one balance: 7000
  20. account one balance after sendCoin: 6900


watch中的回調函數如果被執行,說明事件已被觸發,也就是說某筆交易已經處理完,檢查交易hash是否一致,可以判定產生這個事件的交易是否是自己發送的交易,如果是,就可以進行其他操作,比如查詢最新的余額


藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼藍小助,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

分享此文一切功德,皆悉回向給文章原作者及眾讀者.

轉自:csdn
免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務


日歷

鏈接

個人資料

藍藍設計的小編 http://m.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
久久久久久国产精品| 日韩av电影免费观看高清完整版| 久久久久久久综合狠狠综合| 91女人视频在线观看| 天天综合天天综合色| 日韩视频一区在线| 欧美aaa视频| 国产九色在线| 国产伦精品一区二区三区视频免费| 免费在线国产视频| 欧美日韩中文国产一区发布| 色一情一伦一子一伦一区| 亚洲最新av| 91传媒视频在线观看| 天堂va蜜桃一区二区三区漫画版| 婷婷精品在线观看| 91精品国产自产观看在线| 在线精品视频在线观看高清| 相泽南亚洲一区二区在线播放| 在线视频免费一区二区| 日韩久久一区二区三区| 亚洲免费高清| 91丨porny丨国产入口| 欧美日韩亚洲一区二区| 天堂中文最新版在线中文| 亚洲视频每日更新| 你懂的一区二区三区| 69久久夜色精品国产69蝌蚪网| 激情视频在线观看一区二区三区| 久久99国产精一区二区三区| 四虎影视4hu4虎成人| 麻豆网站视频在线观看| 久久女同互慰一区二区三区| 在线日韩欧美视频| 亚洲性线免费观看视频成熟| 亚洲91视频| 国产精品视频免费观看| 国产精品国产福利国产秒拍| 国产精品亚洲片夜色在线| 麻豆福利在线观看| 欧美一区三区| 天堂资源在线亚洲资源| 激情欧美一区| 97精品在线视频| 9999国产精品| 成人免费在线播放| 亚洲国产一区在线| 国产成人a级片| 日本久久久久久久久| 欧美gay囗交囗交| 精品日韩美女的视频高清| 国产**成人网毛片九色| 国产精品三级久久久久久电影| 午夜视频精品| www.91在线| 久久久精品免费| 国产午夜精品一区二区三区欧美| 多野结衣av一区| 7777精品久久久久久| 日韩视频一区二区| 国产欧美va欧美va香蕉在线| 天堂俺去俺来也www久久婷婷| 91成人噜噜噜在线播放| 久久久久久久久久久国产| 欧美激情免费看| av男人的天堂在线观看| 免费日韩av电影| 亚洲午夜精品久久久久久久久久久久| 国产精品免费视频观看| 噜噜噜躁狠狠躁狠狠精品视频| 欧美女孩性生活视频| 视频一区二区三区在线观看| 久久综合网色—综合色88| 欧美激情在线免费| 五月天婷婷在线视频| 日本精品免费一区二区三区| 国产在线精品国自产拍免费| 欧洲激情一区二区| 乱人伦精品视频在线观看| 五月婷婷久久综合| 精品国产999| 久久99精品国产麻豆婷婷| 夜夜躁日日躁狠狠久久88av| 欧美日韩精品一区二区视频| 国产亚洲综合久久| 精品少妇一区二区三区在线视频| 欧美日韩精品一区二区天天拍小说| 精品久久久久久久久久ntr影视| 国产精品高清在线观看| 国产精品第七影院| 国产精品传媒毛片三区| 亚洲日产av中文字幕| chinese偷拍一区二区三区| 91激情在线视频| 欧美第一区第二区| 一本色道久久88亚洲综合88| 五月天欧美精品| 一区二区三区日本视频| 欧美不卡在线一区二区三区| 国产精品对白久久久久粗| 亚洲国产欧美在线成人app| 国产精品专区一| 亚洲永久精品唐人导航网址| 日本久久久久| 国产视频一区二| xvideos成人免费中文版| 欧美日韩一区二区国产| 日韩久久精品| 成人日批视频| 欧美午夜电影在线播放| 一区免费观看视频| 精品亚洲一区二区三区在线观看| 亚洲人体在线| 亚洲精品高清视频| 久热爱精品视频线路一| 久久99久久99精品免视看婷婷| 91精品国产综合久久福利软件| 亚洲欧洲精品在线观看| 欧美成人一级| 成年人视频在线看| 啪一啪鲁一鲁2019在线视频| 亚洲精品视频一二三区| 91精品天堂福利在线观看| 成人精品动漫| av色综合久久天堂av色综合在| 精品国产乱码久久久久久郑州公司| 性欧美xxxx大乳国产app| 免费99视频| 26uuu亚洲电影在线观看| 国产精品电影一区| 国产精品视频免费一区二区三区| 欧美二级三级| 亚洲成av人片一区二区三区| 国产精品777| 亚洲精品综合久久中文字幕| 日韩美女视频19| 青青热久免费精品视频在线18| 成人av网在线| 99热国内精品| 国产精品.xx视频.xxtv| 亚洲第一精品夜夜躁人人爽| 亚洲人和日本人hd| 色94色欧美sute亚洲13| 欧美福利视频导航| 久久亚洲精品小早川怜子| 日韩高清国产精品| 午夜视频一区在线观看| www.欧美| 国产午夜精品全部视频在线播放| 成人免费在线视频| 春色成人在线视频| 99精品国产在热久久婷婷| 国产欧美精品一区aⅴ影院| 欧美日韩电影在线播放| 亚洲黄色免费电影| 日韩精品中文字幕一区二区三区| 国产女同性恋一区二区| 亚洲精品系列| 日韩系列在线| 风间由美性色一区二区三区| 凹凸成人在线| 欧美综合国产| 久久激情久久| av电影在线观看一区二区三区|