请用goland语言编写一个区块链代码
时间: 2024-05-15 07:13:50 浏览: 146
很抱歉,由于go语言的正确写法是"golang",我可以为您提供一个golang语言编写的简单区块链代码示例:
```go
package main
import (
"crypto/sha256"
"encoding/hex"
"encoding/json"
"fmt"
"time"
)
// 区块结构体
type Block struct {
Index int // 区块索引
Timestamp string // 时间戳
Data string // 区块数据
PrevHash string // 上一个区块的哈希值
Hash string // 当前区块的哈希值
}
// 计算哈希值
func calculateHash(block Block) string {
record := fmt.Sprintf("%d%s%s%s", block.Index, block.Timestamp, block.Data, block.PrevHash)
h := sha256.New()
h.Write([]byte(record))
hashed := h.Sum(nil)
return hex.EncodeToString(hashed)
}
// 生成新区块
func generateBlock(prevBlock Block, data string) Block {
var newBlock Block
newBlock.Index = prevBlock.Index + 1
newBlock.Timestamp = time.Now().String()
newBlock.Data = data
newBlock.PrevHash = prevBlock.Hash
newBlock.Hash = calculateHash(newBlock)
return newBlock
}
// 验证区块是否合法
func isBlockValid(newBlock, prevBlock Block) bool {
if prevBlock.Index+1 != newBlock.Index {
return false
}
if prevBlock.Hash != newBlock.PrevHash {
return false
}
if calculateHash(newBlock) != newBlock.Hash {
return false
}
return true
}
// 区块链结构体
type Blockchain struct {
Chain []Block // 区块链
}
// 添加新区块
func (bc *Blockchain) AddBlock(data string) {
prevBlock := bc.Chain[len(bc.Chain)-1]
newBlock := generateBlock(prevBlock, data)
if isBlockValid(newBlock, prevBlock) {
bc.Chain = append(bc.Chain, newBlock)
}
}
// 初始化区块链
func initializeBlockchain() Blockchain {
return Blockchain{[]Block{{
Index: 0,
Timestamp: time.Now().String(),
Data: "Genesis Block",
PrevHash: "",
Hash: "",
}}}
}
// 打印区块链
func printBlockchain(bc Blockchain) {
bcJson, _ := json.MarshalIndent(bc, "", " ")
fmt.Println(string(bcJson))
}
func main() {
bc := initializeBlockchain()
bc.AddBlock("Block 1")
bc.AddBlock("Block 2")
printBlockchain(bc)
}
```
这是一个非常简单的区块链代码,它实现了区块的创建、校验和链的打印功能。当然,在实际应用中,需要考虑更多的安全和性能问题。
阅读全文