Go语言从零构建区块链 (一)

区块与区块链

区块

在区块链中,区块是一种数据结构,是一个包含多个交易记录的数据集合,每个区块通常包含以下几个主要部分:

  1. 区块头(Block Header):通常包含了区块的版本号、时间戳、前一个区块的哈希值、当前区块中交易记录的Merkle Tree根哈希值等元数据信息。
  2. 区块数据(Transaction Data):记录了在当前区块中的所有交易记录,如转账、合约执行等操作。
  3. 区块哈希(Block Hash):区块头部信息通过哈希算法计算得到的一个固定长度的哈希值,用于唯一标识该区块。
  4. 前一区块哈希值(Previous Block Hash):记录了当前区块之前一个区块的哈希值,这样就构成了一个区块链。

示例代码

1
2
3
4
5
6
type Block struct {
Timestamp int64
Hash []byte
PrevHash []byte
Data []byte
}

在比特币和许多其他基于区块链的加密货币中,每个区块的大小通常限制在一定的范围内,比如比特币的区块大小为1MB。区块大小的限制有助于确保整个区块链网络的安全和可扩展性。

区块链

区块链由一个个区块组成,每个区块都包含上一个区块的哈希,形成了一个不可更改的链。由于每个区块都包含前一个区块的哈希,任何修改前面的区块将会影响到后续的所有区块,因此保证了区块链的安全性和不可篡改性。

在区块链中,所有的参与者都可以查看和验证区块链中的数据,因为它们都存储在分布式网络中的节点上,并且每个节点都可以复制和存储数据。这种去中心化的特点使得区块链不依赖于任何中央机构或第三方信任,从而实现了信息的去中心化、安全性和透明度。

区块链技术主要核心特点:

  1. 不可篡改
  2. 去中心化

区块链的安全性主要是由加密算法和共识机制来保证的,加密算法使得数据的存储和传输变得安全可靠,共识机制则通过各种算法来实现所有节点对数据的一致认可和共同维护。这些特点让区块链在金融、供应链、物联网等领域都有着广泛的应用前景,被誉为“信任机器”。

示例代码

1
2
3
type BlockChain struct {
Blocks []*Block
}

哈希

对于一个区块而言,可以通过哈希算法概括其所包含的所有信息,哈希值就相当于区块的ID值,同时也可以用来检查区块所包含信息的完整性

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func (b *Block) SetHash() {
information := bytes.Join([][]byte{ToHexInt(b.Timestamp), b.PrevHash, b.Data}, []byte{})
hash := sha256.Sum256(information)
b.Hash = hash[:]
}

func ToHexInt(num int64) []byte {
buff := new(bytes.Buffer)
err := binary.Write(buff, binary.BigEndian, num)
if err != nil {
log.Panic(err)
}

return buff.Bytes()
}
  • information变量是将区块的各项属性串联之后的字节串, 对information做哈希就可以得到区块的哈希值

区块创建

1
2
3
4
5
func CreateBlock(prevHash, data []byte) *Block {
block := Block{time.Now().Unix(), []byte{}, prevHash, data}
block.SetHash()
return &block
}

创世区块

1
2
3
4
func GenesisBlock() *Block {
genesisWords := "This is the genesis"
return CreateBlock([]byte{}, []byte(genesisWords))
}
  • 创世区块上一个区块的哈希值为空

区块链初始化

1
2
3
4
5
func CreateBlockChain() *BlockChain {
blockchain := BlockChain{}
blockchain.Blocks = append(blockchain.Blocks, GenesisBlock())
return &blockchain
}

添加区块到区块链

1
2
3
4
func (bc *BlockChain) AddBlock(data string) {
newBlock := CreateBlock(bc.Blocks[len(bc.Blocks)-1].Hash, []byte(data))
bc.Blocks = append(bc.Blocks, newBlock)
}

简易区块链系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func main() {
blockchain := CreateBlockChain()
time.Sleep(time.Second)
blockchain.AddBlock("After genesis, I have something to say.")
time.Sleep(time.Second)
blockchain.AddBlock("this is chatgpt")
time.Sleep(time.Second)
blockchain.AddBlock("I want a lot of money")
time.Sleep(time.Second)

for _, block := range blockchain.Blocks {
fmt.Printf("Timestamp: %d\n", block.Timestamp)
fmt.Printf("hash: %x\n", block.Hash)
fmt.Printf("Previous hash: %d\n", block.PrevHash)
fmt.Printf("Data: %s\n", block.Data)
}
}

运行结果
运行结果