徹底理解ブロックチェーンを読む【ch10】

データのハッシュ化

分散型のP2Pシステムでは膨大な量のトランザクションデータを扱うことになる。 トランザクションデータが唯一のものかどうかの識別と比較はすばやく行う必要がある。

ハッシュ関数の特性

暗号的ハッシュ関数の特徴

  • あらゆる種類のデータに対してハッシュ値をすばやく提供
  • データに対して決定的
    • 同じインプットに対して、同じアウトプットを出力
  • データに対して疑似ランダム
  • 一方向性関数
    • 出力から入力値を追跡出来ない関数のことを呼ぶ
  • 衝突耐性がある
    • 全く異なるデータから全く同じハッシュ値を出力するのが難しい

徹底理解ブロックチェーンを読む【ch04】

問題の核心を明らかにする

P2Pシステムの課題

各人が継続的にP2Pに貢献するためには、システムを信用し、やりとりにおいて間違えがないことを確信する必要がある。

  • 完全性の脅威
    • 技術的な障害
    • 悪意をもつピア
  • 完全性の達成
    • ピアの数
    • ピアの信頼性

徹底理解ブロックチェーンを読む【ch03】

可能性を認識する

P2Pとは

定義

複数のノードで(個々のコンピュータ)で構成される分散システム

複数のノードは以下の役割計算リソースの提供を負う供給者であり、消費者でもある。

P2Pアーキテクチャ

基本的には分散システムだが、一部、集中型の要素を利用するのもある。 集中型の要素を用いた代表的なP2Pナップスター

完全な分散型は集中システムが介在する必要がないため、中抜きが必要なくなる。

音楽ダウンロードを例にすると、

集中システム: アーティスト(音源作成) → 集中システム(レコード会社) → (購入)ユーザー

に対して

分散システム: アーティスト → ユーザー

と、中抜きがなくなる。

徹底理解ブロックチェーンを読む【ch02】

全体像を把握する

分散システムの利点

  • 計算能力の高さ
    • 接続されたすべてのコンピューターの能力
  • コスト削減
    • コンピューターは毎年安く・高性能になっている。置き換えやすい分散SYSは安く抑えることができる
  • 信頼性の高さ
    • PCが壊れても、接続されたPC全体の運用は継続可能
  • 自然に成長する能力
    • ネットワーク全体が増えれば計算能力が増えていく

分散システムの欠点

  • 協調のオーバーヘッド、通信のオーバーヘッド
    • 接続されたコンピュータの協調性を保ったり、通信をおこなうため、作業量や計算量が要求される
  • ネットワークへの依存性
  • プログラムの複雑化
  • セキュリティの不正
    • ネットワーク経由での通信は何者かに不正にアクセスされるおそれがある。

分散型のP2Pシステム

  • P2P
    • P2Pネットワークは各コンピュータ(ノードとも呼ぶ)で構成され、 各ノードに計算リソースを提供する。 P2Pにはファイル共有、コンテンツ配信といったアプリケーションがある。

徹底理解ブロックチェーンを読む【ch01】

はじめに

最近、ブロックチェーンの本を購入したので、読書メモがてらブログに投稿していきます!

これから、読む本は以下のものです。 徹底理解ブロックチェーン ゼロから着実にわかる次世代技術の原則(impress top gear) | Daniel Drescher, 株式会社クイープ |本 | 通販 | Amazon

ch01(レイヤと機能面)

今回の章は今後の説明のため、ソフトウェアに対しての考え方(レイヤ、完全性) を説明しています。

レイヤ

システムは以下の2つのレイヤに合わせる事ができる。

  1. アプリケーション層と実装層
  2. アプリケーション層はユーザーのニーズに合わせて、実装層はそれらのニーズを満たすことに焦点をあわせる。

  3. 機能面(システムが行うこと)と非機能面(システムに行わせること)

完全性

  • データ完全性
    • 管理されるデータが完全かつ正確
  • 振る舞い完全性
    • システムが意図したとおりに動くこと
  • セキュリティ
    • 承認されたユーザーだけがシステムのデータや機能にアクセス出来る。

デリゲートパターン

最近、Swiftを勉強していて、デリゲートパターンが よく使われているのでブログにまとめておきます。

デリゲートパターンとは

Delegateとは日本語で 委譲 を意味します。 日本語の意味する通り、デリゲートパターンとは 他者(他クラス)に規定した処理(Swiftではプロトコルが使われる)を委譲することを意味します。

code例

コード例は以下の通りとなります。

// プロトコルを宣言
protocol HouseWorkDelegate {
  func startHouseWork()
  func cleanRoom()
  func makeDish()
  func finishHouseWork()
}

//  
class Employer {
  var Servant:HouseWorkDelegate? = nil
  func doWork() {
      if let sv = self.Servant {
        sv.startHouseWork()
        sv.cleanRoom()
        sv.makeDish()
        sv.finishHouseWork()
      } else {
        print("今日は使用人がいないので家事をはじめます")
        print("掃除をします")
        print("料理を作ります")
        print("家事、終わります。自分で作る料理はうまくない")
      }
  }
}

class Servant : HouseWorkDelegate {
  func startHouseWork() {
    print("使用人が家事をはじめます")
  }
  func cleanRoom() {
    print("掃除をします")
  }
  func makeDish() {
    print("料理を作ります")
  }
  func finishHouseWork() {
    print("家事、終わります。美味しい料理ができました!")
  }
}

var employer = Employer()
var servant = Servant()

// 主人が家事をする
employer.doWork()

// 使用人が家事をする
employer.Servant = servant
employer.doWork()

解説

今回は家事を行う設計を書いています。 プロトコルでは家事を以下のメソッドを規定しています。

  • startHouseWork()
  • cleanRoom()
  • makeDish()
  • finishHouseWork()

ここで重要なのはメソッドを規定するだけで実際に処理を 委譲するのはどのクラスでも問題ないということです。 今回のケースではServantが委譲先ですが、プロトコルに規定した 関数を実装すれば、どんなクラスでも、どんな実装でも構いません。

Swiftではボタンアクションなどを作成することが多いですが、その際にはデリゲートパターンが効力を発揮します。 例えば、ボタンを押したら音が鳴る、ボタンを押して画面遷移などなど。

参考

Delegateについてのまとめ - エムティーアイ エンジニアブログ

【swift】 配列のメソッド -remove-

最近、swiftを勉強しているので頭の整理のために継続的に書いていきます。

removeAll

公式ドキュメント

公式ドキュメントは こちら

ドキュメントから定義を抜粋すると以下の通りです。

# methodの内容
Removes all elements from the collection.
コレクションから全ての要素を除く

# mutatiting
mutating func removeAll(keepingCapacity keepCapacity: Bool = default)

定義をざっくり解説すると以下の通りです。 - コレクション(配列、辞書、set)から全ての要素を除く - mutatingは自身の値を変更する際に用いられるキーワード - 戻り値は定義なし(当たり前ですが)

sample

var ary = [1, 2, 3] // [Int型]
print(ary) # 型はArray型なので []となる。

解説でも触れましたが、コレクションで使える関数なので辞書型でも使えます

var dict = ["key": 1]
dict.removeAll()
print(dict) // []

remove(at:)

var ary2 = [1, 2, 3] // [Int型]
ary2.remove(at: 1)
print(ary2) // [1, 3]

removeFirst

var ary3 = [1, 2, 3] // [Int型]
ary3.removeFirst()
print(ary3)  //[2, 3]
  • removeFirst(n)
// 最初の要素からn番目の要素を削除
var ary4 = [1, 2, 3] // [Int型]
ary4.removeFirst(2)
print(ary4) // [3]

removeLast

var ary5 = ["first", "second", "last"] // [String型]
ary5.removeLast()
print(ary5) // ["first", "second"]
  • removeLast(n)
// 最後の要素からn番目の要素を削除
var ary6 = ["first", "second", "last"] // [String型]
ary6.removeLast(2)
print(ary6) // ["first"]