如何用私钥离线签名以太坊合约调用裸交易?【Web3.js】

简介:

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

用自己熟悉的语言学习以太坊DApp开发:Java | Php | Python | .Net / C# | Golang | Node.JS | Flutter / Dart

1、以太坊交易签名概述

有两种方法可以对交易进行签名:使用解锁账号或使用私钥。

如果你在用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
  
});

再次提醒,上述操作中用到了私钥,因此一定要格外小心安全问题。


原文链接:以太坊合约调用裸交易签名教程 — 汇智网

目录
相关文章
|
新零售 Java 程序员
Java以太坊开发官网推荐类库web3j的全站中文翻译
web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。
2703 0
|
Java 程序员 PHP
如何在Java文件中创建以太坊帐户和通过web3j查询账目情况?
在web3j的文档中,我没有看到创建帐户和的web3j查询账目任何内容,我想知道这是否可行? 问题回答: 其实挺简单的,ethGetBalance方法将返回任何给定帐户的余额。
2141 0
|
区块链 Python JavaScript
以太坊web3.js返回不能找到模块web3-requestManager?
以太坊web3.js返回不能找到模块web3-requestManager?错误信息如下: Cannot find module ‘web3-requestManager’ 我用下面命令安装web3: npm install web3 然后我启动了node.
2106 0
|
Go 区块链
以太坊系列之十七: 使用web3进行合约部署调用以及监听
以太坊系列之十七: 使用web3进行智能合约的部署调用以及监听事件(Event) 上一篇介绍了使用golang进行智能合约的部署以及调用,但是使用go语言最大的一个问题是没法持续监听事件的发生. 比如我的后台程序需要监控谁给我转账了,如果使用go语言,目前就只能是轮询数据,而使用web3就简单许多,geth会把我关心的事件 主动通知给我.
1671 0
|
15天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。
|
25天前
|
Web App开发 前端开发 开发工具
介绍Web开发的基础知识
介绍Web开发的基础知识
26 7
|
1月前
|
存储 资源调度 应用服务中间件
浅谈本地开发好的 Web 应用部署到 ABAP 应用服务器上的几种方式
浅谈本地开发好的 Web 应用部署到 ABAP 应用服务器上的几种方式
24 0
|
1月前
|
存储 前端开发 JavaScript
从前端到后端,探索现代Web开发技术
本文探索了现代Web开发技术的各个方面,包括前端和后端开发以及多种编程语言的应用。通过对JavaScript、Java、Python、C、PHP和Go等语言的介绍,深入探讨了前端和后端开发的基本原理和常用工具。同时,还涵盖了数据库技术在Web开发中的重要性和应用场景。无论你是初学者还是有经验的开发者,本文都能为你提供全面的视角和实用的知识,帮助你在Web开发领域取得更好的成果。
|
1月前
|
缓存 关系型数据库 API
后端开发:构建高效、可扩展的Web应用程序的关键
后端开发:构建高效、可扩展的Web应用程序的关键
18 0
|
3天前
|
PHP
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册