使用服务器nodejs的web3进行打包发送交易,调用合约,参考连接: 使用服务器nodejs的web3进行打包发送交易,调用合约:
调用代码
var contract = new web3.eth.Contract(contractJson, contractAddress);
var transfer = contract.methods.transfer("0x...", 490);
var encodedABI = transfer.encodeABI();
// 调用
await txHandle(from, to, value, dataA, privateKey, providerAddress)
封装方法
/**
* from 发送交易的账号地址
* to 调用合约地址
* value 如果需要付主币
* encodedABI 编码后的交易信息
* privateKey 发送交易的账号私钥
* providerAddress 节点地址
**/
const txHandle = async (from, to, value, encodedABI, privateKey, providerAddress) => {
const web3 = new Web3(providerAddress);
// let price = await web3.eth.getGasPrice();
return new Promise((resolve, reject) => {
const tx = {
from: from,
// 执行交易的地址,可能是合约地址
to: to,
// gasPrice: 2,
gas: 2000000,
value: value,
// 可选
// nonce:
// 合约的地址是根据你的账户地址和nonce值计算出来的,所以在不同网络中,如果nonce值相同,部署出的合约地址也相同
data: encodedABI
};
const signPromise = web3.eth.accounts.signTransaction(tx, privateKey);
// 由于签名后的裸交易字符串中已经编码了有关合约调用的全部信息,包括方法名、调用参数、gas价格等等,因此可以直接提交给以太坊节点广播:
let res = false;
signPromise.then((signedTx) => {
const sentTx = web3.eth.sendSignedTransaction(signedTx.raw || signedTx.rawTransaction);
sentTx.on("receipt", receipt => {
resolve(true)
});
sentTx.on("error", err => {
console.log('err txHandle == ', err);
reject(err)
});
}).catch((err) => {
console.log('signPromise err', err)
reject(err)
});
})
}