【产品也编程】技术小白用geth把自己的电脑变成ETH网络

在写这篇教程之前,我是连 cmd 都不知道使用的技术小白,在官方文档、技术博客、公司技术同事的帮助下,硬磕了1、2天才从0到1构建了一个ETH网络。以下是我呕心沥血整理的教程,应该是网上最小白的教程了。

1. 下载并安装geth,支持Windows、Mac、Linux、源码

安装包中包含Geth和开发者工具包

• Geth = 以太坊节点进程 + 与区块链交互的命令行客户端 + 密钥管理与签名工具;

• 开发者工具包,包含以下:

安装成功后,在本地指定目录新增以下程序:

安装成功后,geth会自动加入到系统环境变量中,因此可以直接打开Windows CMD输入 geth version,查看版本号,以此证明安装成功。

C:\Users\user>geth version

Geth

Version: 1.9.12-stable

Git Commit: b6f1c8dcc058a936955eb8e5766e2962218924bc

Git Commit Date: 20200316

Architecture: amd64

Protocol Versions: [65 64 63]

Go Version: go1.13.8

Operating System: windows

GOPATH=

GOROOT=C:\go

2. 在启动geth程序之前,先创建以太坊公私钥对,打开Windows cmd, 输入 geth account new , 输入密码,为了安全,输入的密码是不会在cmd上显示出来的, 成功后,钱包地址会显示出来,私钥文件自动存在本地默认目录下,并且再次文字强调要保管好私钥。

C:\Users\user>geth account new

INFO [04-10|17:58:44.410] Maximum peer count                      ETH=50 LES=0 total=50

Your new account is locked with a password. Please give a password. Do not forget this password.

Password:

Repeat password:


Your new key was generated

Public address of the key:  0xAb4a26Ca4cD52a84d6fc9fb2D7472D2C228742F7

Path of the secret key file: C:\Users\user\AppData\Local\Ethereum\keystore\UTC--2020-04-10T09-58-59.166758700Z--ab4a26ca4cd52a84d6fc9fb2d7472d2c228742f7

- You can share your public address with anyone. Others need it to interact with you.

- You must NEVER share the secret key with anyone! The key controls access to your funds!

- You must BACKUP your key file! Without the key, it's impossible to access account funds!

- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!

可以创建多个公私钥对,私钥都是保存在同一个文件夹中。输入 geth account list,可以将这个文件夹中所有的公私钥对显示出来。

C:\Users\user>geth account list

INFO [04-10|18:27:17.007] Maximum peer count                      ETH=50 LES=0 total=50

Account #0: {ab4a26ca4cd52a84d6fc9fb2d7472d2c228742f7} keystore://C:\Users\user\AppData\Local\Ethereum\keystore\UTC--2020-04-10T09-58-59.166758700Z--ab4a26ca4cd52a84d6fc9fb2d7472d2c228742f7

Account #1: {820118cd4a04278c773ad30606798d84ce3578e9} keystore://C:\Users\user\AppData\Local\Ethereum\keystore\UTC--2020-04-10T10-25-07.390348400Z--820118cd4a04278c773ad30606798d84ce3578e9

3. 如果需要部署的是私链,可以手动创建创世的json文件,也可以用开发者工具中的puppeth,命令行交互式的完成配置,然后在同级目录下生成一份js文件。支持配置的选项有:链的名字、链ID、POA算法还是POW算法、预充值账户、允许挖矿的账户等,如下:

+-----------------------------------------------------------+

| Welcome to puppeth, your Ethereum private network manager |

|                                                          |

| This tool lets you create a new Ethereum network down to  |

| the genesis block, bootnodes, miners and ethstats servers |

| without the hassle that it would normally entail.        |

|                                                          |

| Puppeth uses SSH to dial in to remote servers, and builds |

| its network components out of Docker containers using the |

| docker-compose toolset.                                  |

+-----------------------------------------------------------+

Please specify a network name to administer (no spaces, hyphens or capital letters please)

> myethtestnet

Sweet, you can set this via --network=myethtestnet next time!

�[32mINFO �[0m[04-11|17:01:54.956] Administering Ethereum network          �[32mname�[0m=myethtestnet

�[33mWARN �[0m[04-11|17:01:55.141] No previous configurations found        �[33mpath�[0m=.puppeth\\myethtestnet

What would you like to do? (default = stats)

1. Show network stats

2. Configure new genesis

3. Track new remote server

4. Deploy network components

> 2

What would you like to do? (default = create)

1. Create new genesis from scratch

2. Import already existing genesis

> 1

Which consensus engine to use? (default = clique)

1. Ethash - proof-of-work

2. Clique - proof-of-authority

> 2

//最好选择POA算法,出块时间固定,ETH最大测试网rinkeby用的就是POA算法

How many seconds should blocks take? (default = 15)

> 5

//设置5秒出个块,对应json文件clique:{"period"}

Which accounts are allowed to seal? (mandatory at least one)

> 0xAb4a26Ca4cD52a84d6fc9fb2D7472D2C228742F7

> 0x820118Cd4a04278c773aD30606798D84cE3578e9

> 0xaFdd64dc5A421cB35ceC78eC991e153045Ca2aB8

> 0x

//一个机器也可以部署多个节点,3个节点基本上可以覆盖全部测试场景

Which accounts should be pre-funded? (advisable at least one)

> 0xAb4a26Ca4cD52a84d6fc9fb2D7472D2C228742F7

> 0x820118Cd4a04278c773aD30606798D84cE3578e9

> 0xaFdd64dc5A421cB35ceC78eC991e153045Ca2aB8

> 0x

Should the precompile-addresses (0x1 .. 0xff) be pre-funded with 1 wei? (advisable yes)

> no

// 如果选 yes,那么从 0x0000000000000000000000000000000000000000 到

// 0x00000000000000000000000000000000000000ff 这些地址都会有 1wei 的以太币。

// 这个看情况选择,用得着就选 yes

Specify your chain/network ID if you want an explicit one (default = random)

>

�[32mINFO �[0m[04-11|17:12:53.755] Configured new genesis block

What would you like to do? (default = stats)

1. Show network stats

2. Manage existing genesis

3. Track new remote server

4. Deploy network components

>

但是 geth 在读取这个配置文件时,只会取到「“genesis”」这个字段,后面的字段不会取到,所以要将 "genesis" 字段的内容作为这个 json 文件的内容(相当于删除{ "genesis":这段字符和文件末尾最后一个})。

3. 创建节点数据存储的文件夹,并用创世文件初始化节点。创建文件夹可以通过CMD自带的 mkdir 实现,也可以直接在GUI的文件夹下创建。指定节点数据存储位置用 datadir 选项,读取创世配置文件初始化节点用 init 命令。

C:\Users\user>e:

E:\>cd myethtestnet

//我希望节点数据存储在E盘,所以先指定根目录

E:\myethtestnet>geth --datadir ./node1  init ./mygenesis

INFO [04-11|17:39:37.240] Maximum peer count                      ETH=50 LES=0 total=50

INFO [04-11|17:39:37.687] Allocated cache and file handles        database=E:\\myethtestnet\\node1\\geth\\chaindata cache=16.00MiB handles=16

INFO [04-11|17:39:37.807] Writing custom genesis block

INFO [04-11|17:39:37.820] Persisted trie from memory database      nodes=4 size=657.00B time=998.4µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B

INFO [04-11|17:39:37.841] Successfully wrote genesis state        database=chaindata                                hash=838c17…ced2bd

INFO [04-11|17:39:37.854] Allocated cache and file handles        database=E:\\myethtestnet\\node1\\geth\\lightchaindata cache=16.00MiB handles=16

INFO [04-11|17:39:38.080] Writing custom genesis block

INFO [04-11|17:39:38.088] Persisted trie from memory database      nodes=4 size=657.00B time=1.0142ms gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B

INFO [04-11|17:39:38.110] Successfully wrote genesis state        database=lightchaindata                          hash=838c17…ced2bd

//初始化第一个节点node1

E:\myethtestnet>geth --datadir ./node2  init ./mygenesis

INFO [04-11|17:40:50.190] Maximum peer count                      ETH=50 LES=0 total=50

INFO [04-11|17:40:50.627] Allocated cache and file handles        database=E:\\myethtestnet\\node2\\geth\\chaindata cache=16.00MiB handles=16

INFO [04-11|17:40:50.746] Writing custom genesis block

INFO [04-11|17:40:50.753] Persisted trie from memory database      nodes=4 size=657.00B time=999.8µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B

INFO [04-11|17:40:50.765] Successfully wrote genesis state        database=chaindata                                hash=838c17…ced2bd

INFO [04-11|17:40:50.770] Allocated cache and file handles        database=E:\\myethtestnet\\node2\\geth\\lightchaindata cache=16.00MiB handles=16

INFO [04-11|17:40:50.879] Writing custom genesis block

INFO [04-11|17:40:50.887] Persisted trie from memory database      nodes=4 size=657.00B time=997.8µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B

INFO [04-11|17:40:50.910] Successfully wrote genesis state        database=lightchaindata                          hash=838c17…ced2bd

//初始化第二个节点node2

E:\myethtestnet>geth --datadir ./node3  init ./mygenesis

INFO [04-11|17:41:08.357] Maximum peer count                      ETH=50 LES=0 total=50

INFO [04-11|17:41:08.781] Allocated cache and file handles        database=E:\\myethtestnet\\node3\\geth\\chaindata cache=16.00MiB handles=16

INFO [04-11|17:41:08.937] Writing custom genesis block

INFO [04-11|17:41:08.946] Persisted trie from memory database      nodes=4 size=657.00B time=1.0007ms gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B

INFO [04-11|17:41:08.974] Successfully wrote genesis state        database=chaindata                                hash=838c17…ced2bd

INFO [04-11|17:41:08.989] Allocated cache and file handles        database=E:\\myethtestnet\\node3\\geth\\lightchaindata cache=16.00MiB handles=16

INFO [04-11|17:41:09.112] Writing custom genesis block

INFO [04-11|17:41:09.118] Persisted trie from memory database      nodes=4 size=657.00B time=0s      gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B

INFO [04-11|17:41:09.146] Successfully wrote genesis state        database=lightchaindata                          hash=838c17…ced2bd

//初始化第三个节点node3

初始化节点成功后,会在指定目录下增加两个文件夹:

其中 geth/chaindata 中存放的是区块数据,keystore 中存放的是账户数据

4. 配置节点P2P发现网络。新节点要接入P2P网络,至少要发现网络中的一个节点。加入公共网络,直接启动节点即可,因为节点代码中已经写死了boot节点;创建私网,需要用 --networkid="12345" 连接上已知节点;或者将静态节点的地址写到 static-nodes.json 文件中,始终通过静态节点发现网络。我们采用静态节点发现网络的方式,将3个节点的地址全部加到文件中。

先需要知道节点的P2P地址,查询方法,运行geth(记得用 --datadir 指定数据存储位置),运行后按 Ctrl+C 停止运行:

E:\myethtestnet>geth --datadir ./node2

……

……

INFO [04-11|18:20:59.174] Started P2P networking                  self=enode://c1f667baf27075879900ef48b90c55842c7dfcf2fc63710fdd36955438131087fe259156c0b4595a4fb7ad293b982609ee81edab321f08f61617b02d554dec71@127.0.0.1:30303

在运行过程中输出的log中,有这么一行:enode:……@127.0.0.1:30303。就是该节点的P2P地址,注意P2P地址不是IP地址。

接着创建static-nodes.json 文件,文件名一定要一致,按照以下格式输入三个节点的地址:

[

  "enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0@33.4.2.1:30303",

  "enode://pubkey@ip:port"

]

注意,3个节点的端口(port)号不能一样。

注意,一定要将json文件放在节点目录下,如:E:\myethtestnet\node3

5. 启动节点,使用以下命令:

geth --datadir ./node1 --unlock 0 --mine --rpc

geth --datadir ./node2 --unlock 0 --mine --port 30304

geth --datadir ./node3 --unlock 0 --mine --port 30305

--mine,有该选项表示该节点支持挖矿;

--rpc,有该选项表示该节点启动rpc功能,除了第一个节点,其它节点都没有启动 rpc 功能。一是因为 rpc 功能有一个节点启动就够用了;二是因为多个节点启动 rpc 功能,rpc 端口被第一个启动的节点占用,后面的启动就会报失败;

--port,指定了P2P连接的端口,需要与 static-nodes.json 文件中的端口一致,且不同节点不能重复;

节点启动,默认是按照fast节点模式运行。补充说明一下ETH共有三种节点模式:

• Full: Downloads all blocks (including headers, transactions and receipts) and generates the state of the blockchain incrementally by executing every block.

• Fast (Default): Downloads all blocks (including headers, transactions and receipts), verifies all headers, and downloads the state and verifies it against the headers.

• Light: Downloads all block headers, block data, and verifies some randomly.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景: 阅读新闻 12C CDB模式下RMAN备份与恢复 [日期:2016-11-29] 来源:Linux社区 作...
    阳屯okyepd阅读 3,608评论 0 7
  • 目标:逐步指导,帮助你使用权威证明共识引擎(也称为clique)设置本地私有以太网网络。 简而言之:我们将在同一台...
    编程狂魔阅读 1,532评论 0 1
  • “你相信死后重生吗?”老板问他的一名雇员。 “相信,先生。”这个员工回答。 “哦,那么每一件事就正正好了这么说来,...
    终遇伞上花阅读 135评论 0 0
  • 今天看到排地铁等待的人里几个在玩儿消消乐。 我没忍住,在那个间歇里,我也点击了下载。 还没下载完,然后地铁来了。就...
    ArtisticYouth阅读 434评论 0 2
  • 一:任务分解 A:总任务制定1500件 周一到周四:每天40件 周五到周日:每天70件 B:个人业绩分解与规划 1...
    邬晓乐阅读 420评论 0 0