mac下以太坊环境搭建以及挖出私有链创世区块

摘要:
区块链最近炒的沸沸扬扬,作为一名技术开发,也来试一下水,区块链技术还很年轻,网络上没有一篇文章能完全解决mac下以太坊环境配置,所以本人贡献一篇


正文:

本机系统 macOS Sierra 10.12.6

环境配置

(1) 安装python 这步mac是自带python2.7的 直接可以跳过

brew install python

(2) 安装solc(solidity语言编译器) 和solc-cli

sudo npm install -g solc solc-cli --save-dev

(3) 安装ethereum/cpp-ethereum(以太坊客户端geth)

网络上文章一般使用如下步骤官网教程链接

brew update

brew upgrade

brew tag ethereum/ethereum

brew install cpp-ethereum

brew linkapps cpp-ethereum

或者

brew tag ethereum/ethereum

brew install ethereum

这步操作是有问题的 我在命令行中报了一个错误 没有错误提示 让我去github提issue 查找资料 觉得最大可能是不兼容的问题

mac下以太坊环境搭建以及挖出私有链创世区块_第1张图片
错误

mac下以太坊环境搭建以及挖出私有链创世区块_第2张图片
官网只提供到10.11版本

这时候我们去下载release版本的客户端就好了 不需要从源码编译运行release版本下载地址

小技巧 与本文关系不大 但感觉还是要做的
下载release版本的客户端打开后 需要同步节点 不管是什么网络状态下 自己搭建的私有网络除外 节点数据是很大的 以太坊私有节点的数据近40个G 本人机器内存不够 所以想着把数据放在移动硬盘 本地做个文件夹路径映射 因为以太坊数据是默认放在固定路径(/Users/xxxxx/Library/Ethereum)下的 不能更改路径(本人没找到 谁知道的可以教我下) 所以唯一解决方法就是做文件夹路径映射

方法如下 如果你是将A从B下面转移到C下面

(1) cd B 进入到原始位置

(2) ln -s C/A A 第一个路径是你准备转移去的位置 第二个路径是原始目录名

可能用的时候有出现问题 请保证最后的结果是这样的


图片

我们继续 现在eth开发环境以及配置差不多了(没记错的话)

现在开始初始化我们的私有链以及挖矿交易 这步往后 其实网络上大部分文章都能走通 但有些点还是没有讲到 我总结一下好了 也给自己留个记录 东西总是忘的比较快

区块都是一个接一个的创建 那么创世区块 也就是第一个区块怎么来的? 需要一个配置文件 json格式
(1)创建一个文件夹 放自己的私有链 创建一个json文件

例子:

{
  "config": {  
        "chainId": 666,  
        "homesteadBlock": 0,  
        "eip155Block": 0,  
        "eip158Block": 0  
    },  
  "alloc"      : {},  
  "coinbase"   : "0x0000000000000000000000000000000000000000",  
  "difficulty" : "0x20000",  
  "extraData"  : "",  
  "gasLimit"   : "0x2fefd8",  
  "nonce"      : "0x0000000000000042",  
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",  
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",  
  "timestamp"  : "0x00"  
}  
参数名称 参数描述
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挖矿就很难,这里设置较小难度
alloc 用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。
coinbase 矿工的账号,随便填
timestamp 设置创世块的时间戳
parentHash 上一个区块的hash值,因为是创世块,所以这个值是0
extraData 附加信息,随便填,可以填你的个性信息 注意需要0x开头 我把文字转十六进制扔进去了
gasLimit 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。

启动私有节点所需参数

参数名称 参数描述
identity 区块链的标示,随便填写,用于标示目前网络的名字
init 指定创世块文件的位置,并创建初始块
datadir 设置当前区块链网络数据存放的位置
port 网络监听端口
rpc 启动rpc通信,可以进行智能合约的部署和调试
rpcapi 设置允许连接的rpc的客户端,一般为db,eth,net,web3
networkid 设置当前区块链的网络ID,用于区分不同的网络,是一个数字
console 启动命令行模式,可以在Geth中执行命令

本人启动eth所在目录为:

/Users/xxxxx/tmpPrivate 

目录下放刚刚写好的创世json文件:genesis.json 如果没有特别想法 只是想练手 直接copy我上面那个json就好了
执行命令

geth --datadir "./" init genesis.json

这边有几个常见的错误
Fatal: invalid genesis file: missing 0x prefix for hex data:这个错误信息意思很明白,就是你的json文件中,对于16进制数据,需要加上0x前缀

Fatal: invalid genesis file: hex string has odd length: 从v1.6开始,设置的十六进制数值,不能是奇数位, 比如不能是0x0,而应该是0x00。

Fatal: failed to write genesis block: genesis has no chain configuration :这个错误信息,就是说,你的json文件中,缺少config部分。看到这个信息,我们不需要把geth退回到v1.5版本,而是需要加上config部分。

Error: invalid sender undefined: 这个错误不会导致初始化失败,但是会在以后的转账(eth.sendTransaction),或者部署智能合约的时候产生。解决方法就是chainId 不能设置为0。 如果你完全按照github上给的官方配置文件,就会产生这个错误。

如果成功,这时候目录下会多出geth和keystore两个文件夹 geth保存的是区块链相关数据 keystore中保存的是该链条中的用户信息

初始化创世区块后,我们启动自己的私有链条

geth --datadir "./" --nodiscover --port "35555" console 2>>geth.log 
Geth JavaScript console

这里又有一个eth的自带bug 由于我们日志输出到geth.log文件中 所以下面我们挖矿的时候 miner.start() 输出是null 不再是正常的ture 这个是eth的bug

这个时候我们可以打开另一个控制台 cd 到我们目录下 我的就是上面的tmpPrivate文件夹 看到是否出现了一个 geth.log文件 如果有的话 我们输入

tail -f geth.log  这句命令可以持续的输出以太坊的日志

回到上一句命令出来的Geth JavaScript console 中
这时候私有链中没有账户 我们需要创建一个账户
输入命令

personal.newAccount("Pcookie1") 该命令创建了一个新的用户,该用户密码是Pcookie1

再次输入命令

eth.accounts 我们发现用户组里已经有一个用户了

我们可以再次创建一个用户 为下面转账做准备

挖矿

这个控制台的语法是js语法 我们可以通过 
user1 = eth.accounts[0] 把用户组里的第0位用户赋值给user1变量 类似的
user2 = eth.accounts[1]

我们再执行
eth.getBalance(user1) 可以查看里面的余额

执行
eth.blockNumber 可以查看当前区块高度

我们执行 
miner.start() 一般文章中会说输出ture才成功 但是现在都是null 这个bug上面提过  
miner.stop() 停止挖矿

挖矿一般都会给默认第0位用户  也可以通过指定选择给哪个账户

miner.setEtherbase(eth.accounts[1])

挖一会儿后可以看看区块高度 以及账户里面是否增加了  以及可以看之前持续输出的控制台的打印日志
mac下以太坊环境搭建以及挖出私有链创世区块_第3张图片
命令行输入

mac下以太坊环境搭建以及挖出私有链创世区块_第4张图片
挖矿日志

转账

以太坊环境 每隔一段时间自动会把账户锁定 所以几乎每次交易转账的时候都需要先解锁

personal.unlockAccount(user2)

输入密码 就是自己之前设定的账户密码

执行

amount = web3.toWei(1) 表示转账一个eth

执行 

eth.sendTransaction({from: user2, to: user1, value: amount})

应该不要解释 就是从user2账户转账给user1

这时候有些人会迫不及待用上面查询的语句看看是不是真的变了  结果发现没有变化 

这个时候就是缺了个概念  就是挖矿的存在的意义  挖矿就是记账的意思  所以 每次转账 合约部署 之类的时候 需要用挖矿 把账记下来  
我们执行miner.start()
成功~

这篇文章本来一周前就要写的。。一直没空。。发现挺多人有困惑的。。还是抽空写了。。后面再写合约部署 合约的代码solidty 版本编译也有很多坑 其实合约这东西 在我看来 只是一个物品交换的规则 就是逻辑 很简单 没什么写的必要 不过写个简单的走个流程 后面研究区块链底层技术 写一个自己的基础链 把btc思想写出来 还是会收获很多的 希望大家都能起飞 本人私人博客

你可能感兴趣的:(mac下以太坊环境搭建以及挖出私有链创世区块)