web3.js 准备账号

接下来,我们将创建交易,签署交易,然后广播交易。

app.js

创建一个简单的app.js代码文件,而不是在控制台中执行代码。

在app.js文件中,导入新安装的库:

var Tx     = require('ethereumjs-tx').Transaction

建立一个Web3连接:

const Web3 = require('web3')
const web3 = new Web3('https://ropsten.infura.io/YOUR_INFURA_API_KEY')

创建账号

注意,我们使用的是Ropsten测试网络,它与我们在前面章节使用的Ethereum主网不同,测试网络使用的是伪以太币,不花钱。

在本例中,我们将伪以太币从一个帐户发送到另一个帐户,因此,需要准备2个帐户和及其私钥。

创建2个账号

可以在node控制台,使用Web3.js创建新账户,如下所示:

Kevin@QIKEGU g:\qikegu\ethereum\web3js
> node
> web3.eth.accounts.create()
Thrown:
ReferenceError: web3 is not defined
> const Web3 = require('web3')
undefined
> const web3 = new Web3('https://ropsten.infura.io/v3/YOUR_INFURA_API_KEY')
undefined
> web3.eth.accounts.create()
{ address: '0xf4Ab5314ee8d7AA0eB00b366c52cEEccC62d6B4B',
  privateKey:
   '0xb75e2bcaec74857cf9bb6636d66a04784d4c0fcfd908f4a2bc213428eba5af0d',
  signTransaction: [Function: signTransaction],
  sign: [Function: sign],
  encrypt: [Function: encrypt] }
> web3.eth.accounts.create()
{ address: '0xff96B8B43ECd6C49805747F94747bFfa3A960b69',
  privateKey:
   '0xac0adfdbaeb0770a479e79aac78779d82fdc2f9262e0c8f751ae70fb63ef6196',
  signTransaction: [Function: signTransaction],
  sign: [Function: sign],
  encrypt: [Function: encrypt] }
>

获取测试以太币

创建好账号后,可以从下面网址获取伪以太币:

ipfs.io

注意 如果上面地址失效,可以在google/bing中,搜索 “ropsten faucet”,查找能获取测试以太币的地方。

把私钥设为环境变量

把私钥设为环境变量,然后从代码中读取环境变量。这样就可以避免把私钥硬编码到源文件中,私钥是禁止公开的。

在Windows下设置环境变量:

> SET PRIVATE_KEY_1='b75e2bcaec74857cf9bb6636d66a04784d4c0fcfd908f4a2bc213428eba5af0d'
> SET PRIVATE_KEY_2='ac0adfdbaeb0770a479e79aac78779d82fdc2f9262e0c8f751ae70fb63ef6196'

在linux下设置环境变量:

$ export PRIVATE_KEY_1='b75e2bcaec74857cf9bb6636d66a04784d4c0fcfd908f4a2bc213428eba5af0d'
$ export PRIVATE_KEY_2='ac0adfdbaeb0770a479e79aac78779d82fdc2f9262e0c8f751ae70fb63ef6196'

app.js中声明账号变量,读取私钥

声明2个账号变量,请务必使用你自己的帐户:

const account1 = '0xf4Ab5314ee8d7AA0eB00b366c52cEEccC62d6B4B'
const account2 = '0xff96B8B43ECd6C49805747F94747bFfa3A960b69'

现在,在app.js文件中,读取这些私钥环境变量,并将它们存储到变量中:

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

为了使用私钥对交易进行签名,必须使用缓冲区将它们转换成二进制数据字符串,缓冲区是NodeJS中的全局模块。

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

好了,现在我们已经设置好了需要的变量!

准备好了账号,就可以执行转账交易了。交易可分为3个步骤:构建交易对象签署交易广播交易构建交易对象const txObject = { nonce: web3.utils.toHex(txCount), to: ...