web3.js – 智能合約的互動
我們今天就來練習 web3.eth.Contract() 相關函式的實作吧!
智能合約的互動是javascript中對智能合約的表示,可以使用智能合約對象訪問智能合約。
可以使用web3.eth.Contract()的函數來獲得,此函數需要2个參數: 智能合約ABI、智能合約地址。
ABI代表“Abstract Binary Interface/抽象二進位制接口”,它是一個JSON數組,是面向以太坊虛擬機的可執行文件,類似於windows平台上的二進位制可執行的文件。智能合约編譯後生成ABI文件,可以在以太坊虛擬機上執行。
首先我們一樣先去 Etherscan 取得ABI的範例,選擇有ERC-20標準,我們就挑第三個BNB好了!
點進下方Contract的地方(有綠勾勾的),複製它的API:
你可以在Etherscan上,找到關於這個tocken更加詳細的資訊,其內容包含它的ABI及地址。我們將在下面這個範例的其他部分中使用這個智能合約ABI。
const abi = 你複製的ABI
大概是像下圖這種感覺,但因為ABI太長,後面就不截圖了
打完後面你再輸入abi的話,會看到其他更詳細的資訊
BNB認證智能合約的地址:
const address = '0xB8c77482e45F1F44dE1745F52C74426C631bDD52'
有了ABI和地址,就可以建立BNB認證智能合約的Javascript對象:
const contract = new web3.eth.Contract(abi, address)
智能合約的methods屬性下,包含了對應智能合約的所有函數。要用智能合約中的某个函數,例如myFunction(),可以使用contract.methods.myFunction()的方式调用。
注意:這裡的方法只能用來讀取操作函數,不能用來寫操作函數,寫操作函數會改變區塊鏈狀態,而被視為交易。
由於這個智能合約是ERC-20標準,
可以用:totalSupply()、name()、symbol()和balanceOf()。
可以調用這些函數,如下所示:
查看現有BNB總供應量:
contract.methods.totalSupply().call((err, result) => { console.log(result) })
// > 16579517055253348798759097
查看BNB的名稱:
contract.methods.name().call((err, result) => { console.log(result) })
// > BNB
查看BNB的標誌:
contract.methods.symbol().call((err, result) => { console.log(result) })
// > BNB
查看给定帳戶的餘額
查看一下地址0xB8c77482e45F1F44dE1745F52C74426C631bDD52的BNB餘額情况。
contract.methods.balanceOf('0xB8c77482e45F1F44dE1745F52C74426C631bDD52').call((err, result) => { console.log(result) })
// > 23528169876785489362031
教學影片:https://youtu.be/tu92jcqdn6s
官網:https://web3js.readthedocs.io/en/v1.8.0/web3-eth-contract.html