前言
本文为自己的学习笔记整理,可能有不准确的地方。
安装Geth
官方https://geth.ethereum.org/downloads/
国内镜像https://ethfans.org/wikis/Ethereum-Geth-Mirror
关于环境变量
自己配置的时候好像win8.1会自动将Geth的安装路径添加进Path中,win10下好像需要自己手动添加。可能记得不太准确,如果不确定可以检查一下Path下是否有Geth的安装路径,没有可以自己手动添加。
编写创世区块配置文件gensis.json
(需要手动提前创建好geth工作目录)
创世区块是区块链的起点,是区块链的第一块区块-0号区块,唯一没有前任的区块。这个协议确保了没有其它节点会和你节点的区块链版本一致,除非它们的创世区块和你的一模一样。
{
"config":{
"chainId":15,
"homesteadBlock":0,
"eip155Block":0,
"eip158Block":0
},
"alloc":{
},
"coinbase":"0x0000000000000000000000000000000000000000",
"difficulty":"0x20000",
"extraData":"0x777573686f756865",
"gasLimit":"0xfffffff",
"nonce":"0x0000000000000001",
"mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp":"0x00"
}
参数说明
初始化命令
(提前在geth工作目录下创建好db文件夹)
geth --datadir "./db" init gensis.json //初始化创世区块,并设置数据存储路径为db。
初始化成功后,会在数据目录db中生产geth和keystore两个文件夹,其中geth文件夹用于存放区块数据,keystore用于存放账户数据。
启动命令
geth --identity "testchain" --rpc --datadir "./db" --rpcapi "eth,net,web3,personal,admin,shh,txpool,debug,miner" --rpccorsdomain "*" --networkid 100 console
参数说明
此外,还可以使用如下参数:
进入JavaScript控制台
通过attach 命令,连接一个已经启动节点,启动js命令环境:
geth attach ipc:\.\pipe\geth.ipc(或者geth attach http://127.0.0.1:8545)
注意:需要先启动节点,另外开一个窗口。
常用命令
以太坊的JavaScript内置的一些对象:
eth:提供了操作区块链相关的方法;
net:提供了查看p2p网络状态的方法;
admin:提供了管理节点相关的方法;
minner:提供启动和停止挖矿的方法;
personal:提供了管理账户的方法;
txpool:提供了查看交易内存池的方法;
web3:除了包含以上对象中有的方法,还包含了一些单位换算的方法。
- 创建账户
命令:personal.newAccount("passwd") //传入的是账户的密码,执行成功会返回账户的公钥,生成的账户文件在keystore文件夹下。
- 查看所有的账户
命令:eth.accounts
- 查看余额
命令:balance=web3.fromwei(eth.getBalance(eth.accounts[0],"ether"))
其中,eth.accounts[index]会按传入的索引返回已有的账户,eth.getBalance(address)会返回账户的余额,余额单位为wei,传入的参数是账户的公钥,web3.fromWei()进行单位转换,这里是将wei转为ether。
(由于没有挖矿,所以余额为0.) - 挖矿
miner.setEtherbase(eth.accounts[0]) //设置挖矿奖励地址,其实默认情况是设置的为eth.accounts[0]。
eth.coinbase //查看挖矿奖励账号;
miner.start() //开始挖矿,有时候可能看不见后台数据,但是却执行了挖矿已经。具体要看一下账户是否已经有余额。
miner.stop() //停止挖矿; - 解锁账户
发送转账交易之前需要先节所账户,否则会报错。
personal.unlockAccount(eth.accounts[0],"123456")
或者personal.unlockAccount(eth.accounts[0],"123456","300")//第三个参数表示解锁持续的时间,单位为秒;
- 交易
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(1,"ether")})//会返回一个交易的hash;
(交易进行后必须启动挖矿,否则交易不会被打包,然后就会发现账号中仍然为0,交易没有生效。) - 查看交易
eth.getTransaction(transactionHash)//发起交易时的详情;
eth.getTransactionReceipt(transactionHash) //交易在区块中的详细信息;
- 查看当前区块总数
eth.blockNumber
- 查询最新区块
eth.getBlock(;latest)
还可以使用eth.getBlock(blockNumber)和eth.getBlock(blockHash)根据区块number和hash来查询区块。 - 查看当前节点信息
admin.nodeInfo
admin.nodeInfo.enode
- 添加其它节点
(如果要将其它节点接入网络需要将前面的配置操作重复一遍,gensis,json不能改变。)
方式一:静态(参考:https://segmentfault.com/p/1210000009213595/read)
步骤一:通过使用admin.nodeInfo.enode查看第一个节点的enode信息
enode: enode: "enode://1a1c94a8042d8c88103f2a17311eb8eb77c2ecd14ef89bfd6b90cef9bc184d0e5acb6c3d79b4218630987a889065dafe3769be6956e44c599dc5ba572518f857@IP:30303"
步骤二:在第二个节点下在{datadir}下添加文件 static-nodes.json,内容如下:
[
"enode://1a1c94a8042d8c88103f2a17311eb8eb77c2ecd14ef89bfd6b90cef9bc184d0e5acb6c3d79b4218630987a889065dafe3769be6956e44c599dc5ba572518f857@第一个节点的IP地址:30303"]
步骤三:完成节点二的初始化和启动操作。
方式二:动态
通过时用admin.addPeer()命令参数为步骤一中的enode信息
不管是静态还是动态连接,连接成功后,节点二就会开始同步节点一的区块,同步完成后,任意节点开始挖矿,另一个节点会自动同步区块,向任意节点发送交易,另一个节点也会收到该笔交易。 - 查看已连接的远程节点
admin.peers
查看连接的远处节点数
admin.peerCount
文件夹结构
为了方便我自己将命令都做成了bat文件,结构如下:
说明:- gensis.json是创世区块的配置文件
- init-private.bat是初始化命令
- start-private.bat是启动命令
- attach.bat为进入JavaScript控制台
static-node.json为静态配置远程节点
参考
[https://segmentfault.com/p/1210000009213595/read]
书籍推荐
《区块链开发实战-以太坊关键技术与案例分析》对于小白还是不错的