安装以太坊源码,即安装Go Ethereum(安装Geth)
1、安装Golang
可以直接使用 yum 这个包管理器安装Golang
yum install golang
2、下载以太坊源码(Go Ethereum)
首先下载geth源码 go-ethereum,这里以 go-ethereum-1.9.7.tar.gz,直接在GitHub下载
3、安装以太坊源码(安装Geth)
接下来解压源码:
tar -xzf go-ethereum-1.9.7.tar.gz
用下面的命令编译:
cd go-ethereum-1.9.7
make geth
make geth 也可以用make all 进行替代,make all 还会编译一些其他的程序套件
编译完成后,此时会在 go-ethereum-1.9.7/build/bin 中生成geth可执行文件。
输入 geth help 命令,会显示geth所有的命令和选项:
cd build/bin
./geth help
4、配置geth
直接使用geth命令可能出现:
-bash: geth: command not found
为其的安装路径建立软连接(要写对你解压的所在目录路径)
ln -s /root/geth/go-ethereum-1.9.7/build/bin/geth /usr/local/bin/geth
用 geth version 测试一下:
geth version
区块链是由若干个区块组成的。
因此我们首先需要为私有链创建第一个区块(即创世区块),类似于数据结构中链表的头节点。
5、创建创世区块
首先,你需要创建一个创世区块,这个区块的创建应该让所有节点都知道,并且都同意。
创建创世区块的配置主要存储于一个JSON文件中,这里我们存在一个叫genesis.json的文件中。
为了使结构更加清晰,先创建一个文件夹,专门存放私有链相关数据。
mkdir private_eth
cd private_eth
touch genesis.json
新建文件,命名:genesis.json,内容如下:
{
"config": {
"chainId": 10001,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0
},
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x20000",
"extraData": "",
"gasLimit": "0x2fefd8",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
如果你想为一些账户预先分配一些资金便于测试,那么可以在配置中创建账户并分配一些资金。
这时候,你只需要用下面的配置替换掉上面的”alloc”:{ }即可:
"alloc": {
"0x0000000000000000000000000000000000000001": {
"balance": "111111111"
},
"0x0000000000000000000000000000000000000002": {
"balance": "222222222"
}
}
6、初始化区块链
(1)初始化
启动之前,先进行初始化:
geth init genesis.json --datadir test
test目录表示保存区块链相关数据的目录,这里的test 与 genesis.json 文件在同一个目录下。
test目录是之前不存在的,执行后会自动生成。
test目录下有两个子目录:
geth:存储同步区块链以及相关的数据;
keystore:保存了账户文件。由于私链刚创建,此时keystore目录为空。
注意:如果直接执行
geth init genesis.json
可能会出现如下错误:
Fatal: Failed to write genesis block: database contains incompatible genesis (have d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3, new a3c5c170988f516e00ea3078b2461a149bcd4d0422c8c894923c6cfa22d6926b)
因此记得通过–datadir 设置相应的存储区块链相关数据的目录。
(2)启动以太坊客户端
geth --rpc --rpccorsdomain="*" --nodiscover --allow-insecure-unlock --datadir './test' console
执行成功之后,如下图所示:
以太坊一些常用相关参数总结:
// Ethereum参数
--config value:表示TOML配置文件的目录;
--datadir value:存储区块链相关数据的文件目录,包含geth和keystore两个文件夹(默认为 "/home/ligi/.ethereum"),geth目录存储同步区块链以及相关的数据,keystore存储账户相关数据;
--datadir.ancient value Data directory for ancient chain segments (default = inside chaindata)
--keystore value 账户秘钥的存储目录 (默认在datadir里面)
--networkid value 网络标识符 (integer, 1=Frontier, 2=Morden (disused), 3=Ropsten, 4=Rinkeby) (default: 1)
--testnet Ropsten network: pre-configured proof-of-work test network
--rinkeby Rinkeby network: pre-configured proof-of-authority test network
--syncmode value 区块链同步模式 ("fast", "full", or "light") (default: fast)
--exitwhensynced 块同步完成后退出
--identity value 自定义节点名称
//DEVELOPER CHAIN OPTIONS:
--dev 拥有一些预先设置了资金的开发者账户的临时权威证明网络,并且可以直接挖矿
--dev.period value 在开发者模式中使用块(出块)的时间,0表示只有在交易挂起的时候才会挖矿,1表示不用等有了交易才挖矿 (default: 0)
//ACCOUNT OPTIONS:
--unlock value 要解锁的账户列表(多个账户用逗号分隔)
--password value 用于非交互式密码输入的密码文件
//API AND CONSOLE OPTIONS:
--ipcdisable 禁用(关闭)IPC-RPC服务器
--ipcpath value Filename for IPC socket/pipe within the datadir (explicit paths escape it)
--rpc 启用HTTP-RPC服务器
--rpcaddr value HTTP-RPC服务器监听的IP地址 (default: "localhost")
--rpcport value HTTP-RPC 服务器监听端口(default: 8545)
--port:指定和其他节点连接所用的端口号(默认为 30303);
--rpcapi value 通过HTTP-RPC接口提供的API
--rpc.gascap value 设置可以在eth_call/estimateGas中使用的gas上限(默认值:0) (default: 0)
--rpccorsdomain value 哪些域名允许访问跨域请求(多个域名用逗号分隔)(浏览器执行),"*"表示允许通过任意域名进行访问
--rpcvhosts value 允许哪些虚拟主机名接受请求(多个的时候用逗号分开)(服务器执行). 接受 '*' 通配符. (default: "localhost")
--ws 启用WS-RPC服务器
--wsaddr value WS-RPC服务器监听的地址 (default: "localhost")
--wsport value WS-RPC服务器监听的端口号 (default: 8546)
--wsapi value WS-RPC接口提供的API
--wsorigins value 接受websockets请求的源
//NETWORKING OPTIONS:
--nodiscover 禁用节点发现机制,防止加入有同样初始配置的的陌生节点
--verbosity: 表示设置日志等级,0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default:
7、开始挖矿
使用之前genesis.json中配置的账户进行挖矿:
挖矿之前,先将账户和矿工进行绑定。
miner是JavaScript控制台中内置的矿工对象,在控制台中可以使用如下命令,将genesis.json文件中的“alloc”中的某个地址与miner对象进行绑定,绑定的目的之一就是为了明确挖矿得到的奖励存到哪个账户去。
miner.setEtherbase("0x0000000000000000000000000000000000000001")
开始挖矿之前,我们可以查看一下两个临时账户的余额:
eth.getBalance("0x0000000000000000000000000000000000000001")
eth.getBalance("0x0000000000000000000000000000000000000002")
开始挖矿
miner.start()
查看当前区块链中的区块数
eth.blockNumber
再次查询两个临时账户的余额
eth.getBalance("0x0000000000000000000000000000000000000001")
eth.getBalance("0x0000000000000000000000000000000000000002")
由于矿工挖矿得到了一些挖矿的奖励(以太币),所以我们可以发现与矿工绑定的账户的余额变多了。
停止挖矿
miner.stop()