ビットコむンの抂芁-暗号化

ビットコむンが匕き続き泚目を集めおいる理由の1぀は、その䟋倖的な「数孊」です。 䞭本Sは、参加者間の信頌がたったくなくおも機胜するシステムを䜜成するこずができたした。 すべおの盞互䜜甚は厳密な数孊に基づいおおり、人的芁因はありたせん。倚くの人が考えるように、それはピアツヌピアネットワヌクではなく、革呜のアむデアでした。 したがっお、私はビットコむンの数孊的基瀎に最初の章を捧げるこずにしたした。

以䞋では、楕円曲線、ECC、秘密/公開キヌなど、最も基本的なこずを説明しようずしたす。 可胜であれば、䞻にPython 2.7で、もし䜕か明確でない堎合は、コメントで質問しおください。

むントロ


本




目次


  1. はじめに
  2. 楕円曲線
  3. デゞタル眲名
  4. 秘密鍵
  5. 公開鍵
  6. フォヌマットず䜏所
  7. サむン
  8. 確認する
  9. 曞匏
  10. リンク集

はじめに


䞊で蚀ったように、暗号化はビットコむンの基本的な郚分です。 それがなければ、䜕も機胜しなかったので、ここから始める必芁がありたす。

ビットコむンは、 楕円曲線のいわゆる暗号化  楕円曲線暗号化、ECC を䜿甚したす。 特別な機胜に基づいおいたす-楕円曲線楕円ず混同しないでください。 この機胜ずは䜕か、そしおなぜそれが非垞に泚目に倀するのかをさらに説明したす。

楕円曲線


フィヌルド䞊の楕円曲線 K 䞊の射圱平面䞊の非特異3次曲線 {\ hat {K}} フィヌルドの代数的閉包 K フィヌルドからの係数を持぀次数3の方皋匏で定矩 K および「無限倧を指す」- りィキペディア

指の堎合、楕円曲線は倖向きにかなり単玔な関数であり、通垞、いわゆるワむ゚ルシュトラス型の圢匏で蚘述されたす。 y ^ {2} = x ^ {3} + ax + b

パラメヌタ倀に応じお a そしお b 、この関数のグラフは異なっお芋える堎合がありたす。

楕円曲線

Pythonでグラフをレンダリングするためのスクリプト

import numpy as np import matplotlib.pyplot as plt def main(): a = -1 b = 1 y, x = np.ogrid[-5:5:100j, -5:5:100j] plt.contour(x.ravel(), y.ravel(), pow(y, 2) - pow(x, 3) - x * a - b, [0]) plt.grid() plt.show() if __name__ == '__main__': main() 

Wikiを信じるなら、初めおこの機胜がディオファントスの著䜜でラむトアップされ、その埌17䞖玀にニュヌトン自身がそれに興味を持぀ようになりたした。 圌の研究は倚くの点で、楕円曲線䞊の点を远加するための公匏を導きたした。 ここず䞋で、楕円曲線を考えたす \アルファ 。

2぀の点がありたす P、Q \ in \ alpha 。 圌らの合蚈はポむントず呌ばれたす R \ in \ alpha 、最も単玔な堎合では、次のように定矩されたす。 P そしお Q -圌女は曲線を暪切る \アルファ 䞀点で圌女に電話したしょう -R 。 倉わる y 点座暙 -R サむンの反察偎に、ポむントを取埗したす R 、これを合蚈ず呌びたす P そしお Q それは P + Q = R 。

ellitic_curve_addiction

私たちはそのような加算操䜜を導入しおいるこずに泚意する必芁があるず思いたす-通垞の意味でポむントを远加する堎合、぀たり察応する座暙を远加する堎合、あなたは完党に異なるポむントを取埗したす R 'x_1 + x_2、y_1 + y_2 、ほずんどの堎合、䜕の関係もありたせん R たたは -R 曲線䞊にはたったくありたせん \アルファ 。

最も賢い人はすでに質問を自問しおいたす-たずえば、フォヌムの座暙を持぀2぀の点を通る盎線が描かれた堎合、どうなりたすか Pa、b そしお Qa、-b 、぀たり、それらを通る線は瞊座暙軞䞋図の3番目のフレヌムず平行になりたす。

elliptic_curve_parallel

この堎合、曲線ず3番目の亀差点がないこずが簡単にわかりたす。 \アルファ 私たちが呌んだ -R 。 この事件を避けるために、通垞無限倧ず呌ばれるいわゆる無限遠点を導入したす O たたは単に 写真のように。 そしお、我々は亀差点がないず蚀いたす P + Q = O 。

特に興味深いのは、ポむントを自分自身に远加したい堎合です2フレヌム、1ポむント Q  この堎合、単に点に接線を匕きたす Q に関しお埗られた亀点を反映したす y 。

さお、手銖を軜くたたくず、ポむントを数倍する操䜜に入るこずができたす \ mathbb {N} 数。 その結果、新しいポむントを獲埗したす K = G * k それは K = G + G + ... + G、\ k 回。 写真ですべおが明らかになるはずです。

楕円曲線の乗算

有限䜓䞊の楕円曲線


ECCは、正確に同じ曲線を䜿甚したすが、有限フィヌルドでのみ考慮されたす {F} _ {p} = \ mathbb {Z} / \ mathbb {Z} _p = \ {0、1、...、p-1 \}、ここでp 玠数です。 それは

y ^ 2 \ mod \ p = x ^ 3 + ax + b \mod \ p


このような関数の名前付きプロパティ加算、乗算、無限遠点はすべお有効なたたですが、この関数を描画しようずするず、おなじみの楕円曲線にしか䌌おいたせんせいぜい。 たた、「ある点での関数に接する」ずいう抂念は、䞀般にすべおの意味を倱いたすが、それは倧䞈倫です。 以䞋は関数の䟋です y ^ 2 = x ^ 3 + 7 のために p = 17 

elliptic_curve_over_17

しかし、 p = 59 、䞀般にほが混oticずしたポむントのセットがありたす。 このグラフの起源を思い出させる唯䞀のものは、軞に぀いおの察称性です X 。

elliptic_curve_59

PS有限䜓䞊の曲線の堎合のように興味がある堎合は、点の座暙を蚈算したす Rx_3、y_3 座暙を知る Px_1、y_1 そしお Qx_2、y_2 -N. Mistryによる「ビットコむン、楕円曲線、およびECDSAの数孊入門」を参照しおください。すべおが詳现に蚘茉されおおり、8幎生レベルの数孊を知っおいるだけで十分です。

PPS私の䟋があなたの探究心を満たさなかった堎合、ここにあらゆる皮類の曲線を描くためのサむトがありたす 、実隓。

SECP256k1


ビットコむンに戻るず、 SECP256k1曲線を䜿甚したす。 圌女の圢は y ^ 2 = x ^ 3 + 7 フィヌルド䞊で衚瀺 F_p どこで p -非垞に倧きな玠数、すなわち 2 ^ {256}-2 ^ {32}-2 ^ {9}-2 ^ {8}-2 ^ {7}-2 ^ {6}-2 ^ {4}-1 。

いわゆるベヌスポむントはSECP256k1にも定矩されおいたす。これはゞェネレヌタポむントでもありたす -それは単なるポむントであり、通垞は G この曲線の䞊に暪たわる。 以䞋で説明する公開鍵を䜜成する必芁がありたす。

簡単な䟋Pythonを䜿甚しお、ポむントが属しおいるかどうかを確認したす Gx、y SECP256k1カヌブ

 >>> p = 115792089237316195423570985008687907853269984665640564039457584007908834671663 >>> x = 55066263022277343669578718895168534326250603453777594175500187360389116729240 >>> y = 32670510020758816978083085130507043184471273380659243275938904335757337482424 >>> (x ** 3 + 7) % p == y**2 % p True 

デゞタル眲名


電子眲名EDS、電子デゞタル眲名EDS-秘密眲名キヌを䜿甚した情報の暗号倉換の結果ずしお取埗され、眲名が生成された瞬間から電子文曞に情報の歪みがないこずを怜蚌できる電子文曞の詳现敎合性、眲名は鍵蚌明曞の所有者に属したす眲名著者、および怜蚌に成功した堎合は、電子文曞ぞの眲名吊認防止の事実を確認したす- りィキペディア

䞀般的な考え方は次のずおりです。アリスは1 BTCをボブに転送したいず考えおいたす。 これを行うために、圌女は次のようなメッセヌゞを䜜成したす。

 { "from" : 1FXySbm7jpJfHEJRjSNPPUqnpRTcSuS8aN, // Alice's address "to" : 1Eqm3z1yu6D4Y1c1LXKqReqo1gvZNrmfvN, // Bob's address "amount" : 1 // Send 1 BTC } 


次に、アリスは圌女の秘密鍵今のずころ、これはアリスだけが知っおいる数字であるず仮定できたす、メッセヌゞハッシュ、および次の圢匏の関数を受け取りたす。 サむン\ _textプラむベヌト\ _key、テキスト 。 出力で、圌女はメッセヌゞの眲名を受け取りたす-ECDSAの堎合、敎数のペアになりたす。他のアルゎリズムでは、眲名は異なっお芋える堎合がありたす。 その埌、圌女はすべおのネットワヌク参加者に初期メッセヌゞ、眲名、および公開鍵を送信したす。

その結果、各Vasyaは、必芁に応じお、この䞉䜍䞀䜓をずるこずができたす。 怜蚌\ _signature公開\ _key、眲名、テキスト 秘密鍵の所有者が実際にこのメッセヌゞに眲名したかどうかを確認したす。 そしお、ネットワヌク内で誰もが知っおいる堎合 公開\ _key アリスが所有しおいるので、圌女がお金を送ったのか、誰かが圌女に代わっおそれをやろうずしおいるのかがわかりたす。

digital_signature_scheme

さらに、アリスずネットワヌクの他の郚分の間に人が立っおいるず仮定したす。 圌にアリスのメッセヌゞを傍受させお、文字通り10億のうち1ビットを倉曎させたす。 しかし、この堎合でも、眲名の怜蚌 怜蚌\ _signature公開\ _key、眲名、テキスト ' メッセヌゞが倉曎されたこずを瀺したす。

ネットワヌクが分散されおいるため、これはビットコむンにずっお非垞に重芁な機胜です。 私たちの取匕が1000 BTCを譲枡する芁求で誰が埗るかを事前に知るこずはできたせん。 ただし、トランザクションはあなたの秘密鍵によっお眲名され、他のネットワヌク参加者はここで䜕かが間違っおいるこずをすぐに理解するため、圌はそれを倉曎できたせんたずえば、受信者ずしお自分のアドレスを瀺したす。

AHTUNG 実際、プロセスは䞊蚘ずはたったく異なりたす。 ここでは、電子デゞタル眲名ずは䜕か、なぜ必芁なのかを指で瀺したした。 実際のアルゎリズムは、 「Bitcoin in a nutshell-Transactions」の章で説明されおいたす。

秘密鍵


秘密鍵はかなり䞀般的な甚語であり、さたざたな皮類の秘密鍵をさたざたな電子眲名アルゎリズムで䜿甚できたす。

お気づきかもしれたせんが、ビットコむンはECDSAアルゎリズムを䜿甚しおいたす-その堎合、秘密キヌは256ビットの自然な数倀、぀たり、 1 前に 2 ^ {256} 。 技術的には、 123456ずいう数字でも有効な秘密キヌになりたすが、攻撃者が秘密キヌを手に入れるたで、コむンはすぐに「所属」し、 123456のような倀は非垞に簡単に芋぀かりたす。

今日では、すべおのキヌを䞊べ替えるこずは䞍可胜であるこずに泚意するこずが重芁です 2 ^ {256} -これは驚くほど倚数です。

私たちはそれを提瀺しようずしたす この蚘事によるず、地球党䜓では少し少ない 10 ^ {22} 砂粒。 ずいう事実を掻甚しおください 2 ^ {10} \箄10 ^ {3} それは 10 ^ {22} \箄2 ^ {80} 砂粒。 そしお、私たちはすべおのアドレスを持っおいたす 2 ^ {256} およそ {2 ^ {80}} ^ 3 。

これは、地球䞊のすべおの砂を取り、すべおの砂粒を新しい地球に、結果ずしお生じる惑星の山で、各惑星䞊のすべおの砂粒を新しい地球に倉えるこずができ、砂粒の総数が䟝然ずしお可胜な秘密鍵の数よりも数桁少ないこずを意味したす。

同じ理由で、秘密鍵を䜜成するずき、ほずんどのビットコむンクラむアントは単に256のランダムビットを取埗したす-衝突の可胜性は非垞に小さいです。

Python



 >>> import random >>> private_key = ''.join(['%x' % random.randrange(16) for x in range(0, 64)]) >>> private_key '9ceb87fc34ec40408fd8ab3fa81a93f7b4ebd40bba7811ebef7cbc80252a9815' >>> # or >>> import os >>> private_key = os.urandom(32).encode('hex') >>> private_key '0a56184c7a383d8bcce0c78e6e7a4b4b161b2f80a126caa48bde823a4625521f' 

Python、 ECDSA



 >>> import binascii >>> import ecdsa # sudo pip install ecdsa >>> private_key = ecdsa.SigningKey.generate(curve=ecdsa.SECP256k1) >>> binascii.hexlify(private_key.to_string()).decode('ascii').upper() u'CE47C04A097522D33B4B003B25DD7E8D7945EA52FA8931FD9AA55B315A39DC62' 

Bitcoin-cli



 $ bitcoin-cli getnewaddress 14RVpC4su4PzSafjCKVWP2YBHv3f6zNf6U $ bitcoin-cli dumpprivkey 14RVpC4su4PzSafjCKVWP2YBHv3f6zNf6U L3SPdkFWMnFyDGyV3vkCjroGi4zfD59Wsc5CHdB1LirjN6s2vii9 

公開鍵


させる k -秘密鍵、 G -基点、次に公開キヌ K = G * k 。 ぀たり、実際には、 公開鍵は曲線SECP256k1䞊にある特定のポむントです。

2぀の重芁なニュアンス。 たず、公開鍵を取埗する操䜜が䞀意に決定されるこず、぀たり、単䞀の秘密鍵が垞に単䞀の公開鍵に察応するこずは容易にわかりたす。 第二に、逆の操䜜は蚈算䞊困難であり、䞀般的な堎合、公開キヌから秘密キヌを取埗するこずは、最初の完党な怜玢によっおのみ可胜です。

以䞋では、公開鍵ずアドレスの間にたったく同じ関係が存圚するこずがわかりたす。党䜓のポむントは、ハッシュ関数が䞍可逆的であるこずです。

keys_to_address

Python、ECDSA



 >>> import binascii >>> import ecdsa >>> private_key = ecdsa.SigningKey.generate(curve=ecdsa.SECP256k1) >>> public_key = private_key.get_verifying_key() >>> binascii.hexlify(public_key.to_string()).decode('ascii').upper() u'D5C08F1BFC9C26A5D18FE9254E7923DEBBD34AFB92AC23ABFC6388D2659446C1F04CCDEBB677EAABFED9294663EE79D71B57CA6A6B76BC47E6F8670FE759D746' 

C ++、 libbitcoin



 #include <bitcoin/bitcoin.hpp> #include <iostream> int main() { // Private key bc::ec_secret secret = bc::decode_hash( "038109007313a5807b2eccc082c8c3fbb988a973cacf1a7df9ce725c31b14776"); // Get public key bc::ec_point public_key = bc::secret_to_public_key(secret); std::cout << "Public key: " << bc::encode_hex(public_key) << std::endl; } 

コンパむルしお実行するには、libbitcoinの事前むンストヌルを䜿甚したす。

 $ g++ -o public_key <filename> $$(pkg-config --cflags --libs libbitcoin) $ ./public_key Public key: 0202a406624211f2abbdc68da3df929f938c3399dd79fac1b51b0e4ad1d26a47aa 

最初ず2番目の䟋の公開キヌの圢匏が異なる少なくずも長さがこずがわかりたす。これに぀いおは、以䞋で詳しく説明したす。

フォヌマットず䜏所


Base58Check゚ンコヌディング


この゚ンコヌディングは本党䜓で絶えず遭遇するため、どのように機胜するのか、なぜ必芁なのかを理解する必芁がありたす。

その本質は、バむトシヌケンスを最も読みやすい圢匏でできるだけ短く曞き留めるず同時に、タむプミスの可胜性をさらに䜎くするこずです。 Bitcoinの堎合、セキュリティは決しお䞍芁ではないこずをご理解いただいおいるず思いたす。 1぀の間違ったキャラクタヌずお金が、おそらく誰も芋぀けられないキヌにアドレスに行きたす。 base58.hからのこの゚ンコヌディングに関するコメントは次のずおりです。
 // Why base-58 instead of standard base-64 encoding? // - Don't want 0OIl characters that look the same in some fonts and // could be used to create visually identical looking account numbers. // - A string with non-alphanumeric characters is not as easily accepted as an account number. // - E-mail usually won't line-break if there's no punctuation to break at. // - Doubleclicking selects the whole number as one word if it's all alphanumeric. 


蚘録の簡朔さは、かなり䞀般的なBase64゚ンコヌドを䜿甚しお実装するのが最も簡単です。぀たり、数字0,1,...,9 、文字azおよびAZが曞き蟌みに䜿甚されるbase 64番号システムを䜿甚したす-これは62文字を䞎え、残りの2぀は実装によっお異なりたす。

Base58Checkの最初の違いは、文字0,O,l,I 、誰かが混同するこずにした堎合に備え0,O,l,I削陀されるこずです。 58文字であるこずがわかりたす。

 b58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' def base58encode(n): result = '' while n > 0: result = b58[n%58] + result n /= 58 return result # print "Base58 encode for '123123':", base58encode(123123) # # Base58 encode for '123123': dbp 

2番目の違いは同じチェックです。 行の最埌に、 チェックサムが再び远加されたすSHA256(SHA256(str))最初の4バむトSHA256(SHA256(str)) 。 たた、base58での゚ンコヌドの前に先行れロがあったのず同じ数のナニットを先頭に远加する必芁がありたす。これはすでに技術的な問題です。

 import hashlib def base58encode(n): b58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' result = '' while n > 0: result = b58[n % 58] + result n /= 58 return result # Will be used to decode raw bytes and then encode them to the base58 def base256decode(s): result = 0 for c in s: result = result * 256 + ord(c) return result def countLeadingZeroes(s): count = 0 for c in s: if c == '\0': count += 1 else: break return count def base58CheckEncode(prefix, payload): s = chr(prefix) + payload checksum = hashlib.sha256(hashlib.sha256(s).digest()).digest()[0:4] result = s + checksum return '1' * countLeadingZeroes(result) + base58encode(base256decode(result)) 



秘密鍵の圢匏


秘密鍵を保存する最も明癜な方法は、256ビットをれロず1の束ずしお曞き蟌むこずです。 しかし、おそらく、技術的に有胜な人なら、同じシヌケンスを32バむトの圢匏で提瀺する方がはるかに簡単であるこずを理解しおいたす。各バむトは16進衚蚘の2文字に察応したす。 この堎合、数字0,1,...,9ず文字A,B,C,D,E,Fいるこずを思い出させおください。 䞊蚘の䟋ではこの圢匏を䜿甚したしたが、矎しさのためにスペヌスで区切られおいる堎合がありたす。

 E9 87 3D 79 C6 D8 7D C0 FB 6A 57 78 63 33 89 F4 45 32 13 30 3D A6 1F 20 BD 67 FC 23 3A A3 32 62 

もう1぀のより高床な圢匏は、 WIF  Wallet Import Format です。 それは非垞に簡単に構築されたす
  1. 0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1Dなどの秘密鍵を取埗したす
  2. プレフィックス0x80付けおBase58Checkに曞き蟌みたす。 それだけです


 private_key = '0a56184c7a383d8bcce0c78e6e7a4b4b161b2f80a126caa48bde823a4625521f' def privateKeyToWif(key_hex): return base58CheckEncode(0x80, key_hex.decode('hex')) # print "Private key in WIF format:", privateKeyToWif(private_key) # # Private key in WIF format: 5HtqcFguVHA22E3bcjJR2p4HHMEGnEXxVL5hnxmPQvRedSQSuT4 

公開鍵圢匏


念のため、公開キヌはSECP256k1行の単なるポむントであるこずを思い出させおください。 これを蚘述する最初で最も䞀般的なバリアントは、XおよびY座暙ごずに32バむトの非圧瞮圢匏です。 混乱を避けるために、プレフィックス0x04ずその65バむトが䜿甚されたす。

 import ecdsa private_key = '0a56184c7a383d8bcce0c78e6e7a4b4b161b2f80a126caa48bde823a4625521f' def privateKeyToPublicKey(s): sk = ecdsa.SigningKey.from_string(s.decode('hex'), curve=ecdsa.SECP256k1) vk = sk.verifying_key return ('\04' + sk.verifying_key.to_string()).encode('hex') uncompressed_public_key = privateKeyToPublicKey(private_key) # print "Uncompressed public key: {}, size: {}".format(uncompressed_public_key, len(uncompressed_public_key) / 2) # # Uncompressed public key: 045fbbe96332b2fc2bcc1b6a267678785401ee3b75674e061ca3616bbb66777b4f946bdd2a6a8ce419eacc5d05718bd718dc8d90c497cee74f5994681af0a1f842, size: 65 

ただし、名前が瀺すように、これは公開鍵を保存する最良の方法ではありたせん。

驚くでしょうが、2番目の圢匏は圧瞮ず呌ばれたす。 その本質は次のずおりです。公開鍵は曲線䞊の点、぀たり匏を満たす数倀のペアです y ^ 2 \ mod \ p = x ^ 2 + ax + b \mod \ p 。 したがっお、X座暙のみを蚘述でき、Y座暙が必芁な堎合は方皋匏を解くだけです。 したがっお、公開キヌのサむズをほが50削枛したす

唯䞀の泚意点は、ポむントが曲線䞊にある堎合、X座暙のこの方皋匏には明らかに2぀の解決策があるこずです疑わしい堎合は䞊のグラフを芋おください。 通垞、Y座暙の笊号を保持したすが、有限䜓䞊の関数に関しおは、次のプロパティを䜿甚する必芁がありたす X座暙の方皋匏の解がある堎合、ポむントの1぀は偶数のY座暙を持ち、2番目のポむントは奇数の座暙 再びあなた自身で芋るこずができたす。

最初のケヌスでは、プレフィックス0x02れ、2番目のケヌスでは0x03 0x02たす。 プロセスの䟋を次に瀺したす。

圧瞮された公開鍵

䜏所


すでに述べたように、アドレスは公開キヌから独自の方法で取埗されたす。 さらに、暗号的に匷力なハッシュ関数-RIPEMD160およびSHA256が䜿甚されおいるため、逆の操䜜を実行するこずはできたせん 。 公開鍵をアドレスに倉換するアルゎリズムは次のずおりです。
  1. 45b0c38fa54766354cf3409d38b873255dfa9ed3407a542ba48eb9cab9dfca67などの秘密鍵を45b0c38fa54766354cf3409d38b873255dfa9ed3407a542ba48eb9cab9dfca67
  2. 非圧瞮圢匏で公開鍵を取埗したす。この堎合は04162ebcd38c90b56fbdb4b0390695afb471c944a6003cb334bbf030a89c42b584f089012beb4842483692bdff9fcab8676fed42c47bffb081001209079bbcb8dbです。
  3. RIPEMD160(SHA256(public_key))を考慮するず、 RIPEMD160(SHA256(public_key))であるこずが5879DB1D96FC29B2A6BDC593E67EDD2C5876F64C
  4. 結果を接頭蟞17JdJpDyu3tB5GD3jwZP784W5KbRdfb84Xたす。 これは䜏所です。


 def pubKeyToAddr(s): ripemd160 = hashlib.new('ripemd160') ripemd160.update(hashlib.sha256(s.decode('hex')).digest()) return base58CheckEncode(0, ripemd160.digest()) def keyToAddr(s): return pubKeyToAddr(privateKeyToPublicKey(s)) # print keyToAddr("45b0c38fa54766354cf3409d38b873255dfa9ed3407a542ba48eb9cab9dfca67") # # '17JdJpDyu3tB5GD3jwZP784W5KbRdfb84X' 

眲名ず怜蚌


ECDSAがメッセヌゞをどのように眲名およびチェックするかに぀いおの技術的な詳现を知る必芁はないず思いたす。ずにかく、どこでも既補のラむブラリを䜿甚したす。 䞻なこずは、なぜこれが必芁なのかに぀いお共通の理解を持っおいるこずですが、ただ興味がある堎合は、 楕円曲線デゞタル眲名のレむマンのガむドをご芧ください。以䞋のプロセス党䜓の矎しい芖芚化があり、自分で詊しおみるこずができたす。

次の章、 Bitcoin in a nutshell-Transactionです。

リンク集


Source: https://habr.com/ru/post/J319868/


All Articles