Contract-Deployment

使用 ether.js 部署合約

  • December 28, 2021

我試圖找出使用 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’ 部署合約的步驟:

  1. 將合約編譯為 .bin 和 .abi 文件
  2. 載入“ethers”和“fs”
  3. 使用“ethers”中的“provider”、“Wallet”和“connect”方法創建一個“signer”對象
  4. 從 ‘ContractFactory’ 方法創建一個合約實例
  5. 使用部署方法作為承諾

例如,在這裡我使用了“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 ] )

請問還有沒有問題。

引用自:https://ethereum.stackexchange.com/questions/84637