区块链的私链搭建

为了让一个区块添加到主链上,一个矿工必须要比其他矿工更快的提供出这个“证明”。通过矿工提供的一个数学机制的“证明”来证实每个区块的过程称之为工作量证明(proof of work)。

证实了一个新区块的矿工都会被奖励一定价值的奖赏。奖赏是什么?以太坊使用一种内在数字代币—以太币(Ether)作为奖赏。每次矿工证明了一个新区块,那么就会产生一个新的以太币并被奖励给矿工。

你也许会在想:什么能确保每个人都只在区块的同一条链上呢?我们怎么能确定不会存在一部分矿工创建一个他们自己的链呢?

前面,我们定义了区块链就是一个具有共享状态的交易单机。使用这个定义,我们可以知道正确的当前状态是一个全球真相,所有人都必须要接受它。拥有多个状态(或多个链)会摧毁这个系统,因为它在哪个是正确状态的问题上不可能得到统一结果。如果链分叉了,你有可能在一条链上拥有10个币,一条链上拥有20个币,另一条链上拥有40个币。在这种场景下,是没有办法确定哪个链才是最”有效的“。

不论什么时候只要多个路径产生了,一个”分叉“就会出现。我们通常都想避免分叉,因为它们会破坏系统,强制人们去选择哪条链是他们相信的链。

为了确定哪个路径才是最有效的以及防止多条链的产生,以太坊使用了一个叫做“GHOST协议(GHOST protocol.)”的数学机制。

GHOST = Greedy Heaviest Observed Subtree

简单来说,GHOST协议就是让我们必须选择一个在其上完成计算最多的路径。一个方法确定路径就是使用最近一个区块(叶子区块)的区块号,区块号代表着当前路径上总的区块数(不包含创世纪区块)。区块号越大,路径就会越长,就说明越多的挖矿算力被消耗在此路径上以达到叶子区块。使用这种推理就可以允许我们赞同当前状态的权威版本。

现在你大概对区块链是什么有个理性的认识,让我们在再深入了地解一下以太坊系统主要组成部分:

扫描二维码关注公众号,回复: 11645073 查看本文章
  • 账户(accounts)
  • 状态(state)
  • 损耗和费用(gas and fees)
  • 交易(transactions)
  • 区块(blocks)
  • 交易执行(transaction execution)
  • 挖矿(mining)
  • 工作量证明(proof of work)
  • windows单节点下安装geth

下载地址:https://geth.ethereum.org/downloads/,下载之后是个 .exe文件,然后安装就好了,安装之后把geth的安装目录加入到系统环境变量的path里。验证是否安装成功,打开cmd窗口,输入 geth version 如果出来下面的内容,表示安装好了。(如果不加任何任何参数直接运行 geth ,会自动连接到以太坊公网,此时会开始同步区块)

初始化创世区块
新建个空文件夹,比如

然后在里面创建个first.json文件,文件名随意自己定吧,里面的内容如下:

{
  "config": {
        "chainId": 10, 
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "alloc"      : {},
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x20000",
  "extraData"  : "",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00"
}
然后打开cmd窗口,跳转到当前目录下执行命令:

geth --datadir .\nodedata0 init first.json
上面的命令的主体是 geth init,表示初始化区块链,命令可以带有选项和参数,其中–datadir选项后面跟一个目录名,这里为nodedata0,表示指定数据存放目录为 nodedata0, first.json是init命令的参数,就是刚才创建的json文件

出现Successfully表示初始化成功了(把这行命令保存为一个.cmd命令备用),这时候你会发现,你的目录下面自动生成了一个nodedata0的文件夹,目录如下:

其中geth/chaindata中存放的是区块数据,keystore中存放的是账户数据。

启动节点
执行命令:

geth --rpc --nodiscover --datadir  "./nodedata0"  --port 30303 --rpcapi "db,eth,net,web3" --rpccorsdomain "*" --networkid 1001 --ipcdisable console 2>>geth.log
参数说明

--nodiscover 关闭p2p网络的自动发现,需要手动添加节点,这样有利于我们隐藏私有网络
--rpc 启用ipc服务,默认端口号8545
--datadir 区块链数据存储目录
--port 网络监听端口,默认30303
--rpcapi 表示可以通过ipc调用的对象
--rpccorsdomain 指定可以访问APi的domain地址,设置为“*”则任何地址都可以访问,这样做不安全
--networkid 网络标识,私有链取一个大于4的随意的值
console 打开一个可交互的javascript环境
2>>geth.log 把geth中的log信息导入geth.log,也可以不加这个,把信息直接输出在console里,这样直观
更多参数:https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options
http://www.yaozihao.cn/2017/07/07/geth%E5%91%BD%E4%BB%A4%E9%80%89%E9%A1%B9%E4%BB%8B%E7%BB%8D/


出现javascript console说明节点启动成功了,geth.log文件也生成了

把这启动命令也保存start0.cmd命令,以后再启动这个节点直接双击这个cmd就行了

节点相关基本操作

创建账户
personal.newAccount()

Passphrase是输入密码,下面的repeat passphrase是重复密码,创建的账户地址是:

0x8b2bd44cec6caedcc0664f965d895a17db326e0a

这是我们会看到nodedata0文件夹下面的keystore下面会多出个文件,就是保存账户信息

再查看账户列表,发现有账户了

如果你记不清楚personal有哪些方法,可以执行personal命令查看一下,其它的eth,miner也一样

启动挖矿
miner.start()

看到null,不要慌,因为你的日志信息都保存到了geth.log文件里了,下面这小图标代表啥自己领会哈

挖了半天,到底挖了几个区块了?赚了多少以太币了?看下面的查询余额和查看区块数

另外说明一点,节点挖矿的以太币会自动存入到eth.coinbase账户里,默认是eth.accounts里的第一个,你也可以自己指定coinbase

停止挖矿
miner.stop()


查看账户余额
eth.getBalance

eth.accounts[0]得到的是账户地址而已,你可能被这么大的数值吓一跳,怎么这么多以太币?一个以太币等于10的18次方个wei,这里的数值是wei的个数,显示以太币的个数,可以用下面的命令,405个以太币,如果是真的,简直不要太爽,以太坊创始人V神以前肯定也在家里这么偷偷的挖了不少

查看区块数
eth.blockNumber

81个区块,一个区块奖励5个以太币

指定coinbase账户
先创建第二个账户,然后把第二个账户指定为coinbase,修改之前和修改之后已经改变

转账
先创建第三个没有币的账户,从账户1转5个比特币到账户3里,有的同学会问,不是有个账户2吗,你怎么不用呢?因为转账发起了交易,然而发起交易仅仅是发起交易,交易要被确认需要打包进区块里,挖矿就是做这个的,挖矿本身的收益会存进coinbase账户里,而现在coinbase账户是账户2,所以不考虑账户2

再查看coinbase账户2的余额,不仅挖矿奖励,连交易费都收了哦

退出
exit

验证私链
写了这么多,一顿操作猛如虎,这个私链到底能不能用?

我们用remix验证一样,连接这个私链

账户和余额信息会显示出来,如果你的工具找不到你的私链,请确认启动节点的参数中,有没有设置 --rpccorsdomain "*" 

单节点就写到这里,下面是多节点的内容

  • windows多节点

我们在上面已经创建了一个节点了,下面我们直接创建第二个节点,然后连接两个节点,第二个节点的创建要满足下面条件

创世区块的信息得一样
就是要用一样的.json配置文件初始化,因为区块链的本质就是所有节点记录的账本都是一样的,所以第一个区块的数据也得一致

rpcport 和 port参数必须和第一个不同
节点1 启动的命令没有这个参数rpcport,默认的值是8545,我们就用9545吧,port用30306

初始化创世区块
geth --datadir .\nodedata1 init first.json
自动创建了存放节点数据的文件夹nodedata1

启动节点
geth --rpc --rpcport 9545 --nodiscover --datadir  "./nodedata1"  --port 30306 --rpcapi "db,eth,net,web3" --rpccorsdomain "*" --networkid 1001 --ipcdisable console


nodiscover,ipcdisable,这两个参数很关键,windows没有ipcdisable参数,第二个节点启动会报错的。nodiscover让节点2不会被节点1自动扫描到。

节点1和节点2建立连接

我们用节点2主动添加节点1,两个节点只要一方主动建立连接就可以了,另一方会自动获得这个连接关系的,效果一样的

先查看节点1的enode信息,作为节点2 admin.addPeer()方法的参数

节点1的console:

节点2的console:

再看节点1的console:

再用remix连接一下我们的节点2吧

windows多个节点的私链就是这样了

3.linux创建节点并和windows节点建立连接
下载文件并上传服务器解压:https://geth.ethereum.org/downloads/

注意你的linux是多少位的就下载多少位的二进制文件,我的是32位的,我就下载32位的

然后把geth复制到/usr/bin目录下面,我们就可以使用geth命令了,geth help,出现下的界面,表示成功。

网上其它的文章都是先安装go语言,再下载geth源码编译安装,最终的效果都是一样的。

然后执行初始化区块的命令:

geth --datadir nodedata2 init first.json
命令跟在windows差不多,自动生成的nodedata2文件夹也是一样的

启动节点,步骤跟在windous一样

geth --rpc --rpcport 8545 --rpcaddr 65.49.132.28 --nodiscover --datadir  "/root/privatechain/nodedata2"  --port 30303 --rpcapi "db,eth,net,web3" --rpccorsdomain "*" --networkid 1001 --ipcdisable console
命令多了一个:

--rpcaddr 65.49.132.28

这个ip是linux服务器的地址,如果我们在windows本地想要访问服务器的私链,这个参数得加上

已经启动,我们可以在命令行窗口执行一些geth的命令

windows电脑上的remix访问一下linux的私链:

一个账户,地址也是一样的,it is working。

额外操作:把启动命令保存为linux可运行文件,方便以后启动:

linux的私链运行成功了,接下来我们让window的节点和linux的节点连接起来(因为网络原因没实现,只有思路)

windows上已经有两个节点了,现在我们的linux要访问这两个节点,所以这两个节点的启动命令得加上--rpcaddr这个参数,但是这部分实现不了了,因为自己电脑连接的是路由器,直接用公网ip+端口号访问不到自己的电脑,要在路由器上做端口映射才能让服务器访问到自己的电脑,我没有路由器的登录权限,所以做不了了(有个什么软件,可以帮自己的电脑生成一个外网ip,有兴趣的朋友可以百度一下,然后继续走下去)

1.端口映射方法:http://service.tp-link.com.cn/detail_article_2441.html

2.节点建立连接方法应该跟windous连接点相连方法是一样的,关键是节点启动的时候加上--rpcaddr参数
 

猜你喜欢

转载自blog.csdn.net/Peter_Changyb/article/details/103609114
今日推荐