以太坊安装以及私有链的基本操作

一、以太坊安装

使用homebrew下载

brew tap ethereum/ethereum
brew install ethereum

如果报错brew未识别,先下载homebrew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

注意:下载homebrew建议不使用校园网,即使科学上网速度也会极慢,大概率会下载失败,选择手机开热点即可。

二、创世区块的初始化

1. 创世区块的配置文件

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

chainId为该链的网络ID,建议设置大一点的数,其中1为以太坊公链ID。

alloc包含初始化的账号信息以及以太币,这里为空,在后面再手动添加。

difficulty代表挖矿难度,数值越小难度反而越大,所以为了挖矿更加简单,可以把这个值设置大一点。

gasLimit是一个区块所消耗的最大gas数,如果超过这个数将不被允许,因为智能合约的部署以及调用需要消耗的gas比普通转账要多,所以建议将该值设置大一点。

2.初始化创世区块

geth –datadir ./ init genesis.json

./代表当前目录,init genesis.json表示使用这个文件初始化创世区块。

整句话的意思是在genesis.json的当前目录下初始化,然后执行完后会生成两个文件夹,geth以及keystore,分别存放该链数据以及用户密钥。也可以将./替换成你想放的目录下。

三、节点加入私有链

加入私有链

geth --datadir ./ console 2>>geth.log

./代表的是geth和keystore文件所在目录,因为我是在当前目录,所以使用./,如果是其他注意修改路径。

console是JavaScript控制台。

2>>gets.log命令是指将日志输出到geth.log文件上(没有的话就新建),如果选择不加这个参数的话日志将会在console输出,这个看个人喜好。

如果在创世区块没有写明chainId,或者使用exit命令退出该链后想重新加进去,需修改为以下命令

geth --datadir ./ --networkid 744 console 2>>geth.log

744为刚刚设置的ID。这样就会重新回到那条链上。

四、创建账号以及挖矿

1. 新建账号

通过输入eth.accounts返回一个空数组说明当前并无账号

使用以下命令创建账号

personal.newAccount()

回车后会让你连续输入密码,这个密码就是你这个账号的私钥,同时会返回账号哈希,并将账号信息存储到keystore文件中。

连续添加两个账号,记得使用不同私钥。

然后使用eth.accounts就可以返回账号数组,eth.accounts[0]代表第一个账号。

2. 查看账号余额

查看第一个账号余额,返回结果为0,因为该账号没有任何收入。

eth.getBalance(eth.accounts[0])

3. 获取区块数

获取区块数

eth.blockNumber

4. 挖矿

挖矿,其中1为挖矿线程数,如果挖矿成功返回null,挖矿收入转给第一个账号,关于如何修改默认矿工账号这里不讲。

miner.start(1)

如果不立即停止挖矿,该矿工会一直挖下去,因为只有一个节点且挖矿难度极低,所以区块数会一直增加(但是是空的,即交易量为0),矿工账号即第一个账号余额会一直增加。

停止挖矿

miner.stop()

也可以选择以下命令,使矿工挖出一个区块后停止挖矿,也可以修改指定块数后停止。

miner.start(1);admin.sleepBlocks(1);miner.stop()

这是使用查询账号余额和区块数都会发生链改变,但账号二余额仍为0,因为它不是矿工账号。

五、转账交易

可以使用转账交易来将账号一的钱部分转给账号二,将1.5e+10单位wei转给账号二。

eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1], value:1.5e+10})

但会发现报错

Error: authentication needed: password or unlock
    at web3.js:3143:20
    at web3.js:6347:15
    at web3.js:5081:36
    at <anonymous>:1:1

这时候你需要使用私钥将发送方的账号解锁,证明你拥有他的使用权才可以转账。

personal.unlockAccount(eth.accounts[0])

然后输入私钥,返回true即证明正确。

再执行以上命令,返回交易哈希(即交易ID),证明可以转账。

"0x41ff4bf9468c92aeb723037e396ac36bf0a367e61e3b3d298a071e5dd2945068"

注意是可以转账,而不是已经转账,因为此时还没有矿工将这个交易打包到区块中去。

使用txpool.status查看交易池,得到以下返回值:1代表有一个交易需要打包。

{
  pending: 1,
  queued: 0
}

挖矿,返回null证明挖矿成功,这时转账完成。

miner.start(1);admin.sleepBlocks(1);miner.stop()

智能合约的部署以及调用都是属于交易的一种,下一篇博客再讲。

阅读更多

更多精彩内容