作者:不会遗忘528_757 | 来源:互联网 | 2023-01-15 10:25
我对如何使用web3 1.0库执行合同的方法感到困惑.
此代码有效(只要我先手动解锁帐户):
var cOntract= new web3.eth.Contract(contractJson, contractAddress);
contract.methods
.transfer("0x0e0479bC23a96F6d701D003c5F004Bb0f28e773C", 1000)
.send({
from: "0x2EBd0A4729129b45b23aAd4656b98026cf67650A"
})
.on('confirmation', (confirmationNumber, receipt) => {
io.emit('confirmation', confirmationNumber);
});
我收到此错误(如果我不先手动解锁):
返回错误:需要身份验证:密码或解锁
上面的代码是node.js中的API端点,所以我希望它以编程方式解锁或验证.
web3.js 1.0中没有方法来解锁帐户.
我也不认为这是必要的(至少这是我所困惑的).由于我在管理帐户,因此我知道私钥是什么.
我在想交易需要用私钥签名?它是否正确?这与"解锁帐户"实际上是一回事吗?
我试过这样做:
var cOntract= new web3.eth.Contract(contractJson, contractAddress);
var tx = {
from: "...{fromAddress -- address that has the private key below}",
to: "...",
value: ...
};
var signed = web3.eth.accounts.signTransaction(tx,
"...{privateKey}");
console.log(signed);
var promise = web3.eth.sendSignedTransaction(signed);
我收到此错误:
返回错误:方法net_version不存在/不可用
验证和提交交易的最简单方法是什么?
理想情况下,我想在我的代码示例中使用第一种方法,因为它是最干净的.
1> Nick Young..:
此代码允许我使用我创建的帐户(使用web3.eth.accounts.create())使用privateKey签署事务服务器端(node.js),并将签名的事务发送到网络,而无需解锁帐户.
我正在使用Geth 1.7.1
var cOntract= new web3.eth.Contract(contractJson, contractAddress);
var transfer = contract.methods.transfer("0x...", 490);
var encodedABI = transfer.encodeABI();
var tx = {
from: "0x...",
to: contractAddress,
gas: 2000000,
data: encodedABI
};
web3.eth.accounts.signTransaction(tx, privateKey).then(signed => {
var tran = web3.eth.sendSignedTransaction(signed.rawTransaction);
tran.on('confirmation', (confirmationNumber, receipt) => {
console.log('confirmation: ' + confirmationNumber);
});
tran.on('transactionHash', hash => {
console.log('hash');
console.log(hash);
});
tran.on('receipt', receipt => {
console.log('reciept');
console.log(receipt);
});
tran.on('error', console.error);
});
2> Gediminas Ri..:
无需显式签署交易即可调用合同方法的一种方法是(web3js 1.0.0):
const privateKey = 'e0f3440344e4814d0dea8a65c1b9c488bab4295571c72fb879f5c29c8c861937';
const account = web3.eth.accounts.privateKeyToAccount('0x' + privateKey);
web3.eth.accounts.wallet.add(account);
web3.eth.defaultAccount = account.address;
// ...
cOntract= new web3.eth.Contract(JSON_INTERFACE, address);
contract.methods.myMethod(myParam1, myParam2)
.send({
from: this.web3.eth.defaultAccount,
gas: myConfig.gas,
gasPrice: myConfig.gasPrice
})