主页 > imtoken钱包下载2.0版本 > 以太坊合约调用裸交易签名教程【Web3.js】

以太坊合约调用裸交易签名教程【Web3.js】

imtoken钱包下载2.0版本 2024-01-15 05:10:43

交易签名是你向区块链证明自己身份的唯一途径,这是使用以太坊的Web3开发库需要理清的一个基本概念。 在本教程中,我们将学习如何使用Web3.js完成以太坊智能合约调用交易的签署和提交,适用于包括ERC20代币合约在内的所有以太坊合约的调用。

用您熟悉的语言学习以太坊 DApp 开发:| | | | | | 一、以太坊交易签名概述

有两种签署交易的方式:使用解锁账户或使用私钥。

如果您正在使用 testRPC 或 Ganache 进行开发,您应该已经知道它创建的测试帐户。 这些账户默认是解锁的,所以你可以直接用它们来签署交易。 您还可以使用特殊的 Web3 提供程序以太坊同签名下的子账号,例如 truffle-hdwallet-provider 来生成解锁帐户。

更常见的是,交易是用发起交易的地址对应的私钥签名的。 出于安全原因,您在使用私钥时需要格外小心。

以太坊同签名下的子账号_以太坊离线生成账号_sitecsdn.net 以太坊多重签名

2.创建以太坊智能合约调用交易

首先需要构造一个调用合约方法的交易对象:

  // 12 word mnemonic for HD Wallet Provider // You can use any provider such as the HttpProvider if you are // signing with private key const mnemonic = "opinion destroy betray …"; const provider = new HDWalletProvider(mnemonic,"http://localhost:8545"); const web3 = new Web3(provider); const myContract = new web3.eth.Contract(contractAbi,contractAddress);  const tx = {   // this could be provider.addresses[0] if it exists   from: fromAddress,    // target address, this could be a smart contract address   to: toAddress,    // optional if you want to specify the gas limit    gas: gasLimit,    // optional if you are invoking say a payable function    value: value,   // this encodes the ABI of the method and the arguements   data: myContract.methods.myMethod(arg, arg2).encodeABI()  }; 

sitecsdn.net 以太坊多重签名_以太坊同签名下的子账号_以太坊离线生成账号

接下来怎么签名就看你用的是解锁账户还是私钥了。

3.使用解锁账户签署以太坊交易

如果您使用解锁帐户,请使用以下代码进行签名:

以太坊离线生成账号_以太坊同签名下的子账号_sitecsdn.net 以太坊多重签名

  const signPromise = web3.eth.signTransaction(tx, tx.from); 

注意,如果你使用的是解锁账户以太坊同签名下的子账号,直接调用myContract.methods.myMethod(arg, arg2)即可自动完成签名。 上面的代码只是为了演示签名过程。

4.使用私钥签署以太坊交易

以太坊离线生成账号_以太坊同签名下的子账号_sitecsdn.net 以太坊多重签名

但如果这是一个锁定的账户,或者根本不受节点管理,那么您可以使用私钥签署交易:

  const signPromise = web3.eth.accounts.signTransaction(tx, privateKey); 

以上两种情况,返回的都是Promise对象,解析结果是签名后的裸交易字符串。

sitecsdn.net 以太坊多重签名_以太坊同签名下的子账号_以太坊离线生成账号

5.广播已签名的裸交易字符串

由于合约调用的所有信息都已经编码在已签名的裸交易字符串中,包括方法名、调用参数、gas价格等,可以直接提交给以太坊节点进行广播:

  signPromise.then((signedTx) => {      // raw transaction string may be available in .raw or    // .rawTransaction depending on which signTransaction   // function was called   const sentTx = web3.eth.sendSignedTransaction(signedTx.raw || signedTx.rawTransaction);        sentTx.on("receipt", receipt => {     // do something when receipt comes back   });      sentTx.on("error", err => {     // do something on transaction error   });    }).catch((err) => {      // do something when promise fails    }); 

再次提醒一下,上面的操作用到了私钥,所以一定要格外小心安全问题。

原文链接: