Web3js
web3.js 從 .json 文件導入合約 abi
所以我有一個帶有地址0的已部署契約。我可以使用我的 index.html 輕鬆地與它互動,如下所示:
import contract_artifacts from '../../build/contracts/contract.json' var contract0 = contract(contract_artifacts);
然後我可以這樣稱呼它的功能:
contract0.deployed().then(function(something){});
但我還有另一個先前部署的帶有 address1 的契約。合約與地址0的合約相同。我只看到一種使用契約的方法1:
var abiarray = [ here goes pretty big abi ]; contract1 = web3.eth.contract(abiarray).at(address1);
在不包括契約的整個 abi 的情況下,是否有另一種方法可以做到這一點?因為我已經在 contract_artifacts 中有它,所以我只是不知道如何從那裡得到它。謝謝你。
我知道這個問題很老,但是我對此有一些問題,所以我會分享對我有幫助的東西。
要從 JSON 文件導入 ABI,您可以使用以下程式碼(假設您已經擁有 web3 對象):
var fs = require('fs'); var jsonFile = "pathToYourJSONFile/project.json"; var parsed= JSON.parse(fs.readFileSync(jsonFile)); var abi = parsed.abi; var YourContract= new web3.eth.Contract(abi, 0x12345678912345678912345678912345678912);
您可以在此處閱讀更多相關資訊:https ://web3js.readthedocs.io/en/1.0/web3-eth-contract.html
更新 01/2020:從 Typescript 2.9 開始,直接支持讀取 JSON 文件。因此,如果您嘗試從 Typescript 項目(Angular、React、…)中獲取 ABI 或字節碼,只需轉到您的 tsconfig.json 並設置:
{ "compilerOptions": { "resolveJsonModule": true, "esModuleInterop": true } }
然後,您可以使用
import ContractName from 'path/to/contract/ContractName.json'
導入您的契約並使用ContractName.abi
.乾杯
我使用 require 函式來導入 JSON 文件。
import Web3 from 'web3'; const web3 = new Web3(window.web3.currentProvider); const { abi } = require('./smart_contract_after_compilation_step.json'); var smart_contract_interface = new web3.eth.Contract(abi, '0x5E54780072f1998FB85c3203D9697ef9E3F82DF0')