Contract-Deployment
使用 ether.js 部署合約
我試圖找出使用 ethers.js 以程式方式部署合約的最佳方法
使用 web3 我可以這樣做:
const contractInstance = new this.web3.eth.Contract(contractObject.abi) var deployTx debug(contractInstance) if (params === undefined || params.length === 0) { deployTx = contractInstance.deploy({ data: contractObject.bytecode }) } else { deployTx = contractInstance.deploy({ data: contractObject.bytecode, arguments: params }) } const data = await deployTx.encodeABI()
使用 Web 3 我似乎還需要一個地址?為了得到那個地址,我必須先手動部署它;圍繞該主題進行一些澄清確實會有所幫助。
我試圖找到指定這一點的資源,但它們不是我想找的東西?
提前致謝
您可以使用 Ethers.js’ 部署合約
ContractFactory
。import { ContractFactory } from 'ethers'; const factory = new ContractFactory(contractAbi, contractByteCode); // If your contract requires constructor args, you can specify them here const contract = await factory.deploy(deployArgs); console.log(contract.address); console.log(contract.deployTransaction);
更多資訊可以在文件中找到,在這裡找到:https ://docs.ethers.io/v5/api/contract/contract-factory/
為了進一步闡述 Marten 的答案,我將嘗試給出一個完整的腳本。假設你已經安裝了 metamask,並且知道種子片語,下面是使用 ’ethers’ 和 ‘fs’ 部署合約的步驟:
- 將合約編譯為 .bin 和 .abi 文件
- 載入“ethers”和“fs”
- 使用“ethers”中的“provider”、“Wallet”和“connect”方法創建一個“signer”對象
- 從 ‘ContractFactory’ 方法創建一個合約實例
- 使用部署方法作為承諾
例如,在這裡我使用了“getblock”作為 web3 提供程序(參見https://getblock.io/docs/get-started/auth-with-api-key/)。其他替代品是“quicknode”、“alchemy”和“infura”。
用於合約部署的 nodejs 腳本在這裡:
//load 'ethers' and 'fs' ethers = require('ethers'); fs = require('fs'); //Read bin and abi file to object; names of the solcjs-generated files renamed bytecode = fs.readFileSync('storage.bin').toString(); abi = JSON.parse(fs.readFileSync('storage.abi').toString()); //to create 'signer' object;here 'account' const mnemonic = "<see-phrase>" // seed phrase for your Metamask account const provider = new ethers.providers.WebSocketProvider("wss://bsc.getblock.io/testnet/?api_key=<your-api-key>"); const wallet = ethers.Wallet.fromMnemonic(mnemonic); const account = wallet.connect(provider); const myContract = new ethers.ContractFactory(abi, bytecode, account); //Ussing async-await for deploy method async function main() { // If your contract requires constructor args, you can specify them here const contract = await myContract.deploy(); console.log(contract.address); console.log(contract.deployTransaction); } main();
在上面的程式碼中,‘account’ 是 ethers 文件https://docs.ethers.io/v5/api/contract/contract-factory/#ContractFactory--creating
ethers.ContractFactory( interface , bytecode [ , signer ] )
請問還有沒有問題。