blockchain 在infura上使用编码coding的方式,创建和部署contract coding to deploy contract infura web3 ether
创建文件夹
/workspace/blockchain/contract_on_goerli_using_infura
安装需要的包
npm install web3 solc dotenv

安装完成就可以看到,需要的文件:package.json
cat package.json
{
"dependencies": {
"@truffle/hdwallet-provider": "^2.0.12",
"dotenv": "^16.0.1",
"solc": "^0.8.16",
"web3": "^1.7.5"
}
}需要编译的contract
cat Demo.sol<br />
pragma solidity >= 0.5.8;
contract Demo {<br />
event Echo (string message);
function echo(string calldata message) external {<br />
emit Echo(message);<br />
}<br />
}生成abi和bytecode的脚本:
cat compile.js<br />
const fs = require('fs').promises;
const solc = require('solc');
// 这个方法需要修改, 入口文件名称 Demo.sol 和 生成的文件名称 Demo.json<br />
async function main(){<br />
const sourceCode = await fs.readFile('Demo.sol', 'utf8');<br />
const {abi, bytecode} = compile(sourceCode, 'Demo');<br />
const artifact = JSON.stringify({ abi, bytecode}, null, 2);<br />
await fs.writeFile('Demo.json', artifact);<br />
}
// 这个方法不用改。拿过来用就好了<br />
function compile(sourceCode, contractName){<br />
const input = {<br />
language: 'Solidity',<br />
sources: { main: { content: sourceCode} },<br />
settings: {<br />
outputSelection: {<br />
'*': {<br />
'*': ['abi', 'evm.bytecode']<br />
}<br />
},<br />
},<br />
}
const output = solc.compile(JSON.stringify(input));<br />
const artifact = JSON.parse(output).contracts.main[contractName];<br />
return {<br />
abi: artifact.abi,<br />
bytecode: artifact.evm.bytecode.object<br />
};<br />
}
main().then( () => process.exit(0) )运行node compile.js,
会生成需要的abi和bytecode
cat Demo.json<br />
{<br />
"abi": [<br />
{<br />
"anonymous": false,<br />
"inputs": [<br />
{<br />
"indexed": false,<br />
"internalType": "string",<br />
"name": "message",<br />
"type": "string"<br />
}<br />
],<br />
"name": "Echo",<br />
"type": "event"<br />
},<br />
{<br />
"inputs": [<br />
{<br />
"internalType": "string",<br />
"name": "message",<br />
"type": "string"<br />
}<br />
],<br />
"name": "echo",<br />
"outputs": [],<br />
"stateMutability": "nonpayable",<br />
"type": "function"<br />
}<br />
],<br />
"bytecode": "608060405234801561001057600080fd5b506101fd806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f15da72914610030575b600080fd5b61004a600480360381019061004591906100f8565b61004c565b005b7fdb84d7c006c4de68f9c0bd50b8b81ed31f29ebeec325c872d36445c6565d757c828260405161007d9291906101a3565b60405180910390a15050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126100b8576100b7610093565b5b8235905067ffffffffffffffff8111156100d5576100d4610098565b5b6020830191508360018202830111156100f1576100f061009d565b5b9250929050565b6000806020838503121561010f5761010e610089565b5b600083013567ffffffffffffffff81111561012d5761012c61008e565b5b610139858286016100a2565b92509250509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006101828385610145565b935061018f838584610156565b61019883610165565b840190509392505050565b600060208201905081810360008301526101be818486610176565b9050939250505056fea2646970667358221220ccf941ebb1736aee262be850feacdba6713c1bf3c13e588f4769077c5821570d64736f6c63430008100033"部署的脚本:
cat deploy.js<br />
const Web3 = require('web3');
const fs = require('fs')<br />
const {abi, bytecode} = JSON.parse(fs.readFileSync('Demo.json'))
async function main(){<br />
// step1. 初始化web3 , 根据某个rpc server endpoint<br />
const network = process.env.ETHEREUM_NETWORK<br />
const web3 = new Web3(<br />
new Web3.providers.HttpProvider(<br />
`https://${network}.infura.io/v3/${process.env.INFURA_PROJECT_ID}`<br />
)<br />
)
// step2. 创建签名用的东东<br />
const signer = web3.eth.accounts.privateKeyToAccount(<br />
process.env.SIGNER_PRIVATE_KEY<br />
)<br />
web3.eth.accounts.wallet.add(signer)
// step3. 初始化contract<br />
const contract = new web3.eth.Contract(abi)<br />
contract.options.data = bytecode
// step4. 发布该 contract<br />
const deployTx = contract.deploy()<br />
const deployedContract = await deployTx<br />
.send({<br />
from: signer.address, // 这里用到了signer的address<br />
gas: await deployTx.estimateGas()<br />
})<br />
.once('transactionHash', (txhash) => {<br />
console.log("Mining deployment transaction ... ", txhash)<br />
console.log(`https://${network}.etherscan.io/tx/${txhash}`)<br />
})
}
require('dotenv').config()<br />
main()部署:node deploy.js
不能连接网络,只能连接本地的网络
