目录
Geth是由以太坊基金会提供的客户端,通过客户端的交互式命令控制台可以使用以太坊的API。
下面记录一下我利用Geth学习区块链的过程。
一、下载Geth
官方链接:https://geth.ethereum.org/downloads/
个人环境:MacOS
下载成功后解压即可,解压出来的文件包括COPYING和一个二进制文件geth,可以把geth放到系统PATH中。
二、准备创世区块的配置文件
先创建一个文件夹,用来存放之后区块链的相关数据。比如我存放的位置在 ~/Documents/Data/Geth/test
然后在 ~/Documents/Data/Geth/test
目录中增加一个genesis.json文件,文件内容如下:(文件名可以随意起)
{
"config": {
"chainId": 66, //该链的ID。在用geth 启动区块链时,还需要指定一个network 参数。只有当network、chainID、创世区块配置都相同时,才是同一条链。
"homesteadBlock": 0, //相关协议机制的升级区块所在的高度,签名算法是homestead ->eip155 -> eip158,所以从homesteadBlock 之前区块都通过homestead 相关算法机制来验证,homesteadBlock 到eip155Block 之间的用eip155 算法来验证,依次类推。
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"coinbase" : "0x0000000000000000000000000000000000000000", //每挖出一个区块,都会获得奖励。该值指定默认情况下把奖励给到哪个账户。实际上,我们每次开始生成区块之前,都会自己指定miner.setEtherbase(UserAddress),一般都会把奖励给自己
"difficulty" : "0x40000", //定义了每次生成区块时,最终确定nonce 的难度
"extraData" : "",
"gasLimit" : "0xffffffff", //规定该区块链中,gas 的上限
"nonce" : "0x0000000000000042", //预定一个随机数,这是一个与PoW 机制有关的值
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", //一个与PoW 机制有关的值
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", //在区块链中,区块是相连的,parentHash 指定了本区块的上一个区块Hash。对于创世区块来说,parentHash 为0
"timestamp" : "0x00", // 时间戳,规定创世区块开始的时间
"alloc": { } //代表初始资产配置,在该区块链产生时,就预先赋予这些账户一定数额的WEI(不是ETH)
}
可配置的参数不止这些,更多的配置可以到https://geth.ethereum.org/docs中查看。
三、初始化区块链
我把geth加到了环境变量中,所以可以直接用,没有加的可以用绝对路径运行。
geth --datadir . init genesis.json
--datadir是区块链数据存储的位置,我当前在test目录中,所以用.
, init genesis.json
就是用我们刚才编写的genesis.json进行初始化,注意genesis.json的路径位置。
看到Successfully wrote genesis state,说明初始化成功了。
初始化成功后会生成geth
和keystore
目录,其中 geth/chaindata中存放的是区块数据,keystore中存放的是账户数据。
四、启动私有链节点
geth --datadir . --networkid 666 console
–networkid 666 中的666就是创世区块配置文件中的chainId
看到Welcome to the Geth JavaScript console!说明没问题
五、新建账户
通过eth.accounts
可以查看当前有哪些账户,现在的账户列表为空
eth.accounts
通过personal.newAccount("1024")
,可以创建一个账户,"1024"是该账户的密码,创建成功后会返回该账户的公钥。如下图:
personal.newAccount("1024")
创建完账户再执行eth.accounts
,可以看到账户列表中已经有了新创建的账户的公钥了。
六、开始生成区块
通过eth.getBalance()
可以查看指定账户的余额,参数可以是账户的公钥,也可以是账户在账户列表的位置
eth.getBalance(“0x28b8c8effbb60999c05380de8b84353176cf3780”)
或
eth.getBalance(eth.accounts[0])
此时第一个账户的余额是0
开始生成区块,生成第一个区块后停止
miner.start(1);admin.sleepBlocks(1);miner.stop();
percentage到100时生成区块完毕。
使用eth.blockNumber
可以查看当前有几个区块,使用eth.getBlock()
可以查看指定区块的信息
第一个账户生成了创世区块,获得了生成区块奖励。
参考链接:
https://www.cnblogs.com/wkfvawl/p/11211600.html
https://www.cnblogs.com/yty2152/p/10432691.html