如何用围棋实现区块链

如何用围棋实现区块链

作者:链三丰

来源:微信微信官方账号区块链研究实验室

资料来源:https://mp.weixin.qq.com/s/pKYJCg9hsT3OFrR6JIITpg

互联网以来,链技术被一些人称为最有影响力的发明。尽管公众区块链解释为投机性加密货币的同义词,但区块链实际上在现代世界有着令人难以置信的广泛应用。实际上,加密货币只是区块链领域的一小部分,许多生产中的解决方案都是由私人组织领导的。

随着区块链技术快速发展,技术领域的专业人员越来越需要了解区块链的基本知识及其技术影响。

毕竟,实现自己的区块链实际上并不像听起来那么复杂。在本文中,我们将使用2021年最流行的编程语言之一GoLang来实现基本的区块链。那么,我们开始吧!

了解区块链

区块链是为数不多的名副其实的技术。我们可以把区块链想象成通过哈希相互连接的信息块,哈希是从输入数据生成的加密固定输出。因为每个块通过散列相互引用,所以不可能在不彻底改变链的其余部分的情况下改变链的任何部分。

区块链中的每个块可以包含几乎任何内容的数据。一个基本框架将包括每个区块过去交易的所有记录。比特币工作方式类似,这就是为什么你可以一直跟踪比特币交易,直到Satoshi第一次进行加密货币交易。

下面我们有三个块来创建区块链。首先是创作区块。因为之前什么都没有,所以之前的哈希字段是空的。我们仍然使用时间属性和初始事务作为哈希算法的输入。算法会吐出一堆数字字母代表Genesis块的哈希值。

转到块2,我们使用创建块的散列值作为块2的先前散列值。这个动作连接了创建块和第二个块!接下来,我们使用时间戳、事务列表和先前的散列值作为我们的散列算法的输入。该算法将为我们提供一个新的散列值来表示块2。

我们将继续重复该过程任意次,除了块的有效性和存储区块链的能力(比特币的区块链约为330 GB)之外,没有任何其他限制。

在Go中创建一个简单的区块链

创建区块链的第一步是定义什么是块。Go让我们的生活更容易创建自定义类型。我们可以使用下面的代码在块中定义类型。这里,块结构有四个字段来匹配上面的图表。

typeBlockstruct{

timestamptime。时间

交易[]字符串

prev hash[]字节

哈希[]字节

}

下一步是创建构造函数的Go版本,以创建新的块。这个函数的输入将使用一个字符串数组来表示事务,使用一个字节数组来表示对应于先前生成的块的先前散列值。下一个要研究的NewHash()函数是我们接下来要实现的。

func new Block(transactions[]string,prevHash[]byte)*Block{

当前时间:=时间。现在()

返回块{

时间戳:当前时间,

交易:交易,

prevHash:prevHash,

Hash:NewHash(currentTime,transactions,prevHash),

}

}

NewHash()函数将时间、事务列表和以前的散列作为我们的输入参数,并返回一个字节数组来表示新生成的散列值。在这个函数中,我们基本上只是将所有输入混合到一个名为input的字节数组中。我们通过使用append()函数的附加时间参数来实现这一点,并且通过将时间转换为字符串,prevHash使用.追加prevHash片作为后缀时间片。

然后,我们遍历事务并将每个单独的事务附加到输入数据blob。有趣的语法字符串(rune(transactions)).只是一个方法输入,用于将每个元素转换成一个可以在Go中附加的切片。就是输入垃圾内容,如果真的想要,请深入研究。

funcNewHash(timetime。时间,事务[]字符串,prev hash[]字节)[]字节{

输入:=append(prevHash,time。字符串().)

for transaction:=range transactions {

输入=追加(输入,字符串(符文(事务)).)

}

哈希:=sha256 .Sum256(输入)

returnhash哈希哈希[:]

}

最后,我们使用秘密党员包转到电话sha256 .Sum256()与投入作为它的参数。这将为我们的所有数据输入提供新的哈希表示。我们返回时哈希[:]使用的[:]语法将混杂在返回时切成适当的长度。

这实际上是我们开始链接我们的区块链所需的全部。当然,我们希望在程序中看到某种输出,以便在打印时可以使用一些辅助方法:

funcprintBlockInformation(Block * Block){

fmt .printf(\' \\ t时间:%s\\n \',block.timestamp.String())

fmt .Printf(\'\\tprevHash:%x\\n \',block.prevHash)

fmt .printf(\' \\ t哈希:%x\\n \',块。哈希)

打印事务(块)

}

funcprintTransactions(Block * Block){

fmt .println(\' \\ t事务:\')

fori,事务:=范围块。交易记录{

fmt .Printf(\'\\t\\t%v:%q\\n \',I,transaction)

}

}

现在剩下的就是创建新的事务,块和哈希。我们可以通过我们的主要方法来做到这一点。我们定义了一个字符串数组来记录我们的区块链中的交易。另请注意,我们如何传递一个空字节数组NewBlock()来生成名为的第一个块基因区块。

funcmain(){

创世纪事务:=[]string { \' izzysentwill 50比特币,\' WillsentIzzy30bitcoin比特币比特币\' }

起源块:=新块(起源事务,[]字节{})

fmt .Println(\' -第一个块-\')

打印块信息(基因块)

块2事务:=[]string { \' johnsentizzy 30比特币\' }

块2:=新块(块2事务,genesis块.哈希)

fmt .Println(\' - SecondBlock -\')

打印块信息(块2)

块3事务:=[]string { \' willsentizzy 45比特币,\' IzzysentWill10bitcoin比特币比特币\' }

块3:=新块(块3事务,块2 .哈希)

fmt .Println(\' - ThirdBlock -\')

打印块信息(块3)

}

为了创建新的区块,我们将前一个区块的哈希值NewBlock()与对应的交易历史记录一起传递。如果您想在一个地方查看整个程序,则为:

包主

导入(

加密/sha256 \'

\' fmt \'

时间

)

typeBlockstruct{

timestamptime .时间

交易[]字符串

上一个哈希[]字节

哈希[]字节

}

funcmain(){

创世纪事务:=[]string { \' izzysentwill 50比特币,\' WillsentIzzy30bitcoin比特币比特币\' }

起源块:=新块(起源事务,[]字节{})

fmt .Println(\' -第一个块-\')

打印块信息(基因块)

块2事务:=[]string { \' johnsentizzy 30比特币\' }

块2:=新块(块2事务,genesis块.哈希)

fmt .Println(\' - SecondBlock -\')

打印块信息(块2)

块3事务:=[]string { \' willsentizzy 45比特币,\' IzzysentWill10bitcoin比特币比特币\' }

块3:=新块(块3事务,块2 .哈希)

fmt .Println(\' - ThirdBlock -\')

打印块信息(块3)

}

func新块(transactions[]string,prevHash[]byte)*Block{

当前时间:=时间。现在()

返回块{

时间戳:当前时间,

交易:交易,

prevHash:prevHash,

Hash:NewHash(currentTime,transactions,prevHash),

}

}

funcNewHash(timetime .时间,事务[]字符串,上一个哈希[]字节)[]字节{

输入:=append(prevHash,time .字符串().)

对于交易:=交易范围{

输入=追加(输入,字符串(符文(事务)).)

}

哈希:=sha256 .Sum256(输入)

returnhash哈希哈希[:]

}

funcprintBlockInformation(Block * Block){

fmt .printf(\' \\ t时间:%s\\n \',block.timestamp.String())

fmt .Printf(\'\\tprevHash:%x\\n \',block.prevHash)

fmt .printf(\' \\ t哈希:%x\\n \',块。哈希)

打印事务(块)

}

funcprintTransactions(Block * Block){

fmt .println(\' \\ t事务:\')

fori,事务:=范围块。交易记录{

fmt .Printf(\'\\t\\t%v:%q\\n \',I,transaction)

}

}

如果要运行此程序,将得到以下输出:

nbspgorunexample.go

-第一街区-

时间:2021-04-0515:12:18.813294-0600 mdtm=0.000074939

prevHash:

哈希:43 EC 51 c 50d 2 b 9565 f 221155 a 29d 8 b 72307247 b 08 EAF 6731 CCA

交易:

0:“izzysentwill 50比特币\"

1:“willsentizz 30比特币\"

-第二街区-

时间:2021-04-0515:12:18.813477-0600 mdtm=0.000257244

前一散列值:43 EC 51 c 50d 2 b 9565 f 221155 a 29d 8 b 72307247 b 08 EAF 6731 CCA

哈希:fcce 5323 a 35 CB 67 b 45 Fe 75866582 db 00 FD 32 baeb 92 AAC 448 c 7

交易:

0:“约翰森蒂西30岁比特币\"

第三块

时间:2021-04-0515:12:18.813488-0600 mdtm=0.000269168

前一散列值:fcce 5323 a 35 CB 67 b45 Fe 75866582 db 00 FD 32 baeb 92 AAC 448 c 7

哈希:fc 1 D3 eee 286970d 85812 b 47 C3 a5 BF 016 AE 8 C1 de 4 f 86 b 8 ace 972 FFA

交易:

0:\"willsentizz 45比特币\"

1:“izzysentwill 10比特币\"

过程可能会很粗糙,但这是创建自己的区块链的基础

作者:链三丰

来源:微信公众号:区块链研究实验室

出处:https://MP。微信。QQ。R6 jiitpg的com/s/pkyjcg 9 HST 3

版权声明:区块链电子发票平台 发表于 2022-12-05 20:16:51。
转载请注明:如何用围棋实现区块链 | 零零洞洞

暂无评论

暂无评论...