环境:Windows10 + VirtualBox + Ubuntu16.04.6
参考教程: https://blog.csdn.net/kevinyankai/article/details/98623397?utm_source=app
以太坊是一个开源的有智能合约功能的公共区块链平台。在这个平台上,使用它专用的加密货币——以太币(ETH)提供去中心化的以太虚拟环境处理点对点的合约。
Geth是以太坊的客户端,其全称是go-ethereum。以太坊的客户端用于接入以太坊网络,进行账户的管理、交易、挖矿、智能合约部署开发等相关的工作。
Geth的安装方式:通过直接下载程序进行安装
依次执行以下命令:
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo add-apt-repository -y ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install ethereum
geth --help
#尽量不要在需要管理员权限的路径下创建工作目录,避免出现因权限问题引起的麻烦
mkdir ~/privatechain
#data目录用于存放账户信息和区块数据
mkdir ~/privatechain/data
在privatechain目录下新建genesis.json文件,文件内容如下:
cd ~/privatechain
vim genesis.json
{
"config": {
"chainId": 666,
"homesteadBlock": 0,
"eip150Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"ethash": {}
},
"nonce": "0x0",
"timestamp": "0x5ddf8f3e",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x47b760",
"difficulty": "0x00002",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": { },
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
三、创建创世区块
geth --datadir ./data init genesis.json
创建创世区块完成之后,会生成两个文件:geth和keystore。
geth目录保存所见区块链的区块数据。
keystore目录用于保存用户的账户数据。
#–datadir 表示当前区块链网络数据存放的位置
#–nodiscover 表示该链禁止被其他节点发现 # console 2>>geth.log 表示将日志输出到geth.log。
geth --datadir ./data --nodiscover console 2>>geth.log
在私有链上查看自己的账户:输入命令:
eth.accounts
[]表示该私有链中的账户为空。虽然以太坊的私有链被创建出来了,但是没有任何用户。
在本实验中我们创建两个账户,其中newAccount的参数为账号密码,这里新账户的密码分别为123456和000000。
personal.newAccount("123456")
personal.newAccount("000000")
查看私有链的账户信息:
查看账户中的余额,由于没有挖矿,账户中的余额为0。
通过eth.coinbase设置进行挖矿的账户:
eth.coinbase
miner.start()
tail -f geth.log
初次挖矿的时候要等的时间长一点。
查看账户的余额:
此时显示的账户余额的单位为Wei,如果要转成以太币,可进行如下操作:
提示:Wei是以太币的最小单位,1Eth(以太币)= 1,000,000,000,000,000,000 Wei (10的18次方)。
在转账前先查看一下两个账户的余额:
执行以下转账命令,将第一个账户的1个以太币转到第二个账户下:
执行后显示上述问题,从提示可以看出是账户没有解锁,需要先解锁才能执行转账操作。解锁命令如下:
第一个参数为解锁的账户;第二个参数是解锁的密码。返回ture表示解锁成功。
下面重新执行上面的转账操作,返回结果如下:
转账成功后返回的是交易的hash码。
此时查看账户的余额没有发生变化。
这是因为当前账户没有处于挖矿状态下,只有处于挖矿的状态下才能确认打包交易,此时我们可以在交易池中看到有一笔待确认的交易。执行以下命令查看交易池的信息:
从返回的结果中可以看到有一个待确认的交易。
此时重新启动挖矿:
miner.start()
此时可以在一个新的终端中进行查看:
表示挖矿成功。
停止挖矿:
miner.stop()
查看账户的余额:
可以看到第二个账户多了1个ETH,我的挖矿时间真的是太长了,两个多小时,现在查看一下第一个账户的余额,可能会有挖矿到的ETH。
可以看到,如果eth.accounts[0]原本有2个ETH,现在转给了eth.accounts[1]账户1个ETH,本应该剩余1个ETH,但是在挖矿的过程中,多增加了2个ETH。
查看区块总数
eth.blockNumber
eth.getBlock(1)
查看上面转账交易成功后输出的hash,通过该hash可以查看交易详细信息。
eth.getTransaction("交易hash")
Geth控制台内置了一些用来操作以太坊的JavaScript对象,用户可以直接使用这些对象。主要包括:
eth:包含一些跟操作区块链相关的方法
net:包含以下查看网络p2p状态的方法
admin:包含一些与管理节点相关的方法
miner:包含启动&停止挖矿的一些方法
personal:主要包含一些管理账户的方法
txpool:包含一些查看交易内存池的方法
Web3:包含了以上方法,还包含一些单位换算的方法
这些对象的常用命令有:
personal.newAccount():创建账户
personal.unlockAccount():解锁账户
eth.accounts:枚举系统中的账户
eth.getBalance():查看账户余额,返回值的单位为Wei。
eth.blockNumber:列出区块总数
eth.getTransaction():根据交易hash获取交易的详细信息
miner.start():开始挖矿
miner.stop():停止挖矿
eth.coinbase:挖矿奖励的账户
txpool.status:交易池中的状态