当前位置: 首页 > 科技观察

如何从0

时间:2023-03-15 00:43:55 科技观察

打造其中一条区块链本文转载自微信公众号《区块链研究实验室》,作者连三丰。转载本文请联系区块链研究实验室公众号。什么是区块链?建一个难吗?从哪儿开始?使用哪种编程语言?相信我,在遇到对区块链技术感兴趣的人时,我经常会收到这些问题,你可能也会这样做。对其中一些问题。网上有大量的区块链资源,但将它们理解为这项新兴技术的新事物可能会让人不知所措。在这篇文章中,我将一步步向您展示,您将了解区块链的基本概念以及如何在解决方案1中使用Python、Javascript或Golang。我选择这些语言是因为大多数人都熟悉它们,尤其是Javascript和Python。但为了速度、耐用性和安全性,大多数区块链核心引擎都是内置的c/c++(比特币、EOS)、Go(HyperledgerFabric、以太坊)、Java(以太坊)、Rust、Haskell和/或Ruby(以太坊))然后提供与其他易于使用的编程语言的集成。此外,一些区块链引擎结合了多种编程语言,以提高开发人员的健壮性和易用性,以太坊是最好的用例。先决条件:网络密码学数据结构和算法分布式系统Javascript/Go/Python您只需要基本概念即可对Riot区块链原型进行编程。什么是区块链?让我们首先了解区块链不是比特币,区块链不是数字货币,区块链是一组已经存在的不同技术。让我们举个例子来简化事情,因为工程师更了解数字。让我们看一下存储一些信息的MySQL数据库。使用上面的数据库,我们可以:做一些CRUD(创建、检索、更新和删除)操作,同样的信息存储两次,删除整个数据库,我们不能与他人共享敏感信息,数据库可以集中(单点故障、安全问题),其中存储的所有内容都不可信任。一些数据库可以允许表之间的关系(例如RDBMS),其他的则不能容忍它们(例如NoSQL数据库),恶意的人可能会炸毁需要DBA的数据库(他/她可以更改或泄露信息)用户无法控制他们自己的数据等等...那么,为什么我们需要一些不同的东西,一些可靠的东西,一些独立于人的东西,一些自动的东西,一些不可变的东西?这就是区块链的起点。区块链是一个安全可信的去中心化数据库和网络。“真相只能在一个地方找到:代码。”区块链是一系列区块。块就像数据库中的表,但不能删除或更新。块包含称为事务和其他附加数据的信息。这些块经过密码验证并链接以形成称为区块链或分类账的不可变块链。然后,同一条链通过P2P网络分发到全网所有节点。因此,跨节点共享的所有交易(数据)都包含在块中,而不是集中式数据库,这些块链接在一起以创建分类帐。该分类帐代表区块链中的所有数据。分类帐中的所有数据均由加密哈希和数字签名保护,并由共识算法验证。网络上的节点参与以确保分布在网络中的所有数据副本都是相同的。区块链生态系统中要记住的5个关键概念:加密哈希和数字签名不可变账本P2P网络共识算法(PoW、PoS、PBFT、ETc……)区块验证(挖矿、锻造等)我们将继续解释这些概念细节。使用区块链的好处:去除中介机构不可变的账本透明度安全什么时候使用区块链?区块链不是灵丹妙药,所以在以下情况下使用它:存储的数据不需要修改(存在证明)数据不能被操纵它的所有者拒绝(无可否认)你想要去中心化你想要单一的真相来源你想要高安全性你不想要不必担心速度(例如,比特币平均需要10分钟来验证交易)。但是一些区块链速度更快,因为它们使用不同于我们稍后将讨论的PoW的共识算法。区块链用例区块链应用领域房地产:土地所有权医疗保健:安全记录患者数据金融:减少税收和中介、反洗钱、跨境支付创建原创内容)网络安全:DDOS攻击将权力还给用户:自己数据并与需要它的人安全地共享(DID)加密货币交易所投票机制区块链平台和应用程序Dano等...区块链类型私有:仅在内部使用且我们更了解用户的地方(例如HyperledgerFabric)公开:每个人都可以看到发生了什么(比特币、以太坊)混合:合并前两个。“空谈很便宜。给我看代码。”构建区块链有两种方法:一种简单的方法是使用现有的预构建区块链开源资源,例如Ethereum、Fabric、EOS等……如果它们都不符合您的要求,那么从头开始构建在这个系列,我们将从头开始构建一个,以便您可以全面了解区块链的状态机。如何构建区块链?好的,现在让我们使用三种不同的编程语言Go、Python和Javascript创建我们的第一个小型区块链演示。这些原型可以帮助您理解我们之前介绍的概念。首先,我们将创建一个块,其次,我们将向其中添加数据(标题和文本),第三,我们将散列该块,最后但并非最不重要的一点是,我们将链接其中的所有块。一个块包含前面提到的信息,但为了简单起见,我们将删除一些信息。让我们深入了解细节!希望你熟悉我之前提到的Go编程,如果不想学习基础知识:函数、方法、数据类型、结构、流控制、迭代等......创建一个文件夹并向其中添加2个文件,main.go和block.go文件夹结构:go//thefoldermain.go//file1block.go//file2main.go//usethemainpackagepackagemain//importthefmtpackageimport("fmt")funcmain(){fmt.Println("Iambuildingmyfirstblockchain")//printthisCreateBlock("Thehearderwillbeshownhere","thebodywillbeshownhere")//callthefunctionthatwillcreatetheblockandpasssomeparametersinit.}如果你运行这个,你会得到一个错误消息,因为CreateBlock函数还没有定义,所以继续在block.go中创建它:block.gopackagemainimport("fmt"//thiswillhelpustoprintonthescreen)funcCreateBlock(Header,Bodystring){fmt.Println(Header,"\n",Body)//Showmetheblockcontent}Go的美妙之处在于您不必导入或导出函数,只需使用大写字母声明它们,Go会找到他们给你。现在打开终端并移动到您创建的文件夹,运行gobuild然后.\go适用于Windows、./goLinux和Macbook。我们刚刚创建了一个简单的Go程序,它调用一个函数并将一些字符串数据传递给它。让我们继续做更多好事。让我们添加2个文件,blockchain.go和structures.go现在我们有4个文件:main.go、block.go、structures.go和blockchain.go我将在代码的每一行中添加一些注释,以便为您提供我在做什么的想法。structures.gopackagemain//Importthemainpackage//CreatetheBlockdatastructure//Ablockcontainsthisinfo:typeBlockstruct{Timestampint64//thetimewhentheblockwascreatedPreviousBlockHash[]byte//thehashofthepreviousblockMyBlockHash[]byte//thehashofthecurrentblockAllData[]byte//thedataortransactions(bodyinfo)}//准备区块链数据结构:Blockchaindatastruct:typeBlockchain[]byte*Block//rememberablockchainisaseriesofblocks}block.gopackagemainimport(//我们将需要这些库:“bytes”//需要将数据转换为字节以便发送到网络,计算机理解更好的字节(8位)语言“crypto/sha256”//加密库以散列数据“strconv”//用于转换“时间”//我们的时间戳的时间)//现在让'screateamethodforgeneratingahashoftheblock//我们将只是连接所有的数据和hashit以获得块hashfunc(block*Block)SetHash(){timestamp:=[]byte(strconv.FormatInt(block.Timestamp,10))//获取时间并转换成一个唯一的数字序列ers:=bytes.Join([][]byte{timestamp,block.PreviousBlockHash,block.AllData},[]byte{})//concatenatealltheblockdatahash:=sha256.Sum256(headers)//hashthewholethingblock.MyBlockHash=hash[:]//nowsetthehashoftheblock}//CreateafunctionfornewblockgenerationandreturnthatblockfuncNewBlock(datastring,prevBlockHash[]byte)*Block{block:=&Block{time.Now().Unix(),prevBlockHash,[]byte{},[]byte(data)}//theblockisreceivedblock.SetHash()//theblockishedreturnblock//theblockisreturnedwithalltheinformationinit}/*让我们现在创建创始区块函数,它将返回第一个区块。创世区块是链上的第一个区块*/funcNewGenesisBlock()*Block{returnNewBlock("GenesisBlock",[]byte{})//用一些数据初始化的创世区块函数(blockchain*Blockchain)AddBlock(datastring){PreviousBlock:=blockchain.Blocks[len(blockchain.Blocks)-1]//需要上一个block,让我们获取newBlock:=NewBlock(data,PreviousBlock.MyBlockHash)//createanewblockcontainingthedataandthehashofthepreviousblockblockchain.Blocks=append(blockchain.Blocks,newBlock)//addthatblocktothechaintocreateachainofblocks}/*Createthefunctionthatreturnsthewholeblockchainandaddthegenesistoitfirst.thegenesisblockisthefirsteverminedblock,solet'screateafunctionthatwillreturnitsinceitdoesnotexistyet*/funcNewBlockchain()*Blockchain{//thefunctioniscreatedreturn&Blockchain{[]*Block{NewGenesisBlock()}}//thegenesisblockisaddedfirsttothechain}main.go//Timetoputeverythingtogetherandtestpackagemainimport("fmt"//justforprintingsomethingonthescreen)funcmain(){newblockchain:=NewBlockchain()//初始化区块链//create2blocksandadd2transactionsnewblockchain.AddBlock("firsttransaction")//firstblockcontainingonetxnewblockchain.AddBlock("Secondtransaction")//secondblockcontainingonetx//现在打印所有的块和它们的内容for_,block:=rangenewblockchain.Blocks{//iterateoneeachblockfmt.Printf("Hashoftheblock%x\n",block.MyBlockHash)//printthehashoftheblockfmt.Printf("HashofthepreviousBlock:%x\n",block.PreviousBlockHash)//printthehashofthepreviousblockfmt.Printf("Allthetransactions:%s\n",block.AllData)//printthetransactions}//ourblockchainwillbeprinted}让我们现在运行这个,去构建然后。\go我们在区块链中的块没有任何ID和时间戳,所以让我们修改main.go文件以添加此信息,并在for循环中添加以下两行:fmt.Printf("BlockID:%d\n",i)fmt.Printf("Timestamp:%d\n",block.Timestamp+int64(i))//Timetoputeverythingtogetherandtestpackagemainimport("fmt"//justforprintingsomethingonthescreen)funcmain(){newblockchain:=NewBlockchain()//初始化区块链//create2blocksandadd2transactionsnewblockchain.AddBlock("firsttransaction")//firstblockcontainingonetxnewblockchain.AddBlock("Secondtransaction")//secondblockcontainingonetx//Nowprintalltheblockforiandtheircontent,block:=rangenewblockchain.Blocks{//迭代器atoneachblockfmt.Printf("BlockID:%d\n",i)//打印块IDfmt.Printf("Timestamp:%d\n",block.Timestamp+int64(i))//打印块的时间戳,让它们不同,wejustaddavalueifmt.Printf("Hashoftheblock:%x\n",block.MyBlockHash)//printthehashoftheblockfmt.Printf("HashofthepreviousBlock:%x\n",block.PreviousBlockHash)//printthehashofthepreviousblockfmt.Printf("Allthetransactions:%s\n",block.AllData)//printthetransactions}//ourblockchainwillbeprinted}让我们保存代码,去构建并再次运行它,然后。前一个块,这使得它不可变,如果该块中的数据发生更改,哈希将自动更改并且该块将被丢弃。创世块没有任何先前的哈希值,因为它是第一个哈希值,所以没有先前的块。全做完了!恭喜,您刚刚用Go创建了自己的区块链DEMO!