Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Upcoming SlideShare
What to Upload to SlideShare
Next
Download to read offline and view in fullscreen.

Share

Swiftでブロックチェーンを実装する

Download to read offline

Swiftでブロックチェーンを実装する

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • Be the first to like this

Swiftでブロックチェーンを実装する

  1. 1. Swiftでブロックチェーン を実装する 第2回 ブロックチェーンエンジニア勉強会 2018/04/18 Bitz Co., Ltd. 村上幸雄
  2. 2. • 埼玉県朝霞市でソフトハウスを起業。 • macOSやiOS、Androidのアプリケーション開発を主に請け負う。 • 自社アプリの製作。 • Twitter: @m_yukio • Facebook: yukio.murakami • GitHub: murakami • http://www.bitz.co.jp/weblog/
  3. 3. BUKURO.swift • macOS/iOS/watchOS/tvOSプログラマーのための勉強会。 初心者大歓迎。 • Cocoa勉強会 関東とMOSAの合同勉強会。 ほぼ毎月、池袋コワーキングスペース OpenOffice FOREST で開催。 • 申し込みは、connpassから。 https://cocoa-kanto.connpass.com/ • プログラマーが楽しくプログラミングできるようにサポートする場を 提供したい • 勉強会に参加された方全員が学びを得られる様にサポートします! • 勉強会に参加できない方にも学び得られるよう、勉強会の成果を可 能な限りアウトプットします! • プログラマの拠り所となる場を目指します!
  4. 4. • PubHack.swiftは、飲み会イベントを通じて、 macOS/iOS/tvOS/watchOS/Androidエンジニアの人たちの交流を目的として います。 • Cocoa勉強会 関東とMOSAの合同イベント。 • 申し込みは、connpassから。 https://cocoa-kanto.connpass.com/
  5. 5. The Bash in Tokyo • MOXSSGとCocoa勉強会 関東、MOSAとの合同で開催予 定です。 • WWDCのチケットが買えず、日本残留組となった方々へ の朗報です。The Bashモドキを東京で開催します。もち ろん本家と違って、会場も屋内でクールなバンドもきま せん。飲食も持ち込みとなる予定です。ですが、WWDC をつまみに語らいましょう。 • 6/15(金)、場所は渋谷の hoops link tokyo です。
  6. 6. Learn Blockchains by Building One The fastest way to learn how Blockchains work is to build one https://hackernoon.com/learn-blockchains-by-building-one-117428612f46 https://github.com/dvf/blockchain 【参考】 ブロックチェーンを作ることで学ぶ 〜ブロックチェーンがどのように動いているのか学ぶ最速の方法は作ってみることだ〜 https://qiita.com/hidehiro98/items/841ece65d896aeaa8a2a Swiftでブロックチェーンを実装してみる https://qiita.com/shu223/items/ebe59325f36fbf25e3d6 Pythonで実装されたコードを参考サイトの情報を 利用して実装してみました。
  7. 7. サンプルコードを公開しています。 https://github.com/murakami/workbook/tree/master/blockchain 元のPythonコードに合わせているので、 Swiftの命名規則などには合わせていません。
  8. 8. 記事のPythonコードをSwiftで先ずは空実装 struct Block { } struct Transaction { } class Blockchain { var chain: [Block] = [] var currentTransactions: [Transaction] = [] func newBlock() { } func newTransaction() { } func hash(block: Block) { } func lastBlock() { } }
  9. 9. 記事の値からSwiftの定義を決める block = { 'index': 1, 'timestamp': 1506057125.900785, 'transactions': [ { 'sender': "8527147fe1f5426f9dd545de4b27ee00", 'recipient': "a77f5cdfa2934df3954a5c7c7da5df1f", 'amount': 5, } ], 'proof': 324984774000, 'previous_hash': "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824" } struct Block { let index: Int /* 1, 2, … */ let timestamp: Double let transactions: [Transaction] let proof: Int let previousHash: Data }
  10. 10. 記事のコードからSwiftの定義を決める self.current_transactions.append({ 'sender': sender, 'recipient': recipient, 'amount': amount, }) struct Transaction { let sender: String let recipient: String let amount: Int }
  11. 11. 送信者のアドレス 受信者のアドレス 量 送信者のアドレス 受信者のアドレス 量 タイムスタンプ 索引 前ブロックのハッシュ プルーフ トランザクション ブロック
  12. 12. トランザクションをブロックに追加する /* 新しいトランザクションをリストに加えた後、 そのトランザクションが加えられるブロック(次に採掘されるブロック)の索引を返す. */ func newTransaction(sender: String, recipient: String, amount: Int) -> Int { /* 次に採掘されるブロックに加える新しいトランザクションを作る */ let transaction = Transaction( sender: sender, /* 送信者のアドレス */ recipient: recipient, /* 受信者のアドレス */ amount: amount) /* 量 */ currentTransactions.append(transaction) /* このトランザクションを含むブロックのアドレス */ return lastBlock().index + 1 /* 次のブロックの索引 */ }
  13. 13. 新しいブロックを作る func newBlock(proof: Int, previousHash: Data? = nil) -> Block { let prevHash: Data if let previousHash = previousHash { /* ジェネシスブロックの場合なのか? */ prevHash = previousHash } else { // 前のブロックのハッシュ prevHash = lastBlock().hash() } let block = Block(index: chain.count+1, timestamp: Date().timeIntervalSince1970, transactions: currentTransactions, /* 複数のトランザクションがあり得る? */ proof: proof, previousHash: prevHash) // 現在のトランザクションリストをリセット currentTransactions = [] chain.append(block) return block } func lastBlock() -> Block { guard let last = chain.last else { /* 配列の最後の要素 */ fatalError("The chain should have at least one block as a genesis.") } return last }
  14. 14. ジェネシスブロック init() { newBlock(proof: 100, previousHash: "1".data(using: .utf8)) }
  15. 15. ハッシュ struct Block: Codable { let index: Int /* 1, 2, ... */ let timestamp: Double /* Date().timeIntervalSince1970 */ let transactions: [Transaction] let proof: Int let previousHash: Data func hash() -> Data { let encoder = JSONEncoder() let data = try! encoder.encode(self) return data.sha256()! } } struct Transaction: Codable { let sender: String let recipient: String let amount: Int } extension Data { // https://stackoverflow.com/questions/25388747/sha256-in-swift func sha256() -> Data? { guard let res = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH)) else { return nil } CC_SHA256((self as NSData).bytes, CC_LONG(self.count), res.mutableBytes.assumingMemoryBound(to: UInt8.self)) return res as Data } }
  16. 16. プルーフ・オブ・ワークアルゴリズム (PoW) class func proofOfWork(lastProof: Int) -> Int { var proof: Int = 0 while validProof(lastProof: lastProof, proof: proof) == false { proof += 1 } return proof } class func validProof(lastProof: Int, proof: Int) -> Bool { let proofArray = [lastProof, proof] let encoder = JSONEncoder() let guess = try! encoder.encode(proofArray) let guessHash = guess.sha256()! return guessHash[0] == 0 && guessHash[1] == 0 && guessHash[2] == 0 && guessHash[3] == 0 }
  17. 17. 動かしてみる class BlockchainManager { /* ブロックチェーンクラスのインスタンス */ let blockchain = Blockchain() /* 新規トランザクションを作る */ func newTransactions(sender: String, recipient: String, amount: Int) -> Int { return blockchain.newTransaction(sender:sender, recipient:recipient, amount:amount) } /* 新規ブロックを採掘する */ func mine(recipient: String) -> Block { // 次のプルーフを見つけるためプルーフ・オブ・ワークアルゴリズムを使用する let lastBlock = blockchain.lastBlock() let lastProof = lastBlock.proof let proof = Blockchain.proofOfWork(lastProof: lastProof) // プルーフを見つけたことに対する報酬を得る // 送信者は、採掘者が新しいコインを採掘したことを表すために"0"とする _ = blockchain.newTransaction(sender: "0", recipient: recipient, amount: 1) // チェーンに新しいブロックを加えることで、新しいブロックを採掘する let block = blockchain.newBlock(proof: proof) return block } /* フルブロックチェーンを返す */ func fullChain() -> [Block] { return blockchain.chain } }
  18. 18. let blockchainManager = BlockchainManager() /* 新しいブロックの採掘 */ var block = blockchainManager.mine(recipient: "demo") print("採掘したブロックチェーン: (block)") /* 新しいブロックの採掘 */ block = blockchainManager.mine(recipient: "demo") print("採掘したブロックチェーン: (block)") /* 新しいブロックの採掘 */ block = blockchainManager.mine(recipient: "demo") print("採掘したブロックチェーン: (block)") /* フルブロックチェーンを */ let fullChain = blockchainManager.fullChain() for block in fullChain { print("ブロック: (block)") }
  19. 19. 採掘したブロックチェーン: Block(index: 2, timestamp: 1523800131.2186232, transactions: [blockchain.Transaction(sender: "0", recipient: "demo", amount: 1)], proof: 23735, previousHash: 32 bytes) 採掘したブロックチェーン: Block(index: 3, timestamp: 1523800131.2215281, transactions: [blockchain.Transaction(sender: "0", recipient: "demo", amount: 1)], proof: 28, previousHash: 32 bytes) 採掘したブロックチェーン: Block(index: 4, timestamp: 1523800131.2483349, transactions: [blockchain.Transaction(sender: "0", recipient: "demo", amount: 1)], proof: 1128, previousHash: 32 bytes) ブロック: Block(index: 1, timestamp: 1523800130.7891741, transactions: [], proof: 100, previousHash: 1 bytes) ブロック: Block(index: 2, timestamp: 1523800131.2186232, transactions: [blockchain.Transaction(sender: "0", recipient: "demo", amount: 1)], proof: 23735, previousHash: 32 bytes) ブロック: Block(index: 3, timestamp: 1523800131.2215281, transactions: [blockchain.Transaction(sender: "0", recipient: "demo", amount: 1)], proof: 28, previousHash: 32 bytes) ブロック: Block(index: 4, timestamp: 1523800131.2483349, transactions: [blockchain.Transaction(sender: "0", recipient: "demo", amount: 1)], proof: 1128, previousHash: 32 bytes)
  20. 20. コンセンサス • ノードを登録。 • ノード間で違いがある場合、コンフリクトしてる ということ。 • 最も長いチェーンが信頼できる。 • ブロックのハッシュが正しいことを確認する。 • プルーフ・オブ・ワークが正しいことを確認す る。
  21. 21. デモ

Swiftでブロックチェーンを実装する

Views

Total views

418

On Slideshare

0

From embeds

0

Number of embeds

45

Actions

Downloads

4

Shares

0

Comments

0

Likes

0

×