主页 > imtoken钱包下载2.0版本 > 以太坊合约调用裸交易签名教程【Web3.js】
以太坊合约调用裸交易签名教程【Web3.js】
交易签名是你向区块链证明自己身份的唯一途径,这是使用以太坊的Web3开发库需要理清的一个基本概念。 在本教程中,我们将学习如何使用Web3.js完成以太坊智能合约调用交易的签署和提交,适用于包括ERC20代币合约在内的所有以太坊合约的调用。
用您熟悉的语言学习以太坊 DApp 开发:| | | | | | 一、以太坊交易签名概述
有两种签署交易的方式:使用解锁账户或使用私钥。
如果您正在使用 testRPC 或 Ganache 进行开发,您应该已经知道它创建的测试帐户。 这些账户默认是解锁的,所以你可以直接用它们来签署交易。 您还可以使用特殊的 Web3 提供程序以太坊同签名下的子账号,例如 truffle-hdwallet-provider 来生成解锁帐户。
更常见的是,交易是用发起交易的地址对应的私钥签名的。 出于安全原因,您在使用私钥时需要格外小心。
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() };
接下来怎么签名就看你用的是解锁账户还是私钥了。
3.使用解锁账户签署以太坊交易
如果您使用解锁帐户,请使用以下代码进行签名:
const signPromise = web3.eth.signTransaction(tx, tx.from);
注意,如果你使用的是解锁账户以太坊同签名下的子账号,直接调用myContract.methods.myMethod(arg, arg2)即可自动完成签名。 上面的代码只是为了演示签名过程。
4.使用私钥签署以太坊交易
但如果这是一个锁定的账户,或者根本不受节点管理,那么您可以使用私钥签署交易:
const signPromise = web3.eth.accounts.signTransaction(tx, privateKey);
以上两种情况,返回的都是Promise对象,解析结果是签名后的裸交易字符串。
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 });
再次提醒一下,上面的操作用到了私钥,所以一定要格外小心安全问题。
原文链接: