在 iOS 中实现区块链
一夜雨十年灯潞
发表于 2022-12-28 14:03:19
183
0
0
注意:本文不涉及节点(nodes/peers)、验证和奖励等。" a; H! M$ T) _" W
我会用 macOS Playground 来演示,快且方便,还有一些实用的函数可以用来生成 SHA 哈希值。' u. f( w- F/ F0 F
实现区块类
第一步是实现区块(Block)类,用来表示区块链中的一个区块。实现如下:$ e1 z y9 O. x& p; r% h
class Block {
var index: Int = 0
var dateCreated: String6 E8 C" o2 |" i, e5 r0 K
var previousHash: String!
var hash: String!
var nonce: Int3 S: M3 G. R+ M4 z
var data: String
var key: String {$ [( f/ R. h- T2 A) Z+ W
get {% E8 U) n2 C3 D; L: g
return String(self.index) + self.dateCreated + self.previousHash + self.data + String(self.nonce)
}6 ^6 K0 Q( B9 M9 f) u3 D8 G9 }% w
}0 }! g8 k1 L+ C
) o4 Q, I; Y1 ?4 c* P
init(data: String) {
self.dateCreated = Date().toString()
self.nonce = 0! C' u8 ]+ t8 O, s+ v& p
self.data = data
}
}
区块类详解:! T$ w) Q! y) P0 J
index——区块位于区块链中的位置。index 为 0 则表示该区块是区块链中的第一个区块。index 为 1 则表示区块链中的第二个区块……以此类推!dateCreated——区块创建的日期previousHash——前一个区块的哈希值hash——当前区块的哈希值nonce——递增的数字,对生成哈希值很关键data——任意有价值的信息。可以是金钱、医疗信息和房地产信息等等key——计算属性,提供给产生哈希值的函数
( p8 J' J& G; ?9 n2 `
实现区块链类
区块链(Blockchain)类需要用一个区块的实例来初始化自己。这个区块也被称为创世区块(genesis block),正因为它是区块链的第一个区块。区块链类实现如下:( L, E4 @3 i7 f5 z# I
class Blockchain {; G& ~$ h% u5 q
private (set) var blocks = [Block]()3 H0 t; g1 d4 d# {
4 ^+ |+ Z3 B. p! c8 g7 v b6 d
init(_ genesisBlock: Block) {
addBlock(genesisBlock)
}
, F0 O3 j$ S$ i. c0 `& k- o
func addBlock(_ block: Block) {
if blocks.isEmpty {
// 添加创世区块( N& f3 z5 `( O- g/ P, ?, F7 }! |" y" P
// 第一个区块没有 previous hash
block.previousHash = "0"
block.hash = generateHash(for: block): s; o& y! _+ N6 ]5 |1 m7 \2 J
} else {
let previousBlock = getPreviousBlock()
block.previousHash = previousBlock.hash8 L$ @* {% a( W; g2 l6 _* M J; g2 n
block.index = blocks.count
block.hash = generateHash(for: block)
}
3 U" H/ q* F, _4 G
blocks.append(block)) B4 e- i+ b; ~ `2 Y
displayBlock(block)
}
private func getPreviousBlock() -> Block { I& @, b9 O6 U4 M& ~7 w1 I" F
return blocks[blocks.count - 1]
}* B' t+ @5 F; o$ k% m% a$ m
8 K! e5 s) `' V1 S ^4 T# Y3 e
private func displayBlock(_ block: Block) {! K4 f! @0 `. w6 \ u1 f0 }
print("------ 第 \(block.index) 个区块 --------"): X; z) ^/ g# ]6 t
print("创建日期:\(block.dateCreated)")
print("数据:\(block.data)")
print("Nonce:\(block.nonce)")+ W$ `6 z! W7 K. {8 K
print("前一个区块的哈希值:\(block.previousHash!)")( ^& _0 P+ f7 d, b+ v& C' f
print("哈希值:\(block.hash!)")
}
private func generateHash(for block: Block) -> String {9 w, K4 @ F j+ d
var hash = block.key.sha1Hash()8 U. G. c1 S7 b* U& g
while !hash.hasPrefix("00") {
block.nonce += 12 f" e/ }7 I8 ~
hash = block.key.sha1Hash()
}
return hash2 E: ?1 s" Z% N' ?( C
}' T5 t o4 H( j, A3 ]# H
}
addBlock 函数用于给区块链增加区块。下一个区块则基于前一个区块的哈希值以及其它属性来计算 key。
generateHash 函数负责生成唯一的哈希值并赋值给区块。但并不使用完全随机的哈希,而是需要以“00”开头的特定哈希。这个概念叫做“工作量证明系统”。在实际中工作量证明系统的解法会更复杂,解决的人也会获得奖励(可能是额外的比特币)。
下面实际看看我们的区块链。5 d' m z" s: J
视频链接
从 Gist 上下载完整的源码。复制粘贴到 macOS Playground 里就可以运行。4 a9 V6 r) p/ l
原文 https://juejin.im/post/5a43ae5f51882538650977d1
成为第一个吐槽的人