1.1.1区块链的基本概念
区块抽象到计算机语言中就是一个对象、一个结构体、一个类,同样类中也可以定义属性、变量和方法,但区块里包括的内容可以自己来定义。比如,以太坊公链的区块结构,它有变量,我们就可以自己进行定义。以下是我们设置一个区块包括变量的例子。
1.1.2链的分类
区块链的链分类通常有3类,即公有链、私有链和联盟链。这3类链的主要区别是:
(1)公有链的维护节点比较多,节点网络对所有人开放,任何人都可以进行特定的数据访问。
(2)私有链是面向个人或某个组织的。
(3)联盟链是多个组织团体的节点联合在一起维护的,对组织开放。
1.2共识的作用
每条区块链上的节点都有存储数据的地方,每个节点之间需要相互通信,通信过程中要保证数据的一致性,此时就诞生了区块链技术栈中的另一个知识点:共识,又称共识机制。
如果区块链中没有共识机制,那么节点之间就会各干各的,会失去一致性,区块链不会达成统一性。
共识算法的作用?
- 在众多节点且相同的时间流逝中,A节点有可能诞生一个区块1,B节点也有可能诞生一个区块1,这样它们诞生的区块号就发生重复了。在同一条链中,相同区块号的区块最终只能挑选一个串接到链中,这时取谁的好呢?此时就需要用共识算法这一规则来做出选择了。
1.2常见的共识算法(三种)
- PoW(工作量证明算法)
挖矿者进行的计算量越大,解答的问题越多,那么就更容易获得记账权(该矿工挖出的区块被接入主链)==⇒”多劳多得”
- PoS(股权证明算法)
该算法没有挖矿这一说法,而是在创世区块内写明股权分配比例,谁的股份多,谁就容易获得记账权。
- DPoS(股份授权证明机制算法)
DPoS引入了“见证者节点”这个概念。见证者节点可以生成区块。注意,这里有权限生成区块的是见证者节点,而不是持股节点。
- BPFT(拜占庭容错算法)
联盟链中常用,此处略…
见证者节点:
每一个持有股份的节点都可以投票选举见证者节点,得到总同意票数中的前N位候选者可以当选为见证者节点。
三种算法的比较:DPoS>PoW+PoS
PoW | PoS | DPoS | |
优点 | 公平 | 防作弊,节约消耗 | 能耗低,去中心化,公平 |
缺点 | 吃硬件,吃算力 | 不公平 | 有安全隐患 |
1.3共识算法的实现
1.3.1定义候选区块数组
候选区块数组可以保存每个节点广播过来的和自己当前节点生成的对象。
globleBlocks []Blocks//公链区块数组 candidateBlocks []Blocks//候选区块数组
我们定义的区块体结构block如下:
type Block struct{ Timestamp string//时间戳 Hash string//哈希值 PrevHash string//上一个区块的哈希值 NodeAddress string//区块节点地址 Data string//区块的数据 }
1.3.2定义共识算法机制难度系数difficultlty
该系数表现了难度系数
- 生成新区块:
func generateBlock(old Block,data string) Block{ var newBlock Block; t:=秒级别时间戳 newBlock.Index=oldBlock.Index+1 newBlock.Timstamp=t.String() newBlock.Data=Data//区块的附属数据 newBlock.PrevHash=oldBlock.Hash//区块的父区块的哈希值 for i:=0;;i++{ newBlock.Nonce=hex; newBlock.Hash=calculateHash(newBlock) if isBlockHashMatchDiffculty(newBlock,diffculty){ candidateBlocks=append(candiateBlocks,newBlock)//添加候选区块 break } } }
假设节点启动了一个子协程且在不断地计算候选区块数组中区块的哈希值,所计算出的哈希值满足难度系数difficultlty的校验
var resultBlock Block for block~candiateBlocks{ resultBlock=block break } continue }