geth以太坊私有环境部署智能合约

环境

ubuntu 16.04, 64位

安装环境的过程省略。


将智能合约部署到 Geth 私有链

搭建geth私有网络

geth的全称是Go-ethereum,是一个以太坊客户端,用go语言编写,是目前最常用的客户端。

在home目录下新建一个geth目录(目录都可以自己定义)。然后进入该目录创建创世区块genesis.json文件,然后建一个chain目录,内容如下:

{
"config": {
        "chainId": 10,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x4000",
  "extraData"  : "",
  "gasLimit"   : "0x8000000",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00",
  "alloc": {}
}

释一下各个参数的作用:

mixhash
与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意他和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。.
nonce
nonce就是一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。
difficulty
设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度(还可以试试0x400)
alloc
用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。
coinbase
矿工的账号,随便填
timestamp
设置创世块的时间戳
parentHash
上一个区块的hash值,因为是创世块,所以这个值是0
extraData
附加信息,随便填,可以填你的个性信息
gasLimit
该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。

geth新版本(1.5以上)要求创世区块一定要有”config”{}项啊,不然会报错

初始化创世块,

pony@pony-virtual-machine:~/geth$ sudo geth init ./genesis.json --datadir "./chain"
WARN [12-27|09:45:23] No etherbase set and no accounts found as default 
INFO [12-27|09:45:23] Allocated cache and file handles         database=/home/pony/geth/geth/chaindata cache=16 handles=16
INFO [12-27|09:45:23] Writing custom genesis block 
INFO [12-27|09:45:23] Successfully wrote genesis state         database=chaindata                      hash=ecf271…5269d6
INFO [12-27|09:45:23] Allocated cache and file handles         database=/home/pony/geth/geth/lightchaindata cache=16 handles=16
INFO [12-27|09:45:23] Writing custom genesis block 
INFO [12-27|09:45:23] Successfully wrote genesis state         database=lightchaindata                      hash=ecf271…5269d6

执行成功后,在chain目录下会新增出两个文件夹geth和keystore,geth中保存的是区块链的相关数据,keystore中保存的是该链条中的用户信息。

除了init命令,geth还支持一下命令:


命令:

account    管理账户
attach     启动交互式JavaScript环境(连接到节点)
bug        上报bug Issues
console    启动交互式JavaScript环境
copydb     从文件夹创建本地链
dump       Dump(分析)一个特定的块存储
dumpconfig 显示配置值
export     导出区块链到文件
import     导入一个区块链文件
init       启动并初始化一个新的创世纪块
js         执行指定的JavaScript文件(多个)
license    显示许可信息
makecache  生成ethash验证缓存(用于测试)
makedag    生成ethash 挖矿DAG(用于测试)
monitor    监控和可视化节点指标
removedb   删除区块链和状态数据库
version    打印版本号
wallet     管理Ethereum预售钱包
help,h     显示一个命令或帮助一个命令列表

好,接着说正题,启动日志上提示我们没有默认账号,一会在新建。

启动控制台


pony@pony-virtual-machine:~/ethereum$ sudo geth --datadir "./chain" --networkid 15 --nodiscover --maxpeers 0 console
WARN [01-02|17:03:01] No etherbase set and no accounts found as default 
INFO [01-02|17:03:01] Starting peer-to-peer node               instance=Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9
INFO [01-02|17:03:01] Allocated cache and file handles         database=/home/pony/ethereum/chain/geth/chaindata cache=128 handles=1024
WARN [01-02|17:03:01] Upgrading database to use lookup entries 
INFO [01-02|17:03:01] Database deduplication successful        deduped=0
INFO [01-02|17:03:01] Initialised chain configuration          config="{ChainID: 10 Homestead: 0 DAO:  DAOSupport: false EIP150:  EIP155: 0 EIP158: 0 Byzantium:  Engine: unknown}"
INFO [01-02|17:03:01] Disk storage enabled for ethash caches   dir=/home/pony/ethereum/chain/geth/ethash count=3
INFO [01-02|17:03:01] Disk storage enabled for ethash DAGs     dir=/home/pony/.ethash                    count=2
INFO [01-02|17:03:01] Initialising Ethereum protocol           versions="[63 62]" network=15
INFO [01-02|17:03:01] Loaded most recent local header          number=0 hash=4b7556…13cf12 td=16384
INFO [01-02|17:03:01] Loaded most recent local full block      number=0 hash=4b7556…13cf12 td=16384
INFO [01-02|17:03:01] Loaded most recent local fast block      number=0 hash=4b7556…13cf12 td=16384
INFO [01-02|17:03:01] Regenerated local transaction journal    transactions=0 accounts=0
INFO [01-02|17:03:01] Starting P2P networking 
INFO [01-02|17:03:03] UDP listener up                          self=enode://a8c6eeda2bd1327548e367f4f6a5cf1df3e91e4a341e9a543a74d69e28a4a2ea4c4d0708bdeb6bd2bcef228ec0e3aa3b5a926e2801db503193b1eca4032908a5@[::]:30303
INFO [01-02|17:03:03] RLPx listener up                         self=enode://a8c6eeda2bd1327548e367f4f6a5cf1df3e91e4a341e9a543a74d69e28a4a2ea4c4d0708bdeb6bd2bcef228ec0e3aa3b5a926e2801db503193b1eca4032908a5@[::]:30303
INFO [01-02|17:03:03] IPC endpoint opened: /home/pony/ethereum/chain/geth.ipc 
Welcome to the Geth JavaScript console!

instance: Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9
 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

> 

如果觉得日志显示比较乱,可以把日志重定向输出到文件中,命令改成如下即可:

sudo geth --datadir "./chain" --networkid 15 --nodiscover --maxpeers 0 console 2>>geth.log
  • nodiscover表示禁用同伴发现。
  • maxpeers 设置为 0禁用网络。

启动后,会发现30303端口启动监听了。这里也可以用–port指定其它端口,因为后面mist连接私有链启动的时候用的也是30303,避免端口冲突。

另外,这个端口一定要记得,比方说你重启环境后,要确保

另外从启动信息可以看出,启动后会用到两个磁盘位置:

INFO [02-19|21:06:47] Disk storage enabled for ethash caches   dir=/home/pony/ethereum/chain/geth/ethash count=3
INFO [02-19|21:06:47] Disk storage enabled for ethash DAGs     dir=/home/pony/.ethash                    count=2

回头我们重新测试的时候就知道该删除那些目录了。(删除.ethash目录和chain目录下的所有文件)

试试几个命令:

创建一个账号,

> personal.newAccount()
Passphrase: 
Repeat passphrase: 
"0xdec60d1eaf07362e011d83a4fde88da1ed5eaf7d"

查看当前账号列表

> eth.accounts
["0xdec60d1eaf07362e011d83a4fde88da1ed5eaf7d"]

查询余额,发现是0,正常,因为还没有挖矿。

> eth.getBalance(eth.accounts[0])
0

挖矿,在公有链上,矿工打包平均需要15秒,在私有链上,我们需要自己来做这件事情:

> miner.start()
INFO [01-02|17:04:11] Updated mining threads                   threads=0
INFO [01-02|17:04:11] Transaction pool price threshold updated price=18000000000
null
> INFO [01-02|17:04:11] Starting mining operation 
INFO [01-02|17:04:11] Commit new mining work                   number=1 txs=0 uncles=0 elapsed=207.311µs
INFO [01-02|17:04:15] Generating DAG in progress               epoch=0 percentage=0 elapsed=3.441s
INFO [01-02|17:04:19] Generating DAG in progress               epoch=0 percentage=1 elapsed=6.753s
INFO [01-02|17:04:22] Generating DAG in progress               epoch=0 percentage=2 elapsed=10.141s
INFO [01-02|17:04:25] Generating DAG in progress               epoch=0 percentage=3 elapsed=13.458s
INFO [01-02|17:04:29] Generating DAG in progress               epoch=0 percentage=4 elapsed=16.849s
INFO [01-02|17:04:32] Generating DAG in progress               epoch=0 percentage=5 elapsed=20.200s

这个percenage=100,也就是100%以后.,就差不多完成了,接下来提示:

INFO [01-02|17:10:03] Generated ethash verification cache      epoch=0 elapsed=5m50.965s
INFO [01-02|17:10:10] Successfully sealed new block            number=1 hash=6b8e7a…58bbf0
INFO [01-02|17:10:10] ? mined potential block                  number=1 hash=6b8e7a…58bbf0
INFO [01-02|17:10:10] Commit new mining work                   number=2 txs=0 uncles=0 elapsed=146.575µs
INFO [01-02|17:10:10] Successfully sealed new block            number=2 hash=a04334…c62f5c
INFO [01-02|17:10:10] ? mined potential block                  number=2 hash=a04334…c62f5c
INFO [01-02|17:10:10] Commit new mining work                   number=3 txs=0 uncles=0 elapsed=108.343µs

有小锤子的标识。回车输入miner.stop()可以停止挖矿,挖矿挖到的ether币会默认保在第一个账户中,即eth.acccounts[0]中。,然后查询余额:

> eth.getBalance(eth.accounts[0])
95000000000000000000

OK,私有链创建成功。输入exit可以退出控制台。

强调几个注意点:

在挖矿的过程中我们也看到磁盘空间不断的增加,主要都在home目录下的.ethash目录下

挖矿是执行智能合约的基础。如果停止挖矿的话,不仅以太币会停止生成,所有智能合约的调用也会不起作用


你可能感兴趣的:(区块链技术)