以太坊之Windows DApp私链环境的搭建

举报
Serendipity·y 发表于 2022/07/19 00:18:48 2022/07/19
【摘要】 一、安装 DApp 开发环境 ① 安装 Node.js 安装 Node.js 可以使用官方长期支持的 8.10.0LTS 版本,根据 ubuntu 是 32 位还是 64 位,分别下载不同的预编译版本...

一、安装 DApp 开发环境

① 安装 Node.js

  • 安装 Node.js 可以使用官方长期支持的 8.10.0LTS 版本,根据 ubuntu 是 32 位还是 64 位,分别下载不同的预编译版本:
    • 32 位:
~$ wget https://nodejs.org/dist/v8.10.0/node-v8.10.0-linux-x86.tar.gz

  
 
  • 1
    • 64 位:
~$ wget https://nodejs.org/dist/v8.10.0/node-v8.10.0-linux-x64.tar.gz

  
 
  • 1
  • 然后解压到当前目录,以 64 位为例:
~$ tar zxvf node-v8.10.0-linux-x64.tar.gz

  
 
  • 1
  • 下载后直接安装即可,安装完毕,打开一个控制台窗口,可以使用 node:
C:\Users\xxx> node –v
v8.10.0

  
 
  • 1
  • 2

② 安装 Geth

  • 下载 64 位或者 32 位 Geth 安装程序,然后进行安装,下载地址:Ethereum 或者 直接下载
  • 安装完毕后打开一个控制台,执行命令验证安装成功:
C:\Users\xxx> geth version
Geth
Version: 1.8.3-stable

  
 
  • 1
  • 2
  • 3

③ 安装 solidity 编译器

  • 执行以下命令安装:
C:\Users\xxx> npm install –g solc

  
 
  • 1
  • 安装完毕后,执行命令验证安装成功
C:\Users\xxx> solcjs –version
0.40.2+commit.3155dd80.Emscripten.clang

  
 
  • 1
  • 2

④ 安装 web3

  • Web3 的安装过程使用 git,因此需要先安装 windows 版的 git 命令行。下载 64 位或者 32 位的 git 安装程序,本地安装后在继续安装web3:
C:\Users\xxx> npm install –g web3@0.20.2

  
 
  • 1
  • 安装验证:
C:\Users\xxx> node –p 'require("web3")'
{[Function: Web3]
providers:{}}

  
 
  • 1
  • 2
  • 3

⑤ 安装 truffle 框架

  • 执行以下命令安装 truffle 开发框架:
C:\Users\xxx> npm install –g truffle

  
 
  • 1
  • 验证安装:
C:\Users\xxx> truffle.cmd version
Truffle v4.1.3 (core 4.1.3)

  
 
  • 1
  • 2

⑥ 安装 webpack

  • 执行以下命令安装 webpack:
C:\Users\xxx> npm install –g webpack@3.11.0

  
 
  • 1
  • 验证安装:
C:\Users\xxx> webpack –v 
3.11.0

  
 
  • 1
  • 2

二、运行私链节点

① 创世块配置

创建一个节点目录 node1,并在其中创建私链的创世块配置文件:

C:\Users\xxx> mkdir node1
C:\Users\xxx> cd node1
C:\Users\xxx\node1> notepad private.json

  
 
  • 1
  • 2
  • 3
  • 然后编辑内容如下:
{
	"config": {
		"chainId": 7878,
		"homesteadBlock": 0,
		"eip155Block": 0,
		"eip158Block": 0
	},
	"difficulty": "200",
	"gasLimit": "2100000",
	"alloc": {
		"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
		"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • config.chainId 用来声明以太坊网络编号,选择一个大于 10 的数字即可;difficulty 用来声明挖矿难度,越小的值难度越低,也就能更快速地出块。

② 初始化私链节点

  • 执行 geth 的 init 命令初始化私链节点:
C:\Users\xxx\node1> geth --datadir .\data init private.json

  
 
  • 1
  • 这会在当前目录下创建 data 目录,用来保存区块数据及账户信息:
C:\Users\xxx\node1> dir
data private.json

  
 
  • 1
  • 2
  • 可以上述命令写到一个脚本 init.cmd 里,这样避免每次都输入那么多记不住的东西。文件内容如下:
geth --datadir .\data init private.json

  
 
  • 1
  • 在部署下一个节点时,就可以直接执行这个脚本进行初始化。例如,在另一台机器上:
C:\Users\xxx\node1> init.cmd

  
 
  • 1

③ 启动私链节点

  • 从指定的私链数据目录启动并设定一个不同的网络编号来启动节点:
C:\Users\xxx\node1> geth --rpc --datadir .\data --networkid 7878 console

  
 
  • 1
  • 同样,可以用一个脚本 console.cmd 来简化启动节点时的输入,文件内容如下:
geth --rpc \
	 --rpcaddr 0.0.0.0 \
	 --rpccorsdomain "*"\
	 --datadir ./data \
	 --networkid 7878 \
	console

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • rpcaddr 参数用来声明节点 RPC API 的监听地址,设为 0.0.0.0 就可以从其他机器访问 API;rpccorsdomain 参数是为了解决 web3 从浏览器中跨域调用的安全限制问题。
  • 以后启动节点,只要直接执行这个脚本即可:
C:\Users\xxx\node1> console.cmd

  
 
  • 1

④ 账户管理

(A)查看账户列表

  • 在 geth 控制台,使用 eth 对象的 accounts 属性查看目前的账户列表:
> eth.accounts
[
]

  
 
  • 1
  • 2
  • 3
  • 由于还没有创建账户,因此这个列表还是空的。

(B)创建新账户

  • 在 geth 控制台,使用 personal 对象的 newAccount() 方法创建一个新账户,参数为自己选择的密码:
> personal.newAccount('78787878')
0xd8bcf1324d566cbec5d3b67e6e14485b06a41d49

  
 
  • 1
  • 2
  • 输出就是新创建的账户地址(公钥),你的输出不会和上面的示例相同,geth 会保存到数据目录下的 keystore 文件中。密码要自己记住,以后还需要用到。

(C)查询账户余额

  • 在 geth 控制台,使用 personal 对象的 getBalance() 方法获取挃定账户的余额,参数为账户地址:
> eth.getBalance(eth.accounts[0])
0

  
 
  • 1
  • 2
  • 或者直接输入账户地址:
> eth.getBalance('0xd8bcf1324d566cbec5d3b67e6e14485b06a41d49')
0

  
 
  • 1
  • 2
  • 新创建的账户,余额果然为0。

(D)挖矿

  • 没钱的账户什么也干不了,需要挖矿来挣点钱。在 geth 控制台执行 miner 对象的 start() 方法来启动挖矿:
> miner.start(1)

  
 
  • 1
  • 等几分钟以后,检查账户余额:
> eth.getBalance(eth.accounts[0])
2.695e+21

  
 
  • 1
  • 2
  • 钱比较多,2695ETH,目前市值将近 500 万人民币。执行 miner 对象的 stop() 方法停止挖矿:
> miner.stop()

  
 
  • 1

(E)解锁账户

  • 在部署合约时需要一个解锁的账户,在 geth 控制台使用 personal 对象的 unlockAccount() 方法来解锁指定的账户,参数为账户地址和账户密码(在创建账户时指定的那个密码):
> eth.unlockAccount(eth.accounts[0],'78787878')
true

  
 
  • 1
  • 2

三、构建示例项目

① 新建 DApp 项目

  • 执行以下命令创建项目目录并进入该目录:
C:\Users\xxx> mkdir demo
C:\Users\xxx> cd demo

  
 
  • 1
  • 2
  • 然后用 webpack 模版初始化项目的骨架结构:
C:\Users\xxx\demo> truffle.cmd unbox webpack
Downloading…
Unpacking…
Setting up…
Unbox successful. Sweet!

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

② 安装项目依赖的 NPM 包

  • 执行以下命令安装 nmp 包:
C:\Users\xxx\demo$ npm install

  
 
  • 1

③ 修改 truffle 配置

  • 如果使用图形版的 ganache,不需要修改 truffle.js 配置文件。否则,需要在 truffle.js 中,修改 port 为 8545,因为 ganache-cli 在 8545 端口监听:
module.exports = {
	networks: {
		development: {
			port: 8545
		}
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

④ 启动节点

  • 执行以下命令启动节点仿真器,以便部署合约并执行交易:
C:\Users\xxx\node1> console.cmd

  
 
  • 1
  • 为了在节点上部署合约,别忘记启动 geth 后先解锁账户:
> personal.unlockAcount(eth.accounts[0],'78787878')
true

  
 
  • 1
  • 2

⑤ 编译合约

  • 执行以下命令编译项目合约:
C:\Users\xxx\demo> truffle.cmd compile

  
 
  • 1

⑥ 部署合约

  • 执行以下命令来部署合约:
C:\Users\xxx\demo> truffle.cmd migrate

  
 
  • 1
  • 如果之前忘记在 geth 控制台解锁账户,会看到如下错误,参考前面说明进行解锁即可:
…
Error: authentication  needed: password or unlock

  
 
  • 1
  • 2
  • 如果已经正确地解锁账户,会看到部署过程停止在如下状态:
Replacing Migrations…
… 0x3088762a5bc9
 
  • 1
  • 2
  • 这是因为 truffle 在等待部署交易提交,但是在私链中还没有启动挖矿。现在切换回 geth 终端窗口,查看交易池的状态:
> txpool.status
{
	pending:1,
	queued:0
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 果然有一个挂起的交易,启动挖矿即可:
> miner.start(1)

  
 
  • 1
  • 稍等一小会儿,再查看交易池的状态:
> txpool.status
{
pending:0,
queued:0
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 交易已经成功提交,可以停止挖矿了,因为它太占 CPU:
> miner.stop()

  
 
  • 1
  • 现在切换回 truffle 那个终端,部署过程也正确地执行完。

⑦ 启动 DApp

  • 执行以下命令来启动 DApp:
C:\Users\xxx\demo> npm run dev

  
 
  • 1

在这里插入图片描述

  • 如果希望从别的机器也可以访问 DApp 应用,可以修改一下 package.json:
{
	scripts:{
		"dev":"webpack-dev-server –-host 0.0.0.0"
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

文章来源: blog.csdn.net,作者:╰つ栺尖篴夢ゞ,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Forever_wj/article/details/125850122

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。