ブロックチェーンとビットコインの原則

1.ビットコインとは何ですか?

ビットコインは電子通貨(デジタル通貨)であり、ビットコインは暗号化に基づく通貨です。2008年11月1日、中本聡(人間なのかAIなのか、組織なのか個人なのかわからない)がビットコインのコンセプトを提案しました。彼はビットコインに関する論文を発表しました。これは現在ビットコインの「ホワイトペーパー」です。中本聡の元のビットコインペーパーpdfへのリンク:ビットコイン
は記事で分散型電子会計システムを提案しています。銀行は国の信用の背後にあるため、従来の電子現金は口座を保持する銀行です、分散型電子会計システムは参加者。人々はマイニングを通じてビットコイン取得し、公会計を通じて完全な支払いを行います。

2.ブロックチェーンの原理

(1)ハッシュ木

ハッシュツリーまたはマーケルツリーは、各リーフノードがデータブロックのパスワードハッシュでマークされ、各非リーフノードがその子ノードラベルのパスワードハッシュでマークされているツリーです。ハッシュツリーを使用すると、大規模なデータ構造の内容を効果的かつ安全に検証できます。ハッシュツリーは、ハッシュリストとハッシュチェーンを一般化したものです。リーフノードが特定のバイナリハッシュツリーの一部であることを証明するには、ツリーのリーフノードの数の対数に比例するハッシュの数を計算する必要があります。これはハッシュリストの反対です。 、ハッシュリストの数はリーフノード自体と同じです。数に正比例します。
マークルツリー
これは、バイナリハッシュツリーの例です。ハッシュ0-0と0-1は、それぞれデータブロックL1とL2のハッシュ値であり、ハッシュ0はハッシュ0-0と0-1の連結です。

(2)。ブロックとブロックチェーン

ブロックチェーンの多くであっブロック、これらのブロックは、リンク暗号化され、各ブロックはブロックヘッダおよびトランザクション情報(通常含まメルケルツリーハッシュ・シーケンスのヘッダ情報に含まれる表現)、タイムスタンプ。設計によれば、ブロックチェーンはそのデータの変更に抵抗することができます。これは、一度記録されると、後続のすべてのブロックを変更せずに、特定のブロックのデータを遡及的に変更できないためです。
ビットコインブロックチェーン構造
論理的に言えば、ブロックチェーンは5つのレイヤーで構成されていると見なすことができます:
1。インフラストラクチャ(ハードウェア)
2。ネットワーク(ノードの検出、情報の配布と検証)
3。コンセンサス(作業の証明、株式保有証明書)
4。データ(ブロック、トランザクション)
5。
特定のブロックのデータは後続のすべてのブロックを変更する必要がないため、アプリケーション(dApps)を遡及的に変更することはできません。これに応えて
ブロックチェーン
、ブロックチェーンの形成。メインチェーン(黒)は、創設ブロック(緑)から現在のブロックまでの最長の一連のブロックで構成されています。メインチェーンの外側に孤立したブロック(紫)があります。

参加者が独立して比較的安価にトランザクションを検証およびレビューできるようにします。ピアツーピアネットワークと分散タイムスタンプサーバーを使用して、ブロックチェーンデータベースを自律的に管理します。彼らは、大規模なコラボレーションを通じて集合的な自己利益をもたらすことを証明します。このような設計は、データセキュリティに関する参加者の不確実性が無視できる堅牢なワークフローを促進します。ブロックチェーンを使用すると、デジタル資産の無限の再現性が排除されます。各価値単位が1回だけ転送されることを確認し、長年の二重支払いの問題を解決しました。ブロックチェーンは、価値交換プロトコルとして説明されています。ブロックチェーンは、交換契約の詳細を示すように適切に設定されている場合、必須のオファーと受け入れの記録を提供できるため、所有権を維持できます。

簡単な例:ABCDの4人の間でトランザクションが開始されました。その中で、Aは100ビットコインをBに転送しました。これは分散型の会計方法だからです。したがって、これら4人のそれぞれが、このトランザクションを自分の元帳に記録し、AからBへの100ビットコインの転送を記録します。これは、ブロックに記録されるトランザクション情報です。各ブロックのサイズは1MBで、約4k個の情報を格納できます。このブロックでは、なぜ他の人に通知するための標準としてAを使用するのですか?通常の取引では誰を使用しますか?そして、なぜ私たちはアカウントを保持する必要がありますか?それは私たちにとって良いことですか?これらはすべて、設計で発生する問題です。
例

3.アカウンティングにブロックチェーンを使用する理由

メリットはないと言われている中本聡は、ブロックチェーンの設計に関する論文でインセンティブ制度について言及しました。本をお持ちの方には、手数料のご褒美と、パッケージブロックのご褒美(システムからのご褒美)の2種類の特典があります。各トランザクションの開始により、ユーザーに小額の料金が請求され、これらの料金はパッケージを予約したユーザーに支払われます。2番目の報酬では、システムはパッケージを予約した人に報酬を与えます。ブロックを生成するためにこのシステムを10分ごとに書いた中本の論文では、すべてのブロックが一定量の報酬ビットコインを生成します。2008年以来、それは50ビットコインであり、4年ごとに半分に減少します。類推すると、得られるビットコインの数は減少します。このアルゴリズム基づいて、世界には約2,100万のビットコインがあると計算できるため、ビットコインのマイニングは時間の経過とともにますます困難になります

4.各ブロックのいわゆる「センター」は誰ですか

(1)ワークロードプルーフメカニズムを介してパックするパワーを取得します

中本聡氏はまた、各ユーザーまたはノードがプルーフオブワークメカニズムを通じて簿記の力を競うと彼の論文に書いています。ブロックごとに計算できる最初のユーザーは、次のブロックのプロデューサーです。プルーフオブワークを通じてユーザーを選択する唯一の方法は、ユーザーに「数学」の問題を解決させることです。この数学的問題はSHA256アルゴリズムに基づいているため、1つずつ試すしかありません。この質問の答えを最初に得た人は誰でもパッケージングの対象になります。これはいわゆるマイニングとも呼ばれます。

(2).SHA256アルゴリズム

Secure Hash(SHA)アルゴリズムは、米国国立標準技術研究所によって米国連邦情報処理標準として発行された一連の暗号化ハッシュ関数です。SHAはSecure HashAlgorithmの略です。SHA-1とSHA-2は、このアルゴリズムの2つの異なるバージョンです。これらは、構造(結果のハッシュが元のデータから作成される方法)と署名のビット長が異なります。SHA-2は、全体的な改善であるため、SHA-1の後継と見なされます。まず第一に、人々は位置の長さを重要な違いと見なします。SHA-1は160ビットのハッシュです。SHA-2は実際には「ハッシュ」シリーズであり、さまざまな長さがあります。最も一般的なのは256ビット(SHA256)で、最終的な出力は256ビットの2進数です。以下は、SHA256アルゴリズムの擬似コードです。

Initialize hash values:
(first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19):
h0 := 0x6a09e667
h1 := 0xbb67ae85
h2 := 0x3c6ef372
h3 := 0xa54ff53a
h4 := 0x510e527f
h5 := 0x9b05688c
h6 := 0x1f83d9ab
h7 := 0x5be0cd19

Initialize array of round constants:
(first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311):
k[0..63] :=
   0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
   0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
   0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
   0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
   0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
   0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
   0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
   0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2

Pre-processing (Padding):
begin with the original message of length L bits
append a single '1' bit
append K '0' bits, where K is the minimum number >= 0 such that L + 1 + K + 64 is a multiple of 512
append L as a 64-bit big-endian integer, making the total post-processed length a multiple of 512 bits
such that the bits in the message are L 1 00..<K 0's>..00 <L as 64 bit integer> = k*512 total bits

Process the message in successive 512-bit chunks:
break message into 512-bit chunks
for each chunk
    create a 64-entry message schedule array w[0..63] of 32-bit words
    (The initial values in w[0..63] don't matter, so many implementations zero them here)
    copy chunk into first 16 words w[0..15] of the message schedule array

    Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array:
    for i from 16 to 63
        s0 := (w[i-15] rightrotate  7) xor (w[i-15] rightrotate 18) xor (w[i-15] rightshift  3)
        s1 := (w[i- 2] rightrotate 17) xor (w[i- 2] rightrotate 19) xor (w[i- 2] rightshift 10)
        w[i] := w[i-16] + s0 + w[i-7] + s1

    Initialize working variables to current hash value:
    a := h0
    b := h1
    c := h2
    d := h3
    e := h4
    f := h5
    g := h6
    h := h7

    Compression function main loop:
    for i from 0 to 63
        S1 := (e rightrotate 6) xor (e rightrotate 11) xor (e rightrotate 25)
        ch := (e and f) xor ((not e) and g)
        temp1 := h + S1 + ch + k[i] + w[i]
        S0 := (a rightrotate 2) xor (a rightrotate 13) xor (a rightrotate 22)
        maj := (a and b) xor (a and c) xor (b and c)
        temp2 := S0 + maj
 
        h := g
        g := f
        f := e
        e := d + temp1
        d := c
        c := b
        b := a
        a := temp1 + temp2

    Add the compressed chunk to the current hash value:
    h0 := h0 + a
    h1 := h1 + b
    h2 := h2 + c
    h3 := h3 + d
    h4 := h4 + e
    h5 := h5 + f
    h6 := h6 + g
    h7 := h7 + h

Produce the final hash value (big-endian):
digest := hash := h0 append h1 append h2 append h3 append h4 append h5 append h6 append h7

(3)C ++言語で形成されたSHA256コアアルゴリズムコード

#pragma once
 
#ifndef SHA256_H
#define SHA256_H
#include <string>
 
class SHA256
{
    
    
protected:
	typedef unsigned char uint8;
	typedef unsigned int uint32;
	typedef unsigned long long uint64;
 
	const static uint32 sha256_k[];
	static const unsigned int SHA224_256_BLOCK_SIZE = (512 / 8);
public:
	void init();
	void update(const unsigned char* message, unsigned int len);
	void final(unsigned char* digest);
	static const unsigned int DIGEST_SIZE = (256 / 8);
 
protected:
	void transform(const unsigned char* message, unsigned int block_nb);
	unsigned int m_tot_len;
	unsigned int m_len;
	unsigned char m_block[2 * SHA224_256_BLOCK_SIZE];
	uint32 m_h[8];
};
 
std::string sha256(std::string input);
 
#define SHA2_SHFR(x, n)    (x >> n)
#define SHA2_ROTR(x, n)   ((x >> n) | (x << ((sizeof(x) << 3) - n)))
#define SHA2_ROTL(x, n)   ((x << n) | (x >> ((sizeof(x) << 3) - n)))
#define SHA2_CH(x, y, z)  ((x & y) ^ (~x & z))
#define SHA2_MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
#define SHA256_F1(x) (SHA2_ROTR(x,  2) ^ SHA2_ROTR(x, 13) ^ SHA2_ROTR(x, 22))
#define SHA256_F2(x) (SHA2_ROTR(x,  6) ^ SHA2_ROTR(x, 11) ^ SHA2_ROTR(x, 25))
#define SHA256_F3(x) (SHA2_ROTR(x,  7) ^ SHA2_ROTR(x, 18) ^ SHA2_SHFR(x,  3))
#define SHA256_F4(x) (SHA2_ROTR(x, 17) ^ SHA2_ROTR(x, 19) ^ SHA2_SHFR(x, 10))
#define SHA2_UNPACK32(x, str)                 \
{                                             \
    *((str) + 3) = (uint8) ((x)      );       \
    *((str) + 2) = (uint8) ((x) >>  8);       \
    *((str) + 1) = (uint8) ((x) >> 16);       \
    *((str) + 0) = (uint8) ((x) >> 24);       \
}
#define SHA2_PACK32(str, x)                   \
{                                             \
    *(x) =   ((uint32) *((str) + 3)      )    \
           | ((uint32) *((str) + 2) <<  8)    \
           | ((uint32) *((str) + 1) << 16)    \
           | ((uint32) *((str) + 0) << 24);   \
}
#endif

5.ブロックチェーンとビットコインのセキュリティ

ブロックチェーンとビットコインは安全ですか?偽造、改ざん、二重支払いをどのように防止しますか?身元認証技術は、人生における顔認識、署名、指紋などである可能性があります。しかし、デジタル化されると、コピーして偽造できるため、ビットコインは電子署名方式を使用します。電子署名技術は主に非対称暗号化を使用しますまず、ビットコインは乱数を生成します。このテクノロジーは、乱数を介して秘密鍵(ユーザーのみが知っている)を生成し、秘密鍵で暗号化してから、秘密鍵を介して公開鍵(公開を生成します。公開鍵で復号化できます。公開アドレスが生成され、ユーザーはそのアドレスを介して匿名トランザクションを実行できます典型的なアルゴリズムはRSAであり、ビットコインは楕円曲線暗号化アルゴリズムを使用します。

変換プロセス

1、首先使用随机数发生器生成一个私钥,它是一个256位的二进制数。私钥是不能公开的,相当于银行卡的密码。

2、私钥经过SECP256K1算法生成公钥,SECP256K1是一种椭圆曲线加密算法,功能和RSA算法类似,通过一个已知的私钥,生成一个公钥,但是通过公钥不能反推出私钥。

3、同SHA256算法一样,RIPEMD160也是一种HASH算法,由公钥可以得到公钥的哈希值,而通过哈希值无法推出公钥。

4、将一个字节的版本号连接到公钥哈希头部,然后对其进行两次SHA256运算,将结果的前4字节作为公钥哈希的校验值,连接在其尾部。

5、将上一步的结果使用BASE58进行编码,就得到了钱包地址(相当于银行账户)。比如A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa

(1)偽造された取引記録を解決する

認証を比較する
この図は、AがB1ビットコインを提供するイベントを示しています。ハッシュ操作でダイジェストを取得した後、ダイジェストを秘密鍵で暗号化してパスワードを取得します。秘密鍵の一意性により、ダイジェストは一意です。ブロードキャストを通じて、Aによって配信されるメッセージは次のとおりです。AはB 1ビットコインに転送し、Aの公開鍵、およびAのパスワード。
もちろん、Aが1ビットコインをBに転送したというメッセージは誤りであり、ダイジェスト1はこのハッシュ操作に基づいて取得されたと見なすことができます。そして、Aの公開鍵を使用してパスワードを復号化してダイジェスト2を取得します。現時点では、ダイジェスト1とダイジェスト2は異なります。明らかに、「AはBに1ビットコインを与えます」は偽造されたメッセージです。

(2)トランザクションレコードの改ざんを防止します

改ざんイベントの発生を防ぐために、ブロックチェーンは最長のチェーン原則に従ってブロックチェーン全体保護します。

ブロックチェーンが分岐した場合、つまり、ほぼ同時に複数の人が次のブロックを掘り起こし、チェーンの方向が分岐した場合、一般的には最長のチェーン原理が選択に使用されます。ユーザーグループAがマイニングを続行するためにチェーンに参加することを選択し、ユーザーグループBがマイニングを続行するためにチェーンから外れることを選択したとします。グループAが最初に次の鉱山を掘り起こし、チェーンに新しいブロックを追加した場合、グループBは新しいブロックに移動した後もマイニングを続行します。通常、ダウンチェーンは破棄されます。

つまり、ブロックチェーンにブランチがある場合、最初に2番目のブロックを掘り出し(チェーンが最初に長いブランチになる)、長いチェーンを保持し、短いチェーンを放棄する上位チェーンと下位チェーンを比較します。
したがって、最長のチェーンの原則に従うことができます。誰かがブロックチェーン上のブロックの情報を改ざんしたい場合は、そのブロックでブランチをリードし、新しいチェーンを作成して、新しいチェーンが元のチェーンの長さを超えるようにする必要があります。 。つまり、彼だけが制御するマイニングマシンの計算能力は世界の他のマイニングマシンの計算能力を上回ってます(他の誰よりも速い)。この実現の可能性は非常に小さいです。たとえば、ある人が世界のマイニングマシンの90%を制御して、チェーンのトランザクションレコードを改ざんしているのに、真剣にマイニングするためにこれほど多くのマイニングマシンを使用しないのはなぜですか。

(3)二重支払い取引を防ぐ

たとえば、二重支払いイベントが発生した場合、Aには100ビットコインしかありませんが、同時にメッセージ「AからB 100ビットコイン」(メッセージbとして記録)と「AからC
100ビットコイン」(メッセージcとして記録)をブロードキャストします。 )、グループDは最初にメッセージbを受信し、メッセージcを確認しません。同様に、グループEが最初にメッセージcを受信した場合、メッセージbは確認されません。現時点では、グループDとEのどちらが最初に数学の問題を計算できるかによって異なります。最初に地雷を掘った人は新しいブロックに確認済みのメッセージを書き込むことができ、もう一方のメッセージは無効です。

二重支払い
著作権表示
この記事は、以下の参照コンテンツを除いてJ0hn元のコンテンツあり、最終的な解釈権は元の作成者に帰属します。侵害がある場合は、連絡して削除してください。私の許可なしに、それを個人的に転載しないでください!

6.参考資料

[1]。BMoney http://www.weidai.com/bmoney.txt[2
]。ウィキペディアhttps://en.wikipedia.org/wiki/Bitcoin[3
]。ウィキペディアhttps://en.wikipedia.org/wiki/SHA-2[4
]。ウィキペディアhttps://en.wikipedia.org/wiki/Blockchain[5
]。Youtube https://www.youtube.com/watch?v=g_fSistU3MQ&t=11s[6
]。BitcoinOrg https://bitcoin.org/bitcoin.pdf

おすすめ

転載: blog.csdn.net/sjhjohn/article/details/114994837