GOでゼロからブロックチェーンを構築する方法


執筆Solomon Esenyi ✏️
ブロックチェーンは、多くの分散アプリケーションと暗号通貨の基礎技術です.彼らはこの世代の最も重要な発見の一つと考えられている.その初期段階にあるにもかかわらず、ブロックチェーンは、多くの産業で既に適用され、開発者、アーティスト、ゲーマー、コンテンツライター、および多くのための新しいジョブの役割と機会を作成しています.
このチュートリアルでは、どのようにBlockchainを行くとゼロから1つを構築することによってあなたを導くことによって動作する方法を教えることを目指しています.あなたがブロックチェーンを聞いたことがあるが、まだ彼らが働く方法について混乱しているならば、この記事はあなたのためです.

なぜGOとのブロックチェーンをビルド?
Go 多くのユニークな機能と機能をブロックチェーンを構築するための良いフィット感を提供します.たとえば、Goは、ほとんどの努力で非常に効率的なパフォーマンスアプリケーションを作成することができます.
Goは並列性と並行性を必要とするアプリケーションを構築するのにも優れています.Goは、ランタイムシステムで自動ガベージコレクションとスタック管理を実装します.
最後に、マシンコードと単一のバイナリにアプリケーションをコンパイルし、複数のOSSとプロセッサアーキテクチャをサポートし、サーバーのインフラストラクチャに簡単に展開します.

必要条件
このチュートリアルに従って理解するには、次の手順を実行します.
  • Working knowledge of Go
  • V 1に進む.Xがマシンにインストール
  • GO開発環境(例:テキストエディタ、IDE )

  • どのようなブロックですか?
    ブロックチェーンは、トランザクションのデジタル記録であり、コンピュータネットワークのノードの間で共有される.ブロックチェーン内の各トランザクションは、ブロックと呼ばれ、暗号技術を持つ別のリンクに.
    あなたがすべてのシステムユーザの間の信頼を維持している間、データの安全性と完全性を確実にする分散システムを構築しようとしているとき、blockchainは役に立ちます.

    何がブロックですか?
    我々は以前のブロックに言及し、あなたは彼らが何であるか疑問に思われるかもしれません.簡単に言えば、ブロックはデータのグループであり、複数のブロックが一緒にブロックを形成するために来る.
    ブロックチェーン内のすべてのブロックには、次のプロパティがあります.
  • ブロックデータ、例えばトランザクションデータを記録するデータ
  • ブロックハッシュ、暗号技術を使用して生成されるブロックのID
  • ブロックの最後のブロックの暗号ハッシュです.これは、チェーンにリンクし、そのセキュリティを向上させるすべてのブロックに記録されて
  • ブロックが作成され、ブロックに追加されたときのタイムスタンプ
  • 現在のブロックのハッシュを引き出す努力の量です.このチュートリアルでは、後で詳しく説明します

  • 始める
    新しいGOプロジェクトを作成し、すべての必要なパッケージをインポートすることによって私たちのブロックチェーンを構築することから始めましょう.ファイル名blockchain.go で以下のコードを保存します.
    package main
    
    import (
            "crypto/sha256"
            "encoding/json"
            "fmt"
            "strconv"
            "strings"
            "time"
    )
    
    次に、ブロックのデータを保持するカスタムブロック型を作成します.次のコードを追加しますblockchain.go ファイル
    type Block struct {
            data         map[string]interface{}
            hash         string
            previousHash string
            timestamp    time.Time
            pow          int
    }
    
    その後、我々はカスタムを作成しますBlockchain ブロックを含む型.次のコードを追加しますblockchain.go ファイル
    type Blockchain struct {
            genesisBlock Block
            chain        []Block
            difficulty   int
    }
    
    The genesisBlock プロパティは、ブロックチェーンに追加された最初のブロックを表します.対照的にdifficulty プロパティは、最小の労務労働者がブロックを管理しなければならないことを定義して、それをブロックチェーンに含めます.

    ブロックのハッシュを計算する
    以前に論じたように、ブロックのハッシュは暗号を使って生成された識別子です.以前のブロックハッシュ、現在のブロックデータ、タイムスタンプ、およびPOWをハッシュ化することによって、私たちのブロックのブロックハッシュを導出しますSHA256 アルゴリズム.
    我々のための方法を作成しましょうBlock この機能を実装する型
    func (b Block) calculateHash() string {
            data, _ := json.Marshal(b.data)
            blockData := b.previousHash + string(data) + b.timestamp.String() + strconv.Itoa(b.pow)
            blockHash := sha256.Sum256([]byte(blockData))
            return fmt.Sprintf("%x", blockHash)
    }
    
    上のコードでは次のようにしました.
  • ブロックのデータをJSON形式に変換します
  • ブロックの前のハッシュ、データ、タイムスタンプ、および仕事の証明(POW)を連結しました
  • SHA 256アルゴリズムで以前の連結をハッシュ化しました
  • ハッシュ16の結果をbase 16で返し、

  • 新しいブロックのマイニング
    新しいブロックをマイニングすることは、望ましい数のゼロから始まるブロックハッシュを生成することを含みます.これは、ブロックの難易度が3の場合、"000" 例えば、"0009a1bfb506…" .
    私たちがその内容からブロックのハッシュを得るので、我々が我々の採掘条件を満たすハッシュを得るまで、現在のブロックのPOW値を変更し続ける必要があります(ゼロ)を開始してください.
    これを実装するには、mine() 方法Block 有効なハッシュを得るまで、POW値を増やして、ブロックハッシュを計算し続けるタイプ.
    次のコードを追加しますblockchain.go ファイル
    func (b *Block) mine(difficulty int) {
            for !strings.HasPrefix(b.hash, strings.Repeat("0", difficulty)) {
                    b.pow++
                    b.hash = b.calculateHash()
            }
    }
    

    生成ブロックの作成
    次に、ブロックの生成ブロックを作成し、新しいインスタンスを返しますBlockchain 種類
    次のコードを追加しますblockchain.go ファイル
    func CreateBlockchain(difficulty int) Blockchain {
            genesisBlock := Block{
                    hash:      "0",
                    timestamp: time.Now(),
            }
            return Blockchain{
                    genesisBlock,
                    []Block{genesisBlock},
                    difficulty,
            }
    }
    
    ここでは、私たちの創世記ブロックのハッシュを"0" . ブロックの最初のブロックであるため、前のハッシュに値はなく、データプロパティは空です.
    次に、新しいインスタンスを作成しましたBlockchain タイプとブロックチェーンの難易度と一緒にジェネシスブロックを格納します.

    ブロックへの新しいブロックの追加
    今私たちのハッシュを計算し、自分自身をブロックするための機能を実装している、どのようにブロックに新しいブロックを含めるようにしましょう.
    次のコードを追加しますblockchain.go ファイル
    func (b *Blockchain) addBlock(from, to string, amount float64) {
            blockData := map[string]interface{}{
                    "from":   from,
                    "to":     to,
                    "amount": amount,
            }
            lastBlock := b.chain[len(b.chain)-1]
            newBlock := Block{
                    data:         blockData,
                    previousHash: lastBlock.hash,
                    timestamp:    time.Now(),
            }
            newBlock.mine(b.difficulty)
            b.chain = append(b.chain, newBlock)
    }
    
    ここでは、我々はaddBlock メソッドBlockchain 次の種類
  • トランザクションの詳細(送信者、受信機、転送量)を収集する
  • トランザクションの詳細を持つ新しいブロックを作成する
  • 前のブロックハッシュ、現在のブロックデータ、および生成されたPOW
  • 新しく作成されたブロックを

  • ブロックの妥当性のチェック
    我々は正常にトランザクションを記録することができますブロックチェーンを作成しており、我々は、我々は、トランザクションが改ざんされていることを知っているので、ブロックチェーンが有効かどうかをチェックする機能が必要です.
    次のコードを追加しますblockchain.go ファイル
    func (b Blockchain) isValid() bool {
            for i := range b.chain[1:] {
                    previousBlock := b.chain[i]
                    currentBlock := b.chain[i+1]
                    if currentBlock.hash != currentBlock.calculateHash() || currentBlock.previousHash != previousBlock.hash {
                            return false
                    }
            }
            return true
    }
    
    ここでは、すべてのブロックのハッシュを再計算し、他のブロックの格納されたハッシュ値と比較し、他のブロックの前ハッシュ値がブロックのハッシュ値に等しいかどうかを調べます.チェックのいずれかが失敗した場合、ブロックチェーンは改ざんされています.

    トランザクションを作成するためのブロックチェーンの使用
    我々は今、完全に機能的なブロックを持っている!を作成しましょうmain() 関数を使用して表示します.
    次のコードを追加しますblockchain.go ファイル
    func main() {
            // create a new blockchain instance with a mining difficulty of 2
            blockchain := CreateBlockchain(2)
    
            // record transactions on the blockchain for Alice, Bob, and John
            blockchain.addBlock("Alice", "Bob", 5)
            blockchain.addBlock("John", "Bob", 2)
    
            // check if the blockchain is valid; expecting true
            fmt.Println(blockchain.isValid())
    }
    

    結論
    このチュートリアルでは、どのブロックがどのようなものであるか、どのようなブロックを含んでいるか、どのようにブロックハッシュを計算するか、どのようにブロックハッシュを計算するか、マイニングブロックのためのコンセンサスアルゴリズムを実装し、ブロックチェーン上のレコードトランザクションを実装し、ブロックチェーンの信頼性を検証します.
    GOブロックのソースコードはGitHub Gist . 効率とパフォーマンスが最優先事項であるアプリケーションのために良い合うものとして、私はあなたがGOで構築する驚くべきものを見るのを待つことができません.
    ハッピーコーディング!

    LogRocket : あなたのウェブアプリへの完全な可視性

    LogRocket フロントエンドアプリケーションを監視するソリューションを再生する場合は、自分のブラウザで起こった問題を再生することができます.代わりに、エラーが発生したり、スクリーンショットやログのダンプのユーザーを求めるのを推測するのではなく、LogRocketすぐに何が間違って理解するためにセッションをリプレイすることができます.これは、フレームワークに関係なく、任意のアプリケーションを完全に動作し、RedUx、Vuex、および@ NGRX/ストアからの追加のコンテキストを記録するプラグインがあります.
    ログのReduxのアクションと状態に加えて、ログログオンレコードコンソールログ、JavaScriptのエラー、StackTrart、ヘッダー/本文、ブラウザのメタデータ、およびカスタムログを使用してネットワークのリクエスト/応答.また、DOMは、最も複雑な単一ページのアプリのピクセル完璧なビデオを再現、ページ上のHTMLとCSSを記録するために楽器を計る.
    Try it for free .