1.创建一条公链

本部分内容我们会使用Go语言去做代码实现,我们先在Go文件夹下的src目录下创建一个文件夹publicChain,用于存放所有代码文件

1.1 区块结构

通常意义上区块内容主要包含五个部分:区块高度、前一个区块的哈希、交易数据、时间戳以及本区块的哈希。使用Go语言中的Struct即可定义一个区块

/Users/go/src/publicChain/part1-Basic-Prototype/BLC/Block.go

package BLCimport ("bytes""crypto/sha256""fmt""strconv""time"
)//the structure of a block//five elements of a blocktype Block struct {//1.block heightHeight int64//2.the last block's hashPreBlockHash []byte//3.transaction dataData []byte//4.timestampTimestamp int64//5.block's hashHash []byte
}

注意:这里区块哈希值和交易数据类型都使用了[]byte类型,这是因为[]byte更加灵活和易操作

1.2 生成新区块

我们都知道,在区块链中新区块的生成依赖于上一个区块的信息,我们现在来创建一个函数专门用来生成新的区块

/Users/go/src/publicChain/part1-Basic-Prototype/BLC/Block.go

//a function to crate a new block//use the "Block" defined above to crate a new blockfunc Newblock(height int64, preBlockHash []byte, data string) *Block {//1.crate a new blockblock := &Block{height, preBlockHash, []byte(data), time.Now().Unix(), nil}//2.set Hashblock.SetHash()return block
}

在创建第一个区块的时候,需要我们提供区块的五要素,现在我们将提供前三个作为新函数的参数,时间戳直接调用系统即可,而本区块的哈希是由其它信息通过加密算法产生

我们先定义了一个block变量,实际上是上面Block的引用(直接传数据量太大了),这里的本区块哈希值我们暂且填充为nil

//1.crate a new blockblock := &Block{height, preBlockHash, []byte(data), time.Now().Unix(), nil}

这里我们用上面这个变量调用了一个新的函数专门用来生成本区块的哈希值

//2.set Hashblock.SetHash()

如下函数把int64类型的数据转化为了[]byte,并将其连起来用于生成哈希值

/Users/go/src/publicChain/part1-Basic-Prototype/BLC/Block.go

// a method to set the hash of the current block
// the hash of the current block is related to the rest data of current blockfunc (block *Block) SetHash() {//1.Convert int64 to byte sliceheightBytes := IntToHex(block.Height)//2.Convert int64 to byte slicetimeString := strconv.FormatInt(block.Timestamp, 2)timeBytes := []byte(timeString)//3.concatenate all propertiesblockBytes := bytes.Join([][]byte{heightBytes, block.PreBlockHash, block.Data, timeBytes, block.Hash}, []byte{})//4.produce Hashhash := sha256.Sum256(blockBytes)block.Hash = hash[:]
}

上述代码中的高度转换函数我们放在了另一个文件中

/Users/xxx/go/src/publicChain/part1-Basic-Prototype/BLC/utils.go

package BLCimport ("bytes""encoding/binary""log"
)func IntToHex(num int64) []byte {buff := new(bytes.Buffer)err := binary.Write(buff, binary.BigEndian, num)if err != nil {log.Panic(err)}return buff.Bytes()
}

现在我们在main函数中调用创建新区块函数来创建一个新区块

/Users/xxx/go/src/publicChain/part1-Basic-Prototype/main.go

package mainimport ("fmt""publicChain/part1-Basic-Prototype/BLC"
)func main() {block := BLC.Newblock(1, []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, "Genesis Block")fmt.Println(block)
}

上述代码需要先将我们之前编写区块信息的文件所在package引入,然后我们输入参数执行创建区块

go run /Users/xxx/go/src/publicChain/part1-Basic-Prototype/main.go
&{1 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [71 101 110 101 115 105 115 32 66 108 111 99 107] 1644720196 [222 198 1 25 64 182 79 119 172 158 96 167 155 99 63 150 224 32 236 130 59 132 237 238 11 17 221 189 168 89 77 137]}

现在我们成功的创建了一个区块

1.3 创世区块

现在我们把上述函数改写一下,即只需要在main函数中提供一个参数就可以生成创世区块

/Users/xxx/go/src/publicChain/part2-Basic-Prototype/BLC/Block.go

//creat a new function to produce a Genesis Blockfunc CrateGenesisBlock(data string) *Block {return Newblock(1, []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, data)
}

在main函数中直接调用并运行

/Users/xxx/go/src/publicChain/part1-Basic-Prototype/main.go

package mainimport ("fmt""publicChain/part1-Basic-Prototype/BLC"
)func main() {genesisBlock := BLC.CrateGenesisBlock("Genesis Block")fmt.Println(genesisBlock)
}
go run /Users/xxx/go/src/publicChain/part1-Basic-Prototype/main.go
&{1 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [71 101 110 101 115 105 115 32 66 108 111 99 107] 1644721098 [246 55 115 61 151 208 171 235 18 135 212 6 102 180 164 227 91 81 161 43 134 85 205 22 90 125 47 8 125 125 41 213]}

我们看到因为时间的不同我们又成功创建了一个新的创世区块

1.4 区块链结构

我们都知道区块链是一个个区块顺序连接起来的,我们现在来实现它

我们可以把区块链看作是一个有一个无限增加的[]Block的结构体

/Users/xxx/go/src/publicChain/part1-Basic-Prototype/BLC/Blockchain.go

package BLCtype Blockchain struct {Blocks []*Block //an ordered series of blocks
}

接着我们用创世区块创建一条区块链,并成功打印

/Users/xxx/go/src/publicChain/part1-Basic-Prototype/BLC/Blockchain.go

func CreatBlockchainWithGenesisBlock() *Blockchain {genesisBlock := CrateGenesisBlock("Genesis Data......")return &Blockchain{[]*Block{genesisBlock}}
}
package mainimport ("fmt""publicChain/part1-Basic-Prototype/BLC"
)func main() {genesisBlockchain := BLC.CreatBlockchainWithGenesisBlock()fmt.Println(genesisBlockchain)
}
go run /Users/xxx/go/src/publicChain/part1-Basic-Prototype/main.go
&{[0xc000078120]}

上述打印结果只是链中第一个元素的地址的引用,如果想看具体区块的信息也是可以的

func main() {genesisBlockchain := BLC.CreatBlockchainWithGenesisBlock()fmt.Println(genesisBlockchain)fmt.Println(genesisBlockchain.Blocks)fmt.Println(genesisBlockchain.Blocks[0])
}
go run /Users/xxx/go/src/publicChain/part1-Basic-Prototype/main.go
&{[0xc0000ae120]}
[0xc0000ae120]
&{1 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [71 101 110 101 115 105 115 32 68 97 116 97 46 46 46 46 46 46] 1644722516 [49 194 145 126 5 195 155 166 161 159 223 142 119 122 209 187 168 38 34 182 31 209 158 132 199 22 233 119 80 144 181 28]}

1.5 添加区块

我们在来定义一个函数将新生成的区块添加到链上

/Users/xxx/go/src/publicChain/part1-Basic-Prototype/BLC/Blockchain.go

//add a new block to blockchainfunc (blc *Blockchain) AddBlockToBlockchain(height int64, preHash []byte, data string) {//creat a new blocknewBlock := Newblock(height, preHash, data)//add a block to a blockchainblc.Blocks = append(blc.Blocks, newBlock)
}

然后我们再改写一下main函数并运行

/Users/xxx/go/src/publicChain/part1-Basic-Prototype/main.go

package mainimport ("fmt""publicChain/part1-Basic-Prototype/BLC"
)func main() {//creat a Genesis BlockBlockchain := BLC.CreatBlockchainWithGenesisBlock()// new blockBlockchain.AddBlockToBlockchain(Blockchain.Blocks[len(Blockchain.Blocks)-1].Height+1, Blockchain.Blocks[len(Blockchain.Blocks)-1].Hash, "Send 100RMB To Zhangqiang")Blockchain.AddBlockToBlockchain(Blockchain.Blocks[len(Blockchain.Blocks)-1].Height+1, Blockchain.Blocks[len(Blockchain.Blocks)-1].Hash, "Send 300RMB To Xinyi")Blockchain.AddBlockToBlockchain(Blockchain.Blocks[len(Blockchain.Blocks)-1].Height+1, Blockchain.Blocks[len(Blockchain.Blocks)-1].Hash, "Send 200RMB To Gaojian")Blockchain.AddBlockToBlockchain(Blockchain.Blocks[len(Blockchain.Blocks)-1].Height+1, Blockchain.Blocks[len(Blockchain.Blocks)-1].Hash, "Send 500RMB To Xiaochu")fmt.Println(Blockchain)fmt.Println(string(Blockchain.Blocks[4].Data))
}
go run /Users/xxx/go/src/publicChain/part1-Basic-Prototype/main.go
&{[0xc000056180 0xc0000561e0 0xc000056240 0xc0000562a0 0xc000056300]}
Send 500RMB To Xiaochu

我们看到区块成功的被加入到了链上,并且我们可以访问单个节点的交易数据

区块链项目 - 1 创建一条公链相关推荐

  1. 区块链项目的黑马——NGK超级公链

    区块链发展从最开始的技术实验到小范围应用,从市场酝酿到进入主流和公众视野,再到项目开始落地.技术变革.产业不断升级.但初步成型的区块链技术在顽固成疾的社会问题面前犹如隔靴挠痒,以致于早期的区块链技术仍 ...

  2. 哪条公链能承载Web 3.0应用爆发?

    来源 | 碳链价值 责编 | Carol 如果说Web 1.0像是拨号上网,Web 2.0像是宽带网络,那么Web 3.0--会是什么? 这个问题不用着急给出答案,让我们先把时间拉回到15年前. 20 ...

  3. 区块链公链开发 区块链一条公链开发费用

    公链就是指所有人都可以载入的.所有人都能推送买卖且交易能得到合理确定的.所有人都能参加在其中的共识全过程的区块链技术.公链采用了采取劳动量证实体制(POW).利益证实体制(POS).股权授权证明体制( ...

  4. CIC倡议创建“国家主权公链” (2021年中国国际服务贸易交易会) 及共鸣观点

    编者按: 发表这篇文章并不代表我一定看好国信公链的未来发展.而是,我和这篇宣言里的一些观点有所共鸣.这个构想是大胆的,也正逢其时:无论未来哪一条政府主导的公链成功,可能采取的方式是类似的. CIC是中 ...

  5. 一场为13条公链,5万多种通证赋能的全球开发者大赛正式开始!一等奖30万!...

    一场为13条公链,5万多种通证赋能的全球开发者大赛正式开始!一等奖30万! 目前,全球最强的区块链开发者社区是比特币和以太坊,紧随其后的所有公链项目都在开发者社区建设上下足了功夫.由于以太坊的网络效应 ...

  6. 一条公链的坎坷进化路 |链捕手

    2019年已经过了大半年,公链行业依然是那么地平淡无奇,没有爆款应用,也没有突破性技术,实在是令人揪心. 不过在表面的波澜不惊中,公链行业的玩家们都在发生翻天覆地的变动,它们曾苦苦寻找落地场景.争夺D ...

  7. 公链开发费用 开发一条公链费用是多少

    2016年情况下公链这词就发生在BTC上,那时大伙儿听见公链还搞不懂公链究竟是指什么,直到2017年12月大牛市之后公链这个词才真实的火起來,公链全名是公有制链,是世界上最早的区块链技术,也是当前应用 ...

  8. 有利可图的NFT,NA公链(Nirvana Chain)NAC公链怎么面对高额Gas费的?

    在过去的几个月里,被称为非同质化代币(non-funkible tokens,简称 NFT)的数字资产热度渐高,大受追捧--名人.艺术家和投资者通过卖出这些 NFT 创造了成百上千万美元的收入,创造者 ...

  9. NA公链双重隐私技术为NAC公链护航涅磐

    NA公链NAC公链挖矿 引言:在刚刚过去的2020年,"数字化"三个字在年度热词榜单里占据了绝对重要的位置.其实早在互联网出现的那一刻起,我们就已经进入数字化阶段,而互联网在近几年 ...

最新文章

  1. 又一款基于BCH开发出来的社交软件BlockPress
  2. Objective-C设计模式——生成器Builder(对象创建)
  3. 【LeetCode】687. 最长同值路径
  4. python3元类简介(metaclass)
  5. 达芬奇调色软件被曝两个远程代码执行缺陷
  6. IRT模型的参数估计方法(EM算法和MCMC算法)
  7. 一款GaN HEMT内匹配功率放大器设计过程详解
  8. 微信记账小程序(附源码),你值得拥有!
  9. R语言作图——Lollipop chart(棒棒糖图)
  10. WSA工具箱安装应用商店提示无法工作怎么解决?
  11. Java打印实心菱形和空心菱形
  12. 花花世界迷人眼,没有实力别赛脸,做Python实力派(万字精华,初学者,收藏必备!!!)
  13. 前端代码编辑器VS Code 必装插件有哪些?
  14. 计算机管理里显示磁盘丢失,Win10硬盘分区丢失,在磁盘管理中找不到
  15. unity3d触摸屏手势控制镜头旋转与缩放
  16. 女神节,致敬善良又可爱的妳们
  17. rust跳人头上_rust怎么跳的远 | 手游网游页游攻略大全
  18. Adobe Illustrator(AI)基础知识
  19. js 实现拖动元素到任意位置
  20. Array王锐大神力作:osg与PhysX结合系列内容——第1节 PhysX核心功能及基本程序结构介绍

热门文章

  1. Druid.io系列(一):简介
  2. 最新简约虚拟资源下载站源码+织梦Dedecms内核
  3. 当遇到网站打不开,你会怎么排查它的问题?
  4. 工商局爬虫 商标网爬虫
  5. Hbase学习之——协处理Coprocessor的使用
  6. 责任链模式(以及变种管道模式)的应用案例
  7. 我们都在努力奔跑,我们都是追梦人
  8. vue3 中使用腾讯地图
  9. 小程序获取微信运动步数并集成echarts报表显示
  10. 国内主要地图瓦片坐标系定义及计算原理