如何使用 web3.js 1.0 验证和发送合同方法

新手上路,请多包涵

我很困惑我应该如何使用 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 不存在/不可用

验证和提交交易的最简单方法是什么?

理想情况下,我想在我的代码示例中使用第一种方法,因为它是最干净的。

原文由 Nick Young 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 441
2 个回答

此代码允许我使用我创建的帐户(使用 web3.eth.accounts.create())中的私钥在服务器端(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);
  });

原文由 Nick Young 发布,翻译遵循 CC BY-SA 3.0 许可协议

一种无需显式签署交易即可调用合同方法的方法是(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
        })

原文由 Gediminas Rimsa 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏