qhdsk 2019-06-28
本文主要学习以太坊的底层操作,环境搭建,查看系统信息,账号创建,挖矿,交易,智能合约部署等操作
机器:Mac
源码:https://github.com/ethereum/g... 本文以go版本的ethereum为例
如果是其它机型请参照 官方安装文档
brew tap ethereum/ethereum brew install ethereum # 如果希望基于ethereum的develop分支安装,执行 brew install ethereum --devel brew install ethereum
以默认方式启动会连接以太坊主链,同步数据到本地,占用本地磁盘空间,所以不建议这么做。我们以私链的方式运行即可。运行私有链那么就必须定义自己的创世区块
默认方式启动,单机环境不建议使用,命令供参考
> geth 或dev模式运行 > get --dev console 2>> geth-log # 如果这种方式启动,进入控制台需要使用 geth attach 命令
初始化
在指定目录下新建一个目录用于保存生成的数据
cd /tmp && mkdir blockchain && cd blockchain mkdir data touch genesis.json 目录结构如下 . ├── data └── genesis.json
genesis.json:初始化私有链的配置文件,配置创世区块信息
data:存放区块链数据的目录。
genesis.json
内容如下
{ "config": { "chainId": 15, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "alloc": {}, "nonce": "0x0000000000000042", "difficulty": "0x020000", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "gasLimit": "0x4c4b40" }
参数解释:
alloc:用来预设置账号以及账号的 ether 数量。因为私有链挖矿比较容易,所以我们不需要预设置账号。比如,{"0x880004bb64282fb01a3a2500ddf1f4bb5ad4b64a":{"balance":"100000000000000000000000000000"}} nonce:一个64位随机数,用于挖矿。 mixhash:和 nonce 配合用于挖矿,由上一个区块的一部分生成的 hash。 difficulty:设置当前区块的难度,如果难度过大,cpu挖矿就很难,所以这边设置的很小,不要跟自己过不去嘛。 coinbase:默认挖矿的矿工账号。 timestamp:设置创世块的时间戳。 parentHash:上一个区块的hash值,因为是创世块,所以值是0。 extraData:附加信息,随便填。 gasLimit:设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和。因为我们是私有链,所以可以写的大一些,方便开发测试。
接下来我们就需要将创世区块的初始信息写入区块链中,使用geth init
命令
cd /tmp/blockchain geth --datadir "./data" --networkid 31415926 --rpc --rpccorsdomain "*" init ./genesis.json
大致会输出如下信息:
INFO [03-12|19:36:02] Allocated cache and file handles INFO [03-12|19:36:02] Writing custom genesis block INFO [03-12|19:36:02] Persisted trie from memory database INFO [03-12|19:36:02] Successfully wrote genesis state
此时的目录结构就变成如下:
. ├── data │ ├── geth │ │ ├── chaindata │ │ │ ├── 000001.log │ │ │ ├── CURRENT │ │ │ ├── LOCK │ │ │ ├── LOG │ │ │ └── MANIFEST-000000 │ │ └── lightchaindata │ │ ├── 000001.log │ │ ├── CURRENT │ │ ├── LOCK │ │ ├── LOG │ │ └── MANIFEST-000000 │ └── keystore └── genesis.json
其中keystore
目录用来保存账户信息,geth
目录用来保存区块信息。
geth --datadir data --networkid 31415926 --rpc --rpccorsdomain "*" --nodiscover console
输出如下即表示成功进入 geth 的控制台:
Welcome to the Geth JavaScript console! instance: Geth/v1.8.2-stable/darwin-amd64/go1.10 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0 >
# 查看一下系统有的用户 > eth.accounts [] # 查看详细的用户信息 > personal # 创建两个账号用于转账,或者使用 personal.newAccount() 也会提示输入密码 > personal.newAccount('123456') > personal.newAccount('123456') > eth.accounts ["0x18a6581a285f40ac3faaa646e13d7c6dd87276f4", "0x2455572ef500cf8634a4090d6d6096c588013e2a"] # 此时可以看下 keystore 目录,多出了两个文件,也就是我们刚才创建的两个账户密钥(丢了它,你就等于丢了币)
账号创建好了,但是一开始账号都没有 ether,这时就需要挖矿获取币了。
使用miner.start()
命令开启挖矿,默认挖出的 ether 是存到 eth.coinbase
账户中的,也就是第一个账户。
# 查看账号1下的余额 > eth.getBalance(eth.accounts[0]) # 查看coinbase账号 > eth.coinbase 0x18a6581a285f40ac3faaa646e13d7c6dd87276f4 # 如果想要把挖到的矿存入其他账户,可以使用 > miner.setEtherbase(eth.accounts[1]) true 开始挖矿,我们先把coinbase改成账号1 > miner.setEtherbase(eth.accounts[0]) true # 如果出现 miner.start() 直接返回 null 的情况,请先查看是否还未创建过账户。 > miner.start(1) INFO [05-31|19:57:17] Updated mining threads threads=0 INFO [05-31|19:57:17] Transaction pool price threshold updated price=18000000000 INFO [05-31|19:57:17] Starting mining operation INFO [05-31|19:57:17] Commit new mining work number=12 txs=0 uncles=0 elapsed=194.667µs INFO [05-31|19:57:19] Successfully sealed new block number=12 hash=82d29d…65290c INFO [05-31|19:57:19]