比特幣的加密(秘鑰、地址、腳本驗證)

秘鑰生成和作用

  1. 私鑰
  • 私鑰是一個256位的2進制隨機數,可以取從0到22??-1之間的任意值
  • 私鑰可以根據不同的編碼標準,生成不同編碼的私鑰格式,不同格式之間可以相互轉換(Raw、WIF、WIF-compressed)
  • 私鑰生成公鑰,所以根據私鑰是可以推導出公鑰的,但是公鑰不能推出私鑰
  • 私鑰用來生成數字簽名用的
  1. 公鑰
  • 對私鑰進行橢圓曲線加密處理,得到的公鑰
  • 公鑰在交易的時候:P2PKH的賬戶之間交易,scriptSig里面需要有公鑰信息,用來解鎖output,因為output里面有 pubkHASH
  • 公鑰用來不可逆的生成公鑰哈希
  1. 公鑰哈希值
  • 公鑰哈希值=RIMPED160(SHA256(公鑰))
  • 為了保護公鑰,所以有pubkHash的概念,用在output.scriptPubKey的腳本里面,作為收款人的地址
  • 公鑰哈希值可以根據不同的編碼方式,生成不同的地址,編碼方式不同,交易的鎖定腳本和解鎖腳本不同

Address

https://en.bitcoin.it/wiki/Address

image

  1. 根據地址的生成算法不同,有3種類型的地址算法,和對應的開頭: 1、3、bc1
    There are currently three address formats in use:
  • P2PKH which begin with the number 1, eg: 1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2.
  • P2SH type starting with the number 3, eg: 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy.
  • Bech32 type starting with bc1, eg: bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq.
  1. 比特幣地址是一串由字母和數字組成的26-35位字符串,看起來有些像亂碼,長短不同時因為前置的0,被省略了
  2. 比特幣用戶和比特幣地址是一對多的關系,一個用戶可以生成多個比特幣地址(甚至可以離線生成),但是一個比特幣地址只指向一個用戶。
  3. 不同算法的scriptPubKey不同

P2PKH地址的生成方式

https://www.cnblogs.com/zhaoweiwei/p/address.html
生成方式:

  1. 計算出pubKeyHash:公鑰哈希值=RIMPED160(SHA256(公鑰))
  2. 計算出校驗碼:校驗碼=前四字節(jié)(SHA256(SHA256(000+公鑰哈希值))) 如比特幣主網版本號“0x00"
  3. 最后計算出Address: 比特幣地址=1+Base58(0+公鑰哈希值+校驗碼) //16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM

P2PKH的交易腳本

  • scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
  • scriptSig: <sig> <pubKey>

舉個真實的例子:
ScriptSig:
PUSHDATA(72)[3045022100f8df16671995baaecab5a8d91fc3c78f22c156918cefb90dd1092fcd8578567d022041395667d7e99d131bffcb908904a2417cfb74b46df8bded2517a02beda0279701] PUSHDATA(33)
[021fc349da71680b2482e4c307adbd7aa2fc16d2cd564843ab873a8efff748d87b]

這里面的一個scriptSig由2部分組成,第一部分是簽名,第二部分是公鑰,PUSHDATA(N),表示要壓入棧頂的byte,1個byte表示2個字符,PUSHDATA(72)表示壓入144個字符

Output Scripts
HASH160 PUSHDATA(20)[d3ecd0e0d42d4b617767d9d1b966216c77ebb513] EQUAL
DUP HASH160 PUSHDATA(20)[7c45023433aea27b48251d4c5a52b1d73caba74e] EQUALVERIFY CHECKSIG

第二個找零output地址因為是P2PKH開頭的,所以格式和描述的一樣

Pay-to-Script-Hash

https://www.hibtc.org/2428.html
結合多重簽名一起使用
scriptSig: ..signatures... <serialized script>
scriptPubKey: OP_HASH160 <scriptHash> OP_EQUAL

表示一共有n個參與方,只要有m個參與方同意了這筆交易,則這筆交易就生效了,具體的規(guī)則是通過scriptHash里面的腳本內容決定的
m-of-n multi-signature transaction:
scriptSig: 0 <sig1> ... <script>
script: OP_m <pubKey1> ... OP_n OP_CHECKMULTISIG

ScriptSig:
0[] PUSHDATA(72)[30450221009b37b97eb11341a5fa69d191312df12a41449cf922dbf8e72e93eb6ca7515cb60220759126a28f69525903da3e79e873c59ee7355b6a4874eed06ed6f616712ee51201] PUSHDATA(71)[304402202da30a860b7a2ee3cf614aae2ae8fb5a75de3ea9d5274701ef0ceebc94f75801022063155b788bfb7cada4e8050992b23340d9324306fbd6a201a169ff4a676ea9d701] PUSHDATA1[52210246ccf4de0c54cc7f3354cdd993c2c50cf965fd82238b89659fbd73a1b4bf05a121024fc59f72272a897fe43803374969f396058152fe4765a8d15216f94624257b1b21022593bc69ecbf3bbcc3c58082267cb49dadaf4ca8dbf1b2297338a9d628c4297653ae]

HASH160 PUSHDATA(20)[d3ecd0e0d42d4b617767d9d1b966216c77ebb513] EQUAL

結合P2SH的新特征

  1. 多重簽名
    多重簽名是一種允許多個公鑰共同簽署一筆比特幣交易的技術。比如說,使用多重簽名技術,愛麗絲,鮑勃和查理可以共同監(jiān)管一個比特幣,這樣,要動用該比特幣,至少需要他們之中的兩個人的同意。
  • 比如類似于淘寶、京東這種中間商平臺介入的平臺, 實現2-3的支付模式
  • 防止單方擅用資產,2-2的模式,只有2方同時同意才可以動用資產
  1. 延遲交易
    新的支付方式允許交易輸出在未來的某個時間點之前不可使用,OP_CHECKLOCKTIMEVERIFY

P2PKH賬戶的交易認證

https://en.bitcoin.it/wiki/Transaction
目前比特幣支持兩種類型的交易:Pay-to-PubkeyHash、Pay-to-Script-Hash

  • txid
  • Input[] inputs
  • Output[] outputs
  1. Input的構成
  • preTxid (該筆余額的來源交易hash)
  • index(屬于該筆交易的output[]下標)
  • scriptSig (<sig> <pubk>)(用秘鑰生成的簽名信息,和自己的公鑰信息)
  1. Output的構成
  • value
  • scriptPubKey (pubkHash)

驗證一筆P2PKH交易的一個輸入是否合法:

  1. 先遍歷,根據每個Input的 Previous tx和Index,找到這筆input的輸出來源為哪筆交易的哪個輸出。
  2. 并且把input的scriptSig ,pubkey 按照順序入棧
  3. 首先執(zhí)行OP_DUP,這條指令是把棧頂元素pubkey 復制一份(scriptSig ,pubkey,pubkey)
  4. 緊接著執(zhí)行OP_HASH160,表示對棧頂進行SHA256/RipeMD160,實際就是計算公鑰hash:(scriptSig ,pubkey,pubkeyHash)
  5. 然后下一條是直接把數據46af3fb4…6829入棧(也就是對應output里面的 pubkHash)
  6. 然后執(zhí)行OP_EQUALVERIFY,比較棧頂兩個元素是否相等,如果不相等,整個腳本就執(zhí)行失敗
  7. 如果成功:最后執(zhí)行OP_CHECKSIG棧頂兩個元素進行簽名校驗,如果相等,出棧返回成功

總結:先驗證這筆output是不是屬于該用戶,再驗證該用戶的簽名是否有效

參考:
https://blog.csdn.net/jerry81333/article/details/56824166

初級版的比特幣交易
http://www.itdecent.cn/p/a57795ec562c

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容