Solidity
以程式方式獲取智能合約 ABI 和字節碼
我有 ERC20 進口契約,而 solc 無法編譯進口契約。我已經嘗試過
truffle compile
,它工作正常並生成 ABI。我想通過以程式方式編譯它(不使用終端)來獲取智能合約文件 ABI。最好的方法是什麼?
有 Truffle 和 Hardhat 之類的工具,但有時它們可能對 solc 版本很挑剔。
有主要的 npm 包“solc”。您可以像任何其他節點包一樣在本地安裝它。然後編寫一個使用包特性的 .js 腳本,如下所示:
const path = require("path"); const fs = require("fs"); const solc = require("solc"); const contractPath = path.resolve(__dirname, "contracts", "MyContract.sol"); const source = fs.readFileSync(contractPath, "utf8"); let compileOutput = solc.compile(source, 1)
我包含了“路徑”變數,以向您展示 Solidity 文件可以儲存在任何地方;在這種情況下,根據程式碼,它們應該位於一個名為“contracts”的文件夾中,與您執行此 javascript 的級別相同。
|-- contracts/ \-- MyContract.sol compile.js
**重要提示:**我相信,Solidity 經常發生變化,並且被 solc.compile() 函式轉儲的對象“compileOutput”的結構也發生了變化。但是,它應該包含一個“契約”鍵,允許您檢索字節碼和 ABI(介面)。
這些子對象可以保存或在前端程式碼中使用,或者您可以“導出”它們並將編譯腳本連結到部署腳本中。通過在部署開始時導入編譯腳本,您可以獲得最新版本的 ABI 和字節碼,因為編譯腳本將執行,並且導出/導入會傳遞您想要使用的編譯輸出中的任何對象.
使用節點執行。
node compile.js
它是獲取solidity合約的程式碼
ABI
,這裡solidity程式碼儲存在一個變數中:-bytecode``contract-name``contract
var solc = require('solc'); var contract=` //SPDX-License-Identifier:MIT pragma solidity ^0.8.0; contract hello{ string public hii='hello world'; function update(string memory message) public{hii=message;} }` var input = { language: 'Solidity', sources: {'test.sol': {content: contract}}, settings: {outputSelection: {'*': {'*': ['*']}}} } var output = JSON.parse(solc.compile(JSON.stringify(input))); for (var contractName in output.contracts['test.sol']) { console.log('contractName: ',contractName) console.log('bytecode: ',output.contracts['test.sol'][contractName].evm.bytecode.object ) console.log('abi :', output.contracts['test.sol'][contractName].abi) }