Web3.js介绍 · Ethereum Blockchain Developer Crash Course(三)了解交易transaction运作过程

本文主要是介绍Web3.js介绍 · Ethereum Blockchain Developer Crash Course(三)了解交易transaction运作过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本节教你如何创建交易transaction,会告诉你当交易创建时发生了什么,如何手动的把交易通过web3.js广播到网络上。

本节旨在帮助你理解以太坊区块链的交易时如何运作的,当你创建交易时,你在写数据到区块链并且更新区块链的状态,比如账户间发送以太币,调用合约中会写数据的方法,部署合约到区块链等都是交易。

为了把交易广播到网络上,我们要先对交易进行签名,我们使用 ethereumjs-tx 这个JavaScript库,你可以这样安装它:

$ npm install ethereumjs-tx

用这个库的原因是我们想在本地对所有交易进行签名,如果我们的以太坊节点在本地运行,我们可以解锁存储在本地的账户并且对本地的所有交易进行签名,我们使用的是Infura管理的远程节点,即使 Infura 是个可靠的服务, 我们仍想在本地对交易进行签名,而不是让远程节点拥有我们的私钥。

下面让我们创建一个原始交易,对它签名,然后发送交易,广播到网络上。首先创建一个app.js 文件,不再用命令行写代码。

app.js中首先引入一个签名库,然后建立一个web3连接

var Tx = require('ethereumjs-tx')
const Web3 = require('web3')
const web3 = new Web3('https://ropsten.infura.io/YOUR_INFURA_API_KEY')

现在我们用的是Ropsten测试网络,不是之前的以太坊主链网络,用测试网络是因为不用真实的花费以太币,你可以获取假的以太币。 You can obtain fake Ether from a faucet on the Ropsten test network with a faucet. Here are two faucets you can use:

http://faucet.ropsten.be:3001/

https://faucet.metamask.io/

现在我们创建一个交易,发送假的以太币。首先要有两个账户和私钥,可以通过如下方式利用Web3.js建立新账户:

web3.eth.accounts.create()
// > {
//    address: "0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01",
//    privateKey: "0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709",
//    signTransaction: function(tx){...},
//    sign: function(data){...},
//    encrypt: function(password){...}
// }

建好账户后,记得要给这两个账户申请假的以太币,然后我们保存这两个账户地址和私钥,不同机器地址和私钥不同。

const account1 = '0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01'
const account2 = '0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa02'
export PRIVATE_KEY_1='your private key 1 here'
export PRIVATE_KEY_1='your private key 2 here'

像上面这样保存私钥不安全,我们可以从web3.js环境中读取私钥再保存,可以使用NodeJS中的 process 全局对象:

const privateKey1 = process.env.PRIVATE_KEY_1
const privateKey2 = process.env.PRIVATE_KEY_2

为了用私钥对交易进行签名,我们要用Buffer把私钥转换成字符串,Buffer是NodeJS的一个模块:

const privateKey1 = Buffer.from(process.env.PRIVATE_KEY_1)
const privateKey1 = Buffer.from(process.env.PRIVATE_KEY_2)

现在所有变量都准备好了,我们要:

  1. Build a transaction object 建立一个交易对象
  2. Sign the transaction 对交易签名
  3. Broadcast the transaction to the network 把交易广播到网络上

可以像下面建立交易:

const txObject = {nonce:    web3.utils.toHex(txCount),to:       account2,value:    web3.utils.toHex(web3.utils.toWei('0.1', 'ether')),gasLimit: web3.utils.toHex(21000),gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei'))}
  • nonce - 这是之前的交易总数  this is the previous transaction count for the given account. We'll assign the value of this variable momentarily. We also must convert this value to hexidecimal. We can do this with the Web3.js utilitly web3.utils.toHex()
  • to - 接收以太币的账户 the account we're sending Ether to.
  • value - 以太币数量,单位是Wei,且是16进制。 the amount of Ether we want to send. This value must be expressed in Wei and converted to hexidecimal. We can convert the value to we with the Web3.js utility web3.utils.toWei().
  • gasLimit - this is the maximum amount of gas consumed by the transaction. A basic transaction like this always costs 21000 units of gas, so we'll use that for the value here.
  • gasPrice - this is the amount we want to pay for each unit of gas. I'll use 10 Gwei here.

在交易对象中没有 from 字段,当我们用 account1的私钥对交易签名时它会自动引用。

我们可以通过  web3.eth.getTransactionCount()方法获取nonce值,通过回调函数包装后:

web3.eth.getTransactionCount(account1, (err, txCount) => {const txObject = {nonce:    web3.utils.toHex(txCount),to:       account2,value:    web3.utils.toHex(web3.utils.toWei('0.1', 'ether')),gasLimit: web3.utils.toHex(21000),gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei'))}
})

现在我们有了交易对象,需要对它签名:

const tx = new Tx(txObject)
tx.sign(privateKey1)const serializedTx = tx.serialize()
const raw = '0x' + serializedTx.toString('hex')

使用 etheremjs-tx 库来创建一个新的 Tx 对象,利用 privateKey1对交易进行签名,然后把交易序列化,转化为十六进制的字符串,能传到Web3中。

最后,我们使用web3.eth.sendSignedTransaction()方法发送签名后序列化的交易到测试网络上:

web3.eth.sendSignedTransaction(raw, (err, txHash) => {console.log('txHash:', txHash)
})

完整的 app.js 文件如下:

var Tx     = require('ethereumjs-tx')
const Web3 = require('web3')
const web3 = new Web3('https://ropsten.infura.io/YOUR_INFURA_API_KEY')const account1 = '' // Your account address 1
const account2 = '' // Your account address 2const privateKey1 = Buffer.from('YOUR_PRIVATE_KEY_1', 'hex')
const privateKey2 = Buffer.from('YOUR_PRIVATE_KEY_2', 'hex')web3.eth.getTransactionCount(account1, (err, txCount) => {// Build the transactionconst txObject = {nonce:    web3.utils.toHex(txCount),to:       account2,value:    web3.utils.toHex(web3.utils.toWei('0.1', 'ether')),gasLimit: web3.utils.toHex(21000),gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei'))}// Sign the transactionconst tx = new Tx(txObject)tx.sign(privateKey1)const serializedTx = tx.serialize()const raw = '0x' + serializedTx.toString('hex')// Broadcast the transactionweb3.eth.sendSignedTransaction(raw, (err, txHash) => {console.log('txHash:', txHash)// Now go check etherscan to see the transaction!})
})

在 NodeJS 控制台中可以运行 app.js 文件:

$ node app.js

或者这样运行也可以:

$ node app

本节完整的代码在: github.

这篇关于Web3.js介绍 · Ethereum Blockchain Developer Crash Course(三)了解交易transaction运作过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062955

相关文章

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss