在 iOS 中实现区块链
一夜雨十年灯潞
发表于 2022-12-28 14:03:19
96
0
0
注意:本文不涉及节点(nodes/peers)、验证和奖励等。4 K( l+ V# l4 T) B4 I; r1 @. r- _
我会用 macOS Playground 来演示,快且方便,还有一些实用的函数可以用来生成 SHA 哈希值。
实现区块类2 }. Z- W* ?: ~; t
第一步是实现区块(Block)类,用来表示区块链中的一个区块。实现如下:
class Block {
var index: Int = 0
var dateCreated: String
var previousHash: String!! O3 d2 w+ k" K3 H9 [% y
var hash: String!; H0 `+ i1 H* u3 O. B- o; |) X
var nonce: Int
var data: String
var key: String {/ _2 J; I3 d- k' d8 R
get {' p! t/ G& A7 K) y. h1 V
return String(self.index) + self.dateCreated + self.previousHash + self.data + String(self.nonce)+ J/ {5 z! k. s( q+ H$ w: \
}
}$ Y( _. `0 f% N+ T5 y
( {! A. R! U# k0 R
init(data: String) {
self.dateCreated = Date().toString()/ [) K5 d3 ^' g9 D4 Z) ]. k- }
self.nonce = 0
self.data = data
}9 F: U' L$ _! g( R1 s! ?4 {
}
区块类详解:
index——区块位于区块链中的位置。index 为 0 则表示该区块是区块链中的第一个区块。index 为 1 则表示区块链中的第二个区块……以此类推!dateCreated——区块创建的日期previousHash——前一个区块的哈希值hash——当前区块的哈希值nonce——递增的数字,对生成哈希值很关键data——任意有价值的信息。可以是金钱、医疗信息和房地产信息等等key——计算属性,提供给产生哈希值的函数
( ?" I0 l2 P! P0 G4 X( v4 R1 T4 c
实现区块链类
区块链(Blockchain)类需要用一个区块的实例来初始化自己。这个区块也被称为创世区块(genesis block),正因为它是区块链的第一个区块。区块链类实现如下:
class Blockchain {
private (set) var blocks = [Block]()
/ A; x* n- ]1 @/ t* s5 Z" r$ L, k S
init(_ genesisBlock: Block) {% ^5 |5 w) l4 q/ l5 I
addBlock(genesisBlock)
}% q3 J" R/ \* S2 e
func addBlock(_ block: Block) {
if blocks.isEmpty {% t; T1 l9 s. }* l, f" N
// 添加创世区块
// 第一个区块没有 previous hash
block.previousHash = "0"
block.hash = generateHash(for: block)
} else {
let previousBlock = getPreviousBlock()8 J) b% K5 S9 o, x& _
block.previousHash = previousBlock.hash8 P& o& V2 p! V4 b/ A) B/ K
block.index = blocks.count
block.hash = generateHash(for: block)8 W4 P5 `+ c/ c
}( z d8 c X8 Q2 M+ i. n
% u0 k9 j+ M& C
blocks.append(block)
displayBlock(block)% ~7 Y7 b7 P4 `8 O8 B
}
private func getPreviousBlock() -> Block {
return blocks[blocks.count - 1]
}1 P) \ ^7 E& h: z: _+ Z/ d
7 S( D7 W$ B+ F/ Q! K, y
private func displayBlock(_ block: Block) {5 R) F% x5 o0 L& b0 [5 q R7 a
print("------ 第 \(block.index) 个区块 --------")
print("创建日期:\(block.dateCreated)")
print("数据:\(block.data)")
print("Nonce:\(block.nonce)")0 v* M( N9 m5 n7 r) A3 j: `8 s
print("前一个区块的哈希值:\(block.previousHash!)")
print("哈希值:\(block.hash!)")- h2 G% e4 g7 h0 B# c
}' \1 h9 p; s8 n4 z( M2 L! `8 v7 V
, ~) m+ |: ~( S, D
private func generateHash(for block: Block) -> String {
var hash = block.key.sha1Hash()
while !hash.hasPrefix("00") {. B: S6 \8 @; a; C, `& e
block.nonce += 13 [% S% k- ?/ P) ]
hash = block.key.sha1Hash()
}
return hash
}
}
addBlock 函数用于给区块链增加区块。下一个区块则基于前一个区块的哈希值以及其它属性来计算 key。
generateHash 函数负责生成唯一的哈希值并赋值给区块。但并不使用完全随机的哈希,而是需要以“00”开头的特定哈希。这个概念叫做“工作量证明系统”。在实际中工作量证明系统的解法会更复杂,解决的人也会获得奖励(可能是额外的比特币)。8 h% v7 c2 E/ ]' l: g5 y. N
下面实际看看我们的区块链。
视频链接
从 Gist 上下载完整的源码。复制粘贴到 macOS Playground 里就可以运行。: v( T: K& q' L: }
原文 https://juejin.im/post/5a43ae5f51882538650977d1
成为第一个吐槽的人