本文摘自网络,作者,侵删。
作者简介
强 科 臻
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 值变化,这有效的防止数据的篡改。现在我们基本清楚了一笔新交易,是怎么进入区块中的。当然,这只是对区块链存储一个粗略的了解,实际的存储还要复杂的多。
相关阅读 >>
曹大谈 dubbo mesh : 在 mosn 中玩转 dubbo-Go
[Go] Golang 中main包下入口文件调用其它Go文件函数出现undefined
更多相关阅读请进入《Go》频道 >>
Go语言101
一个与时俱进的Go编程知识库。