从新创建的帐户中使用 web3 调用合约方法
Posted
技术标签:
【中文标题】从新创建的帐户中使用 web3 调用合约方法【英文标题】:Call contract methods with web3 from newly created account 【发布时间】:2018-10-30 05:57:53 【问题描述】:我需要在不使用 MetaMask 的情况下从我的以太坊合约中调用方法。我使用 Infura API 并尝试从最近使用 web3.eth.create() 方法创建的帐户调用我的方法。此方法返回如下对象:
address: "0xb8CE9ab6943e0eCED004cG5834Hfn7d",
privateKey: "0x348ce564d427a3311b6536bbcff9390d69395b06ed6",
signTransaction: function(tx)...,
sign: function(data)...,
encrypt: function(password)...
我也使用 infura 提供商:
const web3 = new Web3(new Web3.providers.HttpProvider(
"https://rinkeby.infura.io/5555666777888"
))
所以,当我尝试这样写时:
contract.methods.contribute().send(
from: '0xb8CE9ab6943e0eCED004cG5834Hfn7d', // here I paste recently created address
value: web3.utils.toWei("0.5", "ether")
);
我有这个错误:
错误:既没有在给定选项中指定“发件人”地址,也没有在 默认选项。
如果我在from
选项中写它怎么可能不是来自地址??
附:使用 Metamask,我的应用程序运行良好。但是当我从 MetaMask 注销并尝试创建新帐户并使用它时,我遇到了这个问题。
【问题讨论】:
你有没有试过在最后传递一个回调函数? 我已经通过使用私钥签署交易解决了这个问题。事实上,我们不能只从随机地址发送交易。 您可以发布您的代码作为答案吗?很高兴看到解决方案 查看新答案。 【参考方案1】:事实上,我们不能只从新创建的地址发送交易。我们必须用我们的私钥签署这个交易。例如,我们可以为 NodeJS 使用ethereumjs-tx
模块。
const Web3 = require('web3')
const Tx = require('ethereumjs-tx')
let web3 = new Web3(
new Web3.providers.HttpProvider(
"https://ropsten.infura.io/---your api key-----"
)
)
const account = '0x46fC1600b1869b3b4F9097185...'; //Your account address
const privateKey = Buffer.from('6e4702be2aa6b2c96ca22df40a004c2c944...', 'hex');
const contractAddress = '0x2b622616e3f338266a4becb32...'; // Deployed manually
const abi = [Your ABI from contract]
const contract = new web3.eth.Contract(abi, contractAddress,
from: account,
gasLimit: 3000000,
);
const contractFunction = contract.methods.createCampaign(0.1); // Here you can call your contract functions
const functionAbi = contractFunction.encodeABI();
let estimatedGas;
let nonce;
console.log("Getting gas estimate");
contractFunction.estimateGas(from: account).then((gasAmount) =>
estimatedGas = gasAmount.toString(16);
console.log("Estimated gas: " + estimatedGas);
web3.eth.getTransactionCount(account).then(_nonce =>
nonce = _nonce.toString(16);
console.log("Nonce: " + nonce);
const txParams =
gasPrice: 100000,
gasLimit: 3000000,
to: contractAddress,
data: functionAbi,
from: account,
nonce: '0x' + nonce
;
const tx = new Tx(txParams);
tx.sign(privateKey); // Transaction Signing here
const serializedTx = tx.serialize();
web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex')).on('receipt', receipt =>
console.log(receipt);
)
);
);
交易时间大约是 20-30 秒,所以您应该等待一段时间。
【讨论】:
如何取回智能合约函数调用的输出?它包含在收据中吗?以上是关于从新创建的帐户中使用 web3 调用合约方法的主要内容,如果未能解决你的问题,请参考以下文章