在 iOS 中实现区块链
一夜雨十年灯潞
发表于 2022-12-28 14:03:19
124
0
0
注意:本文不涉及节点(nodes/peers)、验证和奖励等。
我会用 macOS Playground 来演示,快且方便,还有一些实用的函数可以用来生成 SHA 哈希值。
实现区块类
第一步是实现区块(Block)类,用来表示区块链中的一个区块。实现如下: [* f& A6 F/ d/ j0 O3 ]3 m
class Block {
var index: Int = 0
var dateCreated: String
var previousHash: String!
var hash: String!( m) ?- X' h' Q$ d8 k
var nonce: Int
var data: String+ ~0 I% q' J9 t/ K1 m6 I, U
var key: String {, A/ F; B7 E; Z" k' S& ^7 H) C
get {
return String(self.index) + self.dateCreated + self.previousHash + self.data + String(self.nonce)
}3 }! {$ k& k4 l, k' @* ^
}
. g; E' `/ e: Q: R6 e) u B+ G" ^
init(data: String) {- t, d, v; @/ N3 {/ w M! D2 G
self.dateCreated = Date().toString()
self.nonce = 06 M4 }2 j. {7 f; Y7 r
self.data = data
}
}* p6 D/ x; m, q1 \
区块类详解:6 q+ u( Z2 R% `) `" E
index——区块位于区块链中的位置。index 为 0 则表示该区块是区块链中的第一个区块。index 为 1 则表示区块链中的第二个区块……以此类推!dateCreated——区块创建的日期previousHash——前一个区块的哈希值hash——当前区块的哈希值nonce——递增的数字,对生成哈希值很关键data——任意有价值的信息。可以是金钱、医疗信息和房地产信息等等key——计算属性,提供给产生哈希值的函数+ [. c8 u+ \- p, ^" M
9 V& ]) f1 X& Q3 s
实现区块链类* r4 k+ s' M( D. q
区块链(Blockchain)类需要用一个区块的实例来初始化自己。这个区块也被称为创世区块(genesis block),正因为它是区块链的第一个区块。区块链类实现如下:$ C H( ]- I1 `* Y( D% I
class Blockchain {
private (set) var blocks = [Block]()
init(_ genesisBlock: Block) {+ b7 b# O8 l, }, ^, \
addBlock(genesisBlock)0 m0 |) h* q- N$ `' m
} R) B- l! w$ w( w; X
7 U+ u7 i& |8 r4 j
func addBlock(_ block: Block) {
if blocks.isEmpty {5 \" P% y" r+ G B- T' ^: D) P
// 添加创世区块) t6 c* ~9 O. C* m. b# z0 a
// 第一个区块没有 previous hash
block.previousHash = "0"$ M) ^# F7 q, P' I1 P+ e
block.hash = generateHash(for: block)
} else {
let previousBlock = getPreviousBlock()
block.previousHash = previousBlock.hash
block.index = blocks.count
block.hash = generateHash(for: block)& O0 ~. N% s% k
}
blocks.append(block)! S9 c2 L& ^/ m4 N
displayBlock(block)
}
0 n. O3 c5 v4 j5 f- G& B
private func getPreviousBlock() -> Block {9 @5 n% F" ^$ U) N) s1 r
return blocks[blocks.count - 1], G! S: t' v' h% H. B& s1 C
}
private func displayBlock(_ block: Block) {
print("------ 第 \(block.index) 个区块 --------")) `/ B: S A' f3 [
print("创建日期:\(block.dateCreated)")4 Q9 B% L: @* f
print("数据:\(block.data)")& g, [/ M5 N/ r, G" x( O: U
print("Nonce:\(block.nonce)")# |% Q+ }6 c( i/ M
print("前一个区块的哈希值:\(block.previousHash!)")
print("哈希值:\(block.hash!)")
}
( c' `0 c: l# U
private func generateHash(for block: Block) -> String {
var hash = block.key.sha1Hash()8 D {' Q9 L6 M" z* W3 L3 n' T
while !hash.hasPrefix("00") {
block.nonce += 1
hash = block.key.sha1Hash()
}
return hash
} l: i! e& v. n! M2 w* _5 b; c
}
addBlock 函数用于给区块链增加区块。下一个区块则基于前一个区块的哈希值以及其它属性来计算 key。7 _3 a! o5 `. d) O9 p" g
generateHash 函数负责生成唯一的哈希值并赋值给区块。但并不使用完全随机的哈希,而是需要以“00”开头的特定哈希。这个概念叫做“工作量证明系统”。在实际中工作量证明系统的解法会更复杂,解决的人也会获得奖励(可能是额外的比特币)。
下面实际看看我们的区块链。1 E" y0 M T' A1 m4 A
视频链接0 i' p5 R2 t9 z P) g E
从 Gist 上下载完整的源码。复制粘贴到 macOS Playground 里就可以运行。
原文 https://juejin.im/post/5a43ae5f51882538650977d1
成为第一个吐槽的人