010:搭建测试网络|《ETH原理与智能合约开发》笔记

待字闺中开发了一门区块链方面的课程:《深入浅出ETH原理与智能合约开发》,马良老师讲授。此文集记录我的学习笔记。

课程共8节课。其中,前四课讲ETH原理,后四课讲智能合约。
第三课分为三部分:

  1. 以太坊区块结构
  2. GHOST协议
  3. 搭建测试网络

这篇文章是第三课第三部分的学习笔记:搭建测试网络。


这节课是使用Go-ethereum搭建一个测试网络,并使用它观察交易的变化。
本节课内容需要在以太坊平台搭建的基础上完成。

老师给出的操作步骤文档为:

testnet_howto_v0.1_cn.txt


我的操作如下:

  1. 首先创建目录

    mkdir -p ~/testnet/chaindata/

后面生成的数据会保存在这个目录里。

  1. 生成新的地址(账户)用于预分配 ether

    ./geth account new --datadir ~/testnet/chaindata/

过程中系统会要求输入这个账户的密码, 生成以后保存好这个地址, 和地址对应的密码。

  1. 清除数据库,方便后期的初始化。

    ./geth removedb --datadir ~/testnet/chaindata/

  2. 编辑 ~/testnet/CustomGenesis.json

视频中,老师的JSON文件是在~/go-ethereum/vendor文件夹,用cp ../../vendor/CustomGenesis.json ~/testnet/命令,把JSON文件复制到~/testnet/目录。

使用 vim ~/testnet/CustomGenesis.json 打开文件,替换掉里面的地址为第2步生成的地址。

特别注意:替换地址一定要记得做,我在做练习时,经常忘了这一步。

VIM的使用也要多练习。

  1. 使用创始块配置文件初始化测试网络
    ./geth --identity "BlcokGeekTestNode" --datadir ~/testnet/chaindata init ~/testnet/CustomGenesis.json

  2. 运行这个测试网络,里面的参数有一定的作用。
    ./geth --rpc --rpcaddr 0.0.0.0 --rpccorsdomain "*" --ws --wsaddr 0.0.0.0 --wsorigins "*" --datadir ~/testnet/chaindata --networkid 201803286666 --nodiscover

  3. 打开另外一个终端, 进入到 go-ethereum/build/bin 目录, 连接到测试网络
    ./geth attach ~/testnet/chaindata/geth.ipc

连续到测试网络后,左边会显示挖矿的收益地址已自动配置好,就是前面创建的地址。
可以使用eth.accounts命令查看地址。现在有一个地址。

至此,测试网络的搭建已经完成。接下来观察交易的过程。先来创建两个地址。

  1. 在这个连接中输入命令,括号里的参数是密码。
    personal.newAccount("test222")
    personal.newAccount("test333")

再使用eth.accounts可查看到,有三个地址了。

  1. 把已有的地址赋予给三个变量,方便后面的使用。
    addr1 = eth.accounts[0]
    addr2 = eth.accounts[1]
    addr3 = eth.accounts[2]

查询三个地址的余额: web3.fromWei(eth.getBalance(addr1), "ether") ,以ether为单位。可以看到,只有第一个地址里有余额。后面有18位小数。

  1. 设置挖矿收益人地址,(为了便于观察)

miner.setEtherbase(addr3)

再确认一下,eth.coinbase命令,显示的是地址3。

  1. 查看当前区块号:eth.blockNumber,显示的是0,因为还没有开始挖矿

  2. 发起交易

在不解锁的情况下直接转账,会报错。eth.sendTransaction({from:addr1, to:addr2, value: web3.toWei(10.0, "ether")})

解锁账号:personal.unlockAccount(addr1)

发起交易前先看交易池的状态:txpool.status,显示都为0
解锁后再进行转账:eth.sendTransaction({from:addr1, to:addr2, value: web3.toWei(10.0, "ether")}),左边的窗口显示,交易已提交。
再看交易池:txpool.status,显示有1个Pending。

  1. 开始挖矿,miner.start()
    当有区块产生时,要马上停止,miner.stop(),这样便于观察余额的变化。

操作了三四遍,终于来到挖矿这一步。但是挖了很长时间,没有挖出区块。在知识星球上提问,老师说配置低了(挖矿初始化很占内存,初始化完成后将挖矿就快了,与难度有关),于是修改虚拟机为4G内存,重做。
修改方法:Ubuntu右击,设置,系统页,改为4096M,OK,启动Ubuntu

又照着上述步骤做了一遍,挖矿成功。

  1. 分析结果。

查看区块号,挖出了3个区块。
查看交易池,交易被执行。
看三个账号的余额。地址2收到了10个以太币;发起人地址1少了不止10个以太币,因为还有交易费;地址3有15个多的以太币。每块奖励5个以太币(这个测试网络是老的规定),多的部分是交易费。

  1. 观察区块结构

当前区块是3,而挖出交易的是区块1,使用eth.getBlock(1) ,查看区块包含的具体内容。

可对照以太坊区块结构一节的内容。

Difficulty 区块难度。有很多因素决定,由一个公式算出。
gasLimit gas上限。比特币通过大小限制区块尺寸,而以太坊通过gas上限。
gasUsed 当区块被挖出时,实际的gas消耗。
logBloom 日志的Bloom过滤器
miner 挖矿收益人的地址。
extraDatamixHashnonce 三个与挖矿有关的参数。
number 直系父节点的个数.
parentHash 父区块的区块头散列值。
receiptsRoot 收据的状态树
sha3Uncles 叔块的哈希
stateRoot 全局状态树
timestamp 时间戳
transactions 交易的哈希。复制下来,后面可以查看交易的具体内容。
uncles 叔块列表,因为本例没有叔块,所以是空的。

  1. 获取交易的具体内容
    eth.getTransaction(参数),参数是交易的散列值,即前文的transactions值。各项参数意义都很明确,不再详述。

本课练习结束。课程中,搭建了测试网络,发起了交易,挖了矿,观察了三个地址余额的变化,观察了区块和交易的具体信息。


不足之处,请批评指正。

你可能感兴趣的:(010:搭建测试网络|《ETH原理与智能合约开发》笔记)