如何用Go开发一个区块链项目:ABTC


本文摘自网络,作者,侵删。


作者简介

强 科 臻

ABitchain 项目的CTO,先后工作在互联网金融,区块链领域。专注于后端技术研发工作,主要专注 Java/Go,尤其是在分布式微服务,高并发,消息通信,区块链共识机制,加密技术等有丰富经验。

目录

1.区块链简单介绍

2.如何开发区块链

3.区块链遇见Go

4.Q&A

1.区块链简单介绍

1.1 区块链特征

  • 去中心化

  • 可信任的机器,防篡改分布式数据库

  • 通过密码学构建账户体系

  • 共识,P2P 通信是交易基础

    去中心化可以理解为在区块链网络中所有的网络节点都是对等的,没有任何对权,每个节点上做的都是一样的。区块链也可以简单的理解为去中心化的信任机器,这也是区块链最核心的价值。区块链通过密码学管理账户,通过 P2P 网络,共识算法建立交易的基础,在不借助第三方情况下,两个陌生人完成一笔交易。

1.2 区块链数据形态

区块链通过不可逆的链式结构,从创世块发起,以数据块的形式连接在一起,每个区块包含交易和验证信息,创世块包含初始的挖矿数据和规则。

2.如何开发区块链

区块链开发模式有以下内容:

  • 共识模式

  • 账号地址生成算法

  • P2P 是怎么实现通信的

  • 智能合约

  • 智能 Pending 区规则简单介绍

  • 区块数据底层存储

共识模式

常见的共识算法有 POW(Proof of Work),POS(Proof of Stake),DPOS(Delegated Proof-of-Stake),BPFT(Practical Byzantine Fault Tolerance)。

共识机制: DPOS+BFT

共识机制主要功能:定时任务管理,洗牌算法、代理池维护和投票机制。

1.定时任务管理。区块链的定时任务都是都是基于 NTP 来做的,通过 NTP 的协议,在相同的时间做相同的事,可以最大程度的保证时间的统一。主要设置的定时任务有定时洗牌、代理出块和节点数据同步。

2.洗牌算法。例如现在我们代理节点有 101 个,在某一个固定的时刻,通过洗牌的方式,将 101 个代理重新排队,将得到一个新的数据,这样设计的目的是在固定的周期内,洗牌的结果各个节点保持一致,整个区块链网络中让每一个节点洗牌结果一致,这是非常复杂的实现过程。

3.代理池和投票机制。普通用户账户上有一定的 Token 或达到某种条件,用户可以通过注册的方式成为代理候选人,注册为代理候选人就可以进入代理池空间。其他用户可以通过投票的方式支持候选人。等投票得到确认,代理池就会实时选出获得投票最多的代理候选人进行排序,这时我们再回到上面的洗牌算法,得出一个新的序列,每个代理就会在新的时间开始出块了。

账户地址生成算法

区块链作为一个交易性质的系统,账户是必不可少的。区块链主要解决两方面的问题,第一是证明数字资产所有权问题,第二是验证交易合法性。

通过密码学的应用,区块链证明了数字资产所有权的问题。如上图所示,私钥通过一种非对称加密方式,椭圆加密算法推导出公钥,公钥推算出地址,这个顺序是不可逆的,所以说一旦拥有了私钥,就拥有了这个地址上所有的资产。解决了数字资产所有权的问题。接下来看一下在交易当中如何证明一笔交易的合法性。如图所示,用户发起一笔交易,需要使用私钥,对交易数据签名,然后把签名交易数据在网络中传播, 其他节点收到交易后,需要使用用户的公钥,解密签名数据,如果能正常解密,并且验证通过,就能证明这笔交易的合法性,这一点是非对称加密算法所保证的。实际上私钥生成公钥的算法非常复杂,这幅图中只是画出了简单的推导过程。

 Achain 的地址生成过程,一开始只产生一个随机数,经过一个多次哈希计算和 base58 的计算推倒出私钥,接下来通过椭圆曲线加密算法推导出公钥,公钥通过特定的方式推导出地址。

P2P实现通信

要了解 P2P 通信,我们首先要了解一下 KAD 路由表,简单的说,这是一种分布式哈希表技术。每个节点内部都维护了这张路由表,如上图所示,可以把这张表简单理解为这个路由表,一行表示一个 K 桶,每个节点启动的时候会生成一个固定的节点编号,就是 NodelID。每个 K 桶的划分方式,是两个节点编号的距离范围值,图中第二列显示出了每个 K 桶容纳邻居节点,具体的距离范围,这个距离的计算方式是两个节点编号的二进制求异或值。例如:两个节点编号距离:0000000011 是 3 映射到 K2 桶中,简单理解了这张路由表,接下来了解一下本地节点是怎么维护这个表的,本地节点启动的时候会加载公共节点到对应的 K 桶中,接下来会随机的生成目标节点编号,计算本地节点和目标节点距离,然后从 K 桶中寻找距离最近的邻居节点,发送寻找命令,邻居节点收到寻找请求,会按照相同的方式找到离目标节点更近的节点,返回给本地节点,本地节点收到后,通过计算距离,放入对应的 K 桶中。这样循环处理,直到整个路由表填满邻居节点。现在,只要发起一笔交易,只需要广播到路由表中的邻居节点,就会迅速同步到全网络。

智能合约

智能合约在区块链当中很重要。智能合约是基于区块链,使用图灵完备的编程语言(例如: Solidity,lua 等)定义一段可运⾏的代码,这段代码完成了一系列的功能和约定。接下来看一下智能合约怎么进入区块链。可执行的代码是存储在区块链的块上的。而且它一旦发布的话就无法修改了,会形成契约,我们可以调用智能合约里面定义的方法,按照我们约定方式执行,得到预想的结果。

既然智能合约是一段代码,在区块链上普通的转帐一步就完成了,手续费一般情况下是固定的。大家都很关心的问题是智能合约怎么计算手续费。这需要考虑到保护整个系统的问题,假如说写一段死循环,区块链可能会挂掉。其实不是这样的,因为智能合约执行的时候,手续费是动态计算的,通过具体执行的代码一行一行计算手续费。上图是智能合约执行中手续费计算的一个参考列表。你写了死循环会把账户余额全部扣完之后,执行就退出了。所以这个智能合约在区块链上是安全,前提只要你有足够的手续费。

智能 Pending 区规则简单介绍

简单说,Pending 区是一个缓冲区域,但是经常会被大家忽略,我认为它在区块链当中作用非常大。用户所有发起的交易,首先会被收集到 Pending 区,同时也起到了保护整个区块链网不被恶意***。所以在设计 Pending 区的时候,我们要考虑到保证每个用户都能有公平参与交易的权利,还要从宏观上控制,微观上调整交易行为,通过完备的经济模式,和多维度智能识别,让区块链处于一个健康的状态。

区块数据底层存储

区块链存储数据结构要满足快速验证交易、有效防篡改、快速检索数据和分叉后能快速回滚等要求。

因为实际存储很复杂,所以我们通过一个例子简单的了解一下。我们最熟悉的比特币底层使用最多的是默克尔树,以太坊使用的是 MPT 树,接下来,我们就从这种树结构开始了解,我们发起一笔交易,交易 hash 值当作 key,key 通过前缀匹配的方式存入下图树状数据结构中 A 位置,产生一个新的叶子结点,由于新节点插入,受影响的父级相关节点 key 值,从下到上,都要重新计算得到新的 Key 值,一直到树根。得到新 Root 节点,代理出块的时候,就会将这个新 Root 节点放入新的区块头中,这笔交易也会放入区块中。如图所示,旧的 root 在区块编号100的区块头中,新的 root 在区块101的区块头中,两个区块又是通过 hash 值连接在一起,所以任何节点出现修改,都会导致 Root 节点变化,Root 节点变化就会导致区块头 hash 值变化,这有效的防止数据的篡改。现在我们基本清楚了一笔新交易,是怎么进入区块中的。当然,这只是对区块链存储一个粗略的了解,实际的存储还要复杂的多。

阅读剩余部分

相关阅读 >>

手撸Golang Go与微服务 saga模式之1

Go reflect

曹大谈 dubbo mesh : 在 mosn 中玩转 dubbo-Go

[Go] Golang 中main包下入口文件调用其它Go文件函数出现undefined

Golang中协程图文详解

Golang用什么开发工具?

关于Golang中的错误处理机制的详细介绍

Go实现字符串的逆序

关于Go值传递和地址传递的例子

许式伟:Go 语言有机会登顶,桌面侧亟待突破

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...