在 iOS 中实现区块链
一夜雨十年灯潞
发表于 2022-12-28 14:03:19
95
0
0
注意:本文不涉及节点(nodes/peers)、验证和奖励等。
我会用 macOS Playground 来演示,快且方便,还有一些实用的函数可以用来生成 SHA 哈希值。4 ^/ t7 q% F( n, ~) {2 c; O3 `
实现区块类
第一步是实现区块(Block)类,用来表示区块链中的一个区块。实现如下:2 r# V1 p' E% z1 I* i& h
class Block {
var index: Int = 0! S6 P! @% [7 ?; ?' `# W5 Z
var dateCreated: String
var previousHash: String!+ G3 S8 ^; C! y# ?9 H T$ x
var hash: String!
var nonce: Int. Z" { |7 [( ^, p
var data: String Z8 ?5 M; F( _+ \# Q
var key: String {: ^9 m' K6 `1 f- f) T) Y
get {
return String(self.index) + self.dateCreated + self.previousHash + self.data + String(self.nonce)" e I% C" w( S, Y, ^% i
}# ?( u8 w/ L2 q' f
}
init(data: String) {. m* a( Y! h( t
self.dateCreated = Date().toString()
self.nonce = 0
self.data = data
}
}
区块类详解:$ Q1 G9 P9 h, |9 G1 _9 u/ `
index——区块位于区块链中的位置。index 为 0 则表示该区块是区块链中的第一个区块。index 为 1 则表示区块链中的第二个区块……以此类推!dateCreated——区块创建的日期previousHash——前一个区块的哈希值hash——当前区块的哈希值nonce——递增的数字,对生成哈希值很关键data——任意有价值的信息。可以是金钱、医疗信息和房地产信息等等key——计算属性,提供给产生哈希值的函数- A- \6 ]" P0 d! w8 Q2 G* `
实现区块链类; o+ S" U* V' h/ p4 q
区块链(Blockchain)类需要用一个区块的实例来初始化自己。这个区块也被称为创世区块(genesis block),正因为它是区块链的第一个区块。区块链类实现如下:
class Blockchain {1 h7 m D4 M8 p! B6 p
private (set) var blocks = [Block]()- c! H! N: N( f: P2 i' S+ B( Y' B
/ o: a8 Y' S( ]( j. A
init(_ genesisBlock: Block) {
addBlock(genesisBlock)+ |3 i5 O5 J8 W/ ^0 }$ q
}
/ L3 r4 B# F6 y! o3 }" |( W
func addBlock(_ block: Block) {3 ^% K% ^8 ?2 K1 D2 u+ |1 ^
if blocks.isEmpty {
// 添加创世区块. w, A8 |- h# A9 G }' n
// 第一个区块没有 previous hash
block.previousHash = "0"
block.hash = generateHash(for: block)' \# v+ L+ i8 w5 h
} else {' b, _( X# `0 U( q
let previousBlock = getPreviousBlock()
block.previousHash = previousBlock.hash) F/ S1 r8 h1 O' P4 j- _9 i
block.index = blocks.count
block.hash = generateHash(for: block)
}
blocks.append(block)
displayBlock(block)
}2 M4 m! l) j9 m5 w* R8 v
private func getPreviousBlock() -> Block {
return blocks[blocks.count - 1]
}
8 @/ k: d( K5 D3 Z0 d! t
private func displayBlock(_ block: Block) {" T( m/ j; q5 a0 ~1 A) M* }; h
print("------ 第 \(block.index) 个区块 --------")
print("创建日期:\(block.dateCreated)")4 n" L1 S0 x: h. x# ~+ b X# p1 b
print("数据:\(block.data)")
print("Nonce:\(block.nonce)")& P% o: L* d! U+ X/ R" r& {+ [$ v
print("前一个区块的哈希值:\(block.previousHash!)")
print("哈希值:\(block.hash!)")
}
0 b- U1 H4 i6 Q! k
private func generateHash(for block: Block) -> String {
var hash = block.key.sha1Hash()% S" n4 H% X% D" }
while !hash.hasPrefix("00") {; Z" U7 M! a/ v4 L9 C
block.nonce += 1
hash = block.key.sha1Hash()
}/ S7 w! q$ r' A, Z5 n1 _
return hash
}) m4 c1 S. V: h
}
addBlock 函数用于给区块链增加区块。下一个区块则基于前一个区块的哈希值以及其它属性来计算 key。; {+ b1 k! {$ B& C5 x y, O
generateHash 函数负责生成唯一的哈希值并赋值给区块。但并不使用完全随机的哈希,而是需要以“00”开头的特定哈希。这个概念叫做“工作量证明系统”。在实际中工作量证明系统的解法会更复杂,解决的人也会获得奖励(可能是额外的比特币)。
下面实际看看我们的区块链。
视频链接
从 Gist 上下载完整的源码。复制粘贴到 macOS Playground 里就可以运行。
原文 https://juejin.im/post/5a43ae5f51882538650977d1
成为第一个吐槽的人