目录


  Geth是由以太坊基金会提供的客户端,通过客户端的交互式命令控制台可以使用以太坊的API。

  下面记录一下我利用Geth学习区块链的过程。
 

一、下载Geth

官方链接:https://geth.ethereum.org/downloads/

个人环境:MacOS
image-1667203732435

  下载成功后解压即可,解压出来的文件包括COPYING和一个二进制文件geth,可以把geth放到系统PATH中。
image-1691670102484
 

二、准备创世区块的配置文件

  先创建一个文件夹,用来存放之后区块链的相关数据。比如我存放的位置在 ~/Documents/Data/Geth/test
image-1691670127615

  然后在 ~/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的路径位置。
image-1667203786563

  看到Successfully wrote genesis state,说明初始化成功了。
image-1667203824853

  初始化成功后会生成gethkeystore目录,其中 geth/chaindata中存放的是区块数据,keystore中存放的是账户数据。

四、启动私有链节点

geth --datadir . --networkid 666 console

–networkid 666 中的666就是创世区块配置文件中的chainId
image-1667203859247

看到Welcome to the Geth JavaScript console!说明没问题
image-1667203881097

五、新建账户

通过eth.accounts可以查看当前有哪些账户,现在的账户列表为空

eth.accounts

通过personal.newAccount("1024"),可以创建一个账户,"1024"是该账户的密码,创建成功后会返回该账户的公钥。如下图:

personal.newAccount("1024")

image-1691670172775
创建完账户再执行eth.accounts,可以看到账户列表中已经有了新创建的账户的公钥了。

六、开始生成区块

通过eth.getBalance()可以查看指定账户的余额,参数可以是账户的公钥,也可以是账户在账户列表的位置

eth.getBalance(“0x28b8c8effbb60999c05380de8b84353176cf3780”)

eth.getBalance(eth.accounts[0])

此时第一个账户的余额是0
image-1667203922934

开始生成区块,生成第一个区块后停止

miner.start(1);admin.sleepBlocks(1);miner.stop();

image-1667204004956

percentage到100时生成区块完毕。

使用eth.blockNumber可以查看当前有几个区块,使用eth.getBlock()可以查看指定区块的信息
image-1667204036372

第一个账户生成了创世区块,获得了生成区块奖励。
image-1667204076208

 

参考链接:
https://www.cnblogs.com/wkfvawl/p/11211600.html
https://www.cnblogs.com/yty2152/p/10432691.html