环境安装过程详见前一篇。
这里利用geth命令创建一个私有区块链,然后自己挖矿,可以通过这个操作过程更深入理解以太坊和区块链的概念。
一、创建目录结构
创建完成后目录结构
geth
├── Private1
└── Block.json
Block.json文件,一个完整的区块描述文件比较复杂,这里是一些基本设置,这些设置项的描述如下:
{ "config": { "chainId": 15, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "coinbase" : "0x0000000000000000000000000000000000000000", "difficulty" : "0x40000", "extraData" : "", "gasLimit" : "0xffffffff", "nonce" : "0x0000000000000042", "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", "timestamp" : "0x00", "alloc": { } }
二、初始化命令
geth init Block.js --datadir Private1
执行后,产生的目录如下:
有两个子目录:geth和keystore。其中geth目录保存了同步区块链以及相关的数据,keystore目录保存了账户文件。由于私有链刚创建,还没有创建账户,所以keystore目录为空。
三、启动私有链
geth --datadir "Private1" --dev --dev.period 1 --nodiscover console 2>>geth.log
启动后进入javascript命令行控制台,显示 :
Welcome to the Geth JavaScript console!
以太坊的javascript控制台中内置了一些以太坊交互对象:
eth:提供了操作区块链相关的方法
net:提供了查看p2p网络状态的方法
admin:提供了管理节点相关的方法
miner:提供启动和停止挖矿的方法
personal:提供了管理账户的方法
txpool:提供了查看交易内存池的方法
web3:除了包含以上对象中有的方法,还包含了一些单位换算的方法
————————————————
四、以太坊私有链上的基本操作
1. 创建账号
查看账号列表:eth.accounts
创建账号密码:personal.newAccount("xxxxxxx")
2. 查看余额
以太币的最小单位为wei,1 ether = 10(18) wei,打不出来~
eth.getBalance(eth.accounts[0])
3. 账户与矿工绑定
绑定:miner.setEtherbase(eth.accounts[0])
查看:eth.coinbase
4. 开始挖矿
开挖:miner.start()
停止:miner.stop()
查看:eth.getBalance(eth.accounts[0])
5. 解锁账户
personal.unlockAccount(eth.accounts[2],"333333",300)
三个参数,三种方式
6. 交易
eth.sendTransaction({from: eth.accounts[2], to: eth.accounts[3],value: web3.toWei(1,"ether")})
五、参数说明参考
1. block.json参数
chainID | 指定了独立的区块链网络 ID。网络 ID 在连接到其他节点的时候会用到,以太坊公网的网络 ID 是 1,为了不与公有链网络冲突,运行私有链节点的时候要指定自己的网络 ID。不同 ID 网络的节点无法相互连接 |
homesteadBlock |
取值为0表示正在使用homesteadBlock版本。 以太坊的发展分成了四个阶段:(每个阶段进步到下一个阶段都是通过硬分叉的方式实现的) 1.Frontier(前沿):2015年7月30日,以太坊发布了Frontier阶段,此时的软件还不太成熟,但可以进行基本的挖矿测试去中心化应用(Dapps),该阶段参与者主要为开发者。 2.HomesteadBlock(家园):在2016年3月14日(圆周率节),以太坊发布了HomesteadBlock阶段。以太坊开始平稳运行,提供了图形界面的钱包,普通用户也可以体验和使用以太坊。 3.Metropolis(大都会):Metropolis被分成了两个阶段:Byzantium(拜占庭)和Constantinople (居士坦丁堡)。 2017.10.16,以太坊拜占庭硬分叉成功,引入了包括:zk-SNARKs(简明非交互零知识证明)、revert功能、return和抽象账户。 2019年2月底,以太坊区块链的第7,080,000区块作为激活点正式开启君士坦丁堡硬分叉,点在于将以太坊的共识机制由PoW向PoW+PoS混合机制过渡,从而使整个以太坊网络更加的轻盈、快捷与安全。按官方说法,具体在现有以太坊PoW主网上进行升级的有以下5个方面: (1).EIP 145:给EVM增加移位相关指令,包括左移SHL,逻辑右移SHR,算术右移SAR (2).EIP 1014:产生合约地址的一种新规则,与状态通道有关。规则为keccak256( 0xff ++ address ++ salt ++ keccak256(init_code)))[12:] (3).EIP 1052:为EVM增加EXTCODEHASH指令,这个指令可以获得一个合约bytecode的keccak256的hash值; (4).EIP 1283:修改EVM的SSTORE指令gas计算方式,预计会减少许多合约的gas消耗,需要硬分叉支持; (5).EIP 1234:将是潜在最有争议的提案,也需要硬分叉支持,它包括难度炸弹(Difficulty Bomb)协议推迟12个月和挖矿奖励调整,难度炸弹使挖矿难度随时间推移越来越高,挖矿奖励调整将挖矿奖励从3个降低到2个; 4.Serenity(宁静) |
eip155Block | eip是ethereum improvement proposal的缩写,你的链不会因为因为这些提议分叉,故设置为“0”即可 |
eip158Block | eip是ethereum improvement proposal的缩写,你的链不会因为因为这些提议分叉,故设置为“0”即可 |
mixhsah | 与nonce配合用于挖矿,由上一个区块的一部分生成的哈希。注意它和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。 |
difficulty | 设置设置当前区块难度,如果难度过大,CPU挖矿就很难 |
alloc | 给某个账户预分配以太币 |
coinbase | 矿工帐号 |
timestamp | 创世块的时间戳 |
parentHash | 上一个区块的哈希值,由于是创世区块,所以值为0 |
extraData | 可以写入32Byte大小的任意数据,每个block都会有,由挖出block的miner来决定要不要在里面写什么 |
gasLimit | 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总 |
2. geth启动参数详解:
identity | 区块链的标识,用于标识目前网络的名字 |
datadir | 指明当前区块链私钥和网络数据存放的位置 |
port | 指定以太坊网络监听端口,默认为30303 |
rpc | 开启HTTP-RPC服务,可以进行智能合约的部署和调试 |
rpcaddr | 指定HTTP-RPC服务监听地址,默认为“localhost” |
rpcapi | 设置允许连接的rpc的客户端,一般为db、eth、net、web3 |
rpcport | 指定HTTP-RPC服务监听端口,默认为8545 |
networkid | 指定以太坊id,其实就是区块链网络的身份标识,共有链为1,测试链为3,默认启动id为1 |
etherbase | 指定矿工帐号,默认为keystory中首个帐号 |
mine | 开启挖矿,默认为CPU挖矿 |