能够直接下载程序进行安装,也能够下载源码本身进行编译安装,本文介绍源码编译方式。node
go get github.com/ethereum/go-ethereum
cd go-ethereum make geth 或者 make all
$GOPATH$/src ├── github.com │ └── ethereum │ └── go-ethereum └── golang.org └── x └── net
go install -v github.com/ethereum/go-ethereum/cmd/geth go install -v github.com/ethereum/go-ethereum/cmd/evm
编译成功,在$GOPATH$/bin下会出现:geth.exe和evm.exegit
将 geth 添加到环境变量中 github
# ubuntu下 vi ~/.bashrc # mac下 vi ~/.bash_profile # 打开配置文件后,把如下内容添加到文件中 export GETH="$GOPATH/src/github.com/ethereum/go-ethereum/build" export PATH="$PATH:$GETH/bin"
而后执行,使配置生效。golang
source ~/.bashrc
windows下,直接将bin路径添加到Path环境变量中web
检查是否安装成功json
geth --help
若是输出一些帮助提示命令,则说明安装成功。ubuntu
# ubuntu和mac mkdir ~/privatechain mkdir ~/privatechain/data # data用于存放帐户和区块数据 # windows,在D盘创建文件夹privatechain,并在其下创建data文件夹
geth --datadir data --nodiscover console
则进入geth控制台(交互式的 Javascript 执行环境),默认端口为8545和30303端口windows
personal.newAccount("123456") # 123456为密码 # 出现的如下一串字符,则为建立的帐户 "0x3bfd5f0306ffe7b93e56989fd11d5678ce32cfe6"
eth.getBalance(eth.accounts[0]) # 此时会显示为 0
exit
{ "alloc": { "0x3bfd5f0306ffe7b93e56989fd11d5678ce32cfe6": { "balance": "100000000000000000000000000" } }, "config":{ "chainId":10, "homesteadBlock":0, "eip155Block":0, "eip158Block":0 }, "nonce":"0x0000000000000042", "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000", "difficulty": "0x2000", "alloc": {}, "coinbase":"0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "", "gasLimit":"0xffffffff" }
创世区块信息写在一个 JSON 格式的配置文件中bash
此处个人配置,在"0x3bfd5f0306ffe7b93e56989fd11d5678ce32cfe6"中预置了1亿的币网络
各个参数的含义以下:
geth --datadir data init genesis.json
若是出现错误提示,能够先删除原来的创世块
geth removedb --datadir data
再次执行
geth --datadir data init genesis.json
初始化成功后,会在数据目录 data 中生成 geth 和 keystore 两个文件夹,此时目录结构以下:
privatechain ├── data │ ├── geth │ │ ├── chaindata │ │ │ ├── 000001.log │ │ │ ├── CURRENT │ │ │ ├── LOCK │ │ │ ├── LOG │ │ │ └── MANIFEST-000000 │ │ └── lightchaindata │ │ ├── 000001.log │ │ ├── CURRENT │ │ ├── LOCK │ │ ├── LOG │ │ └── MANIFEST-000000 │ └── keystore └── genesis.json
其中 geth/chaindata
中存放的是区块数据,keystore
中存放的是帐户数据。
进入geth控制台
geth --datadir data --networkid 10 console
指定网络id(networkid)为上面设置的10
# 123456为密码 personal.unlockAccount(eth.accounts[0],"123456")
amount = web3.toWei(10,'ether') eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
此时查询帐户余额没发生变化,须要进行挖矿确认打包交易
经过 miner.start()
启动挖矿
> miner.start(3)
其中 start 的参数表示挖矿使用的线程数。第一次启动挖矿会先生成挖矿所需的 DAG 文件,这个过程有点慢,等进度达到 100% 后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。
中止挖矿,在 console 中输入:
miner.stop()
挖到一个区块会奖励5个以太币,挖矿所得的奖励会进入矿工的帐户,这个帐户叫作coinbase,默认状况下coinbase是本地帐户中的第一个帐户:
> eth.coinbase "0xfb9cc019fc650a1699d05b7fb564b83c3a72b64d"
能够经过 miner.setEtherbase()
将其余帐户设置成 coinbase
便可
> miner.setEtherbase(eth.accounts[1]) true > eth.coinbase "0xc6b5702b15a3794374e28f41f36e1e8dbdd564df"
从新启动挖矿,查看 eth.accounts[1]
是否能够得到以太币
> miner.start(3) //等待几秒后 > miner.stop()
查询帐户余额:
> eth.getBalance(eth.accounts[0]) 280000000000000000000 # wei > eth.getBalance(eth.accounts[1]) 210000000000000000000 > web3.fromWei(eth.getBalance(eth.accounts[1]),'ether') # wei换算成ether 210
发现帐户0 和 帐号1 都有以太币,说明 miner.setEtherbase()
设置成功。
getBalance()
返回值的单位是wei,wei是以太币的最小单位,1个以太币=10的18次方个wei。要查看有多少个以太币,能够用web3.fromWei()将返回值换算成以太币:
> web3.fromWei(eth.getBalance(eth.accounts[0]),'ether') 280 > web3.fromWei(eth.getBalance(eth.accounts[1]),'ether') 210
查看当前区块总数:
eth.blockNumber
经过区块号查看区块:
eth.getBlock(6)
经过交易hash(hash 值包含在上面交易返回值中)查看交易:
eth.getTransaction("0x493e8aa2bcb6b2a362bdbd86b2c454279e14beea43b444aeb45c7f667bf572e2")
控制台内置了一些用来操做以太坊的 Javascript 对象,能够直接使用这些对象。这些对象主要包括:
经常使用命令有:
获取第一个节点的enode信息
admin.nodeInfo.enode
结果以下:
"enode://fe6dd2e69ceea3eb8daddc4cb1453a00d7094df6486c214062a5d0ec5b020b9d832508b80594a323cbbd6ddb4ddd06257103a2f08173ef7e31e19f302f4e5f9e@[::]:30303?discport=0"
在第二个节点中执行添加第一个节点的操做
admin.addPeer("enode://fe6dd2e69ceea3eb8daddc4cb1453a00d7094df6486c214062a5d0ec5b020b9d832508b80594a323cbbd6ddb4ddd06257103a2f08173ef7e31e19f302f4e5f9e@192.168.137.1:30303")
注意:enode信息中的[::]替换成第一个节点的ip,问号及后面部分不须要
// 查看链接的节点数量,此处为1 net.peerCount // 查看链接的节点信息 admin.peers
结果以下:
[{ caps: ["eth/63"], id: "352c2a755ea629dba803dda4e8e2708fca746838b2c91ea329713fd2c2ccbc0d1dd34fe905c1157fafb775383cf6f4f21e94a4b2533a8282806dd4fda81a5bd7", name: "Geth/v1.8.10-unstable-998f6564/darwin-amd64/go1.10.2", network: { inbound: true, localAddress: "192.168.137.1:30303", remoteAddress: "192.168.137.16:53022", static: false, trusted: false }, protocols: { eth: { difficulty: 131072, head: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0", version: 63 } } }]
此时,节点1和节点2均可以进行挖矿,而且只要有一个节点在进行挖矿,其余节点的交易也都能正常进行。在节点1能够查询节点2中帐户的余额,也能够在不一样节点之间进行转帐。