Back

blockchain - 使用web3进行contract相关的开发和调用

发布时间: 2022-06-07 02:39:00

refer to: https://web3js.readthedocs.io/en/v1.7.3/web3-eth-contract.html

安装

npm install web3

调用web3

创建一个文件: (当前目录下) run.js  (前提是本地运行了 npx hardhat node)

var Web3 = require('web3')
var web3 = new Web3('ws://localhost:8545')
web3.eth.getAccounts()
    .then(console.log);

查看本地的account: web3.eth.getAccounts()

调用contract:

需要的前提是: 我们知道contract的源代码,然后根据源代码生成 contract abi 。(或者该源代码已经被verify了。)

refer to: https://ethereum.stackexchange.com/questions/3149/how-do-you-get-a-json-file-abi-from-a-known-contract-address

solcjs contracts/SayHi.sol --abi 

然后会生成一个 新的文件: contracts_SayHi_sol_SayHi.abi

[{"inputs":[],"name":"get","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"store","outputs":[],"stateMutability":"nonpayable","type":"function"}]

然后在当前目录创建文件: run_contract.js  ,内容如下:

(参考:https://stackoverflow.com/questions/59441099/web3js-contract-deploy-never-resolved-the-promise-or-never-exits)

var Contract = require('web3-eth-contract')

run()

async function run(){

  Contract.setProvider('ws://localhost:8545')

  let contractAbi = [{"inputs":[],"name":"getNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"store","outputs":[],"stateMutability":"nonpayable","type":"function"}]

  let contractAddress = '0x5FbDB2315678afecb367f032d93F642f64180aa3'

  var contract = new Contract(contractAbi, contractAddress)

  let from = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'

  await contract.methods.getNumber().send({from: from})
    .then(console.log)
 
await contract.methods.store(333).send({from: from}) .on('receipt', function(data){ console.info("receipt, data is: ", data) }).on('error', function(error) { console.log('error', error); }).on('transactionHash', function(transactionHash) { console.log('transactionHash', transactionHash); }).on('confirmation', function(confirmationNumber, receipt) { console.log('confirmation', confirmationNumber); }); }
process.exit() // 如果是node的话
}

contract.call() 与 contract.send()的区别

call() 的话只是调用。 不改变EVM的状态(就是适合对于getter方法)

send()的话,会发起一个转账, 会改变EVM的状态。(会产生tx )

调用contract的方式

1. 本地节点的调用:  ( json-rpc 调用, web3 console调用, 自动签名,需要send_transaction)

2. infura的调用:(json-rpc调用, 程序进行的签名  send_rawTransaction)

3. web 页面的调用(H5, web3的调用, 手动进行签名)

Back