内容简介:原理就不介绍了,具体可以去看我的另一篇区块链重要的 数据层、网络层、共识层、激励层下面的代码只是展示了数据层上面的东西,后续会把剩余的补充上,好好学习,天天向上。加油。
原理就不介绍了,具体可以去看我的另一篇 通过一个App Demo的演示深入理解区块链运行原理 代码只是最简单的,只是简单的实现了对一个区块的定义以及区块之间的联系。在这里p2p,激励,共识都没有。
区块链重要的 数据层、网络层、共识层、激励层
下面的代码只是展示了数据层上面的东西,后续会把剩余的补充上,好好学习,天天向上。加油。
package main
import (
"bytes"
"crypto/sha256"
"encoding/binary"
"fmt"
"os"
"time"
)
// 实现int转换成byte数组
func Int2Byte(num int64) []byte {
var buffer bytes.Buffer
err := binary.Write(&buffer, binary.BigEndian, num)
CheckErr(err)
return buffer.Bytes()
}
func CheckErr(err error) {
if err != nil {
fmt.Println("err:", err)
os.Exit(1)
}
}
//区块的结构
type Block struct {
Version int64
PrevBlockHash []byte
Hash []byte
TimeStamp int64
TargetBits int64
Nonce int64
MerkeRoot []byte
Data []byte
}
func NewBlock(data string, prevBlockHash []byte) *Block {
block := &Block{
Version: 1,
PrevBlockHash: prevBlockHash,
TimeStamp: time.Now().Unix(),
TargetBits: 10,
Nonce: 5,
MerkeRoot: []byte{},
Data: []byte(data)}
block.SetHash()
return block
}
// int -> byte
func (block *Block) SetHash() {
tmp := [][]byte{
//实现将int转成byte数组的函数
Int2Byte(block.Version),
block.PrevBlockHash,
Int2Byte(block.TimeStamp),
block.MerkeRoot,
Int2Byte(block.Nonce),
block.Data}
//将区块个字段连接成一个切片,使用[]byte{}进行连接
data := bytes.Join(tmp, []byte{})
//算出hash的值
hash := sha256.Sum256(data)
block.Hash = hash[:]
}
func NewGenesisBlock() *Block {
return NewBlock("Genesis Block!", []byte{})
}
type BlockChian struct {
//使用切片保存区块,用于模拟区块链
blocks []*Block
}
func NewBlockChain() *BlockChian {
//创建一个区块链
return &BlockChian{[]*Block{NewGenesisBlock()}}
}
func (bc *BlockChian) AddBlock(data string) {
// 防止区块越界
if len(bc.blocks) <= 0 {
os.Exit(1)
}
lastBlock := bc.blocks[len(bc.blocks)-1]
block := NewBlock(data, lastBlock.Hash)
bc.blocks = append(bc.blocks, block)
}
func main() {
// 实例化一个区块链
bc := NewBlockChain()
//添加block
bc.AddBlock("测试第一个BTC")
bc.AddBlock("测试第二个EOS")
//打印出信息
for i, block := range bc.blocks {
fmt.Println("=========block num:", i)
fmt.Println("data", string(block.Data))
fmt.Println("Version:", block.Version)
fmt.Printf("Hash:%x\n", block.Hash)
fmt.Printf("TimeStamp:%d\n", block.TimeStamp)
fmt.Printf("MerkeRoot:%x\n", block.MerkeRoot)
fmt.Printf("None:%d\n", block.Nonce)
}
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
UML用户指南
[美] Grady Booch、James Rumbaugh、Ivar Jacobson / 邵维忠、麻志毅、马浩海、刘辉 / 人民邮电出版社 / 2006-6 / 49.00元
《UML用户指南》(第2版)是UML方面最权威的一本著作,三位作者是面向对象方法最早的倡导者,是UML的创始人。本版涵盖了UML 2.0。书中为具体的UML特征提供了参考,描述了一个使用UML进行开发的过程,旨在让读者掌握UML的术语、规则和语言特点,以及如何有效地使用这种语言,知道如何应用UML去解决一些常见的建模问题。《UML用户指南》(第2版)由7个部分组成,而且每章都描述了一个特定UML特......一起来看看 《UML用户指南》 这本书的介绍吧!