作者: 张详,闫思
来源: IDCU
PoW呢...Proof of Work ,工作量证明机制,可能这个名字大家不熟悉,说比特币的话,大家就熟悉了。没错,PoW就是比特币所使用的共识机制。
通过计算一个数值( nonce ),使得拼揍上交易数据后内容的 Hash 值满足规定的上限。在节点成功找到满足的Hash值之后,会马上对全网进行广播打包区块,网络的节点收到广播打包区块,会立刻对其进行验证。
如果验证通过,则表明已经有节点成功解迷,自己就不再竞争当前区块打包,而是选择接受这个区块,记录到自己的账本中,然后进行下一个区块的竞争猜谜。 网络中只有最快解谜的区块,才会添加的账本中,其他的节点进行复制,这样就保证了整个账本的唯一性。
假如节点有任何的作弊行为,都会导致网络的节点验证不通过,直接丢弃其打包的区块,这个区块就无法记录到总账本中,作弊的节点耗费的成本就白费了,因此在巨大的挖矿成本下,也使得矿工自觉自愿的遵守比特币系统的共识协议,也就确保了整个系统的安全。
举个例子,给定的一个基本的字符串”Hello, world!”,我们给出的工作量要求是,可以在这个字符串后面添加一个叫做nonce的整数值,对变更后(添加nonce)的字符串进行SHA256哈希运算,如果得到的哈希结果(以16进制的形式表示)是以”0000”开头的,则验证通过。为了达到这个工作量证明的目标。我们需要不停的递增nonce值,对得到的新字符串进行SHA256哈希运算。按照这个规则,我们需要经过4251次计算才能找到恰好前4位为0的哈希散列。
如图所示
然后我们今天呢,就用Go语言来实现它。
话不多说,首先从环境搭建教起,对,没错,就这个网址(https://www.golangtc.com/download)
选择你需要的,笔者话,选择的是go1.9.2windows-amd64.msi,不用配置环境,这里展示一下。
这样的话就妥了,然后呢,下载git,(https://git-scm.com/downloads)这个网址。
下载后打开,安装我们本次所需要的三个第三方库,spew,gorilla/mux,godotenv
spew 在控制台中格式化输出相应的结果。
gorilla/mux 是编写web处理程序的流行软件包。
godotenv 可以从我们项目的根目录的 .env 文件中读取数据。
事实上如果你打算做公链开发相关,这三个依赖是一直都要用的。
在git里分别输入
$ go get github.com/davecgh/go-spew/spew
$ go get github.com/gorilla/mux
$ go get github.com/joho/godotenv
友情提示这里会遇到一个很尴尬的问题,bash: