秘鑰生成和作用
- 私鑰
- 私鑰是一個256位的2進(jìn)制隨機(jī)數(shù)威恼,可以取從0到22??-1之間的任意值
- 私鑰可以根據(jù)不同的編碼標(biāo)準(zhǔn),生成不同編碼的私鑰格式寝并,不同格式之間可以相互轉(zhuǎn)換(Raw箫措、WIF、WIF-compressed)
- 私鑰生成公鑰衬潦,所以根據(jù)私鑰是可以推導(dǎo)出公鑰的斤蔓,但是公鑰不能推出私鑰
- 私鑰用來生成數(shù)字簽名用的
- 公鑰
- 對私鑰進(jìn)行橢圓曲線加密處理,得到的公鑰
- 公鑰在交易的時候:P2PKH的賬戶之間交易别渔,scriptSig里面需要有公鑰信息附迷,用來解鎖output惧互,因為output里面有 pubkHASH
- 公鑰用來不可逆的生成公鑰哈希
- 公鑰哈希值
- 公鑰哈希值=RIMPED160(SHA256(公鑰))
- 為了保護(hù)公鑰哎媚,所以有pubkHash的概念,用在output.scriptPubKey的腳本里面喊儡,作為收款人的地址
- 公鑰哈希值可以根據(jù)不同的編碼方式拨与,生成不同的地址,編碼方式不同艾猜,交易的鎖定腳本和解鎖腳本不同
Address
https://en.bitcoin.it/wiki/Address
- 根據(jù)地址的生成算法不同买喧,有3種類型的地址算法,和對應(yīng)的開頭: 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.
- 比特幣地址是一串由字母和數(shù)字組成的26-35位字符串,看起來有些像亂碼算柳,長短不同時因為前置的0低淡,被省略了
- 比特幣用戶和比特幣地址是一對多的關(guān)系,一個用戶可以生成多個比特幣地址(甚至可以離線生成)瞬项,但是一個比特幣地址只指向一個用戶蔗蹋。
- 不同算法的scriptPubKey不同
P2PKH地址的生成方式
https://www.cnblogs.com/zhaoweiwei/p/address.html
生成方式:
- 計算出pubKeyHash:公鑰哈希值=RIMPED160(SHA256(公鑰))
- 計算出校驗碼:校驗碼=前四字節(jié)(SHA256(SHA256(000+公鑰哈希值))) 如比特幣主網(wǎng)版本號“0x00"
- 最后計算出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),表示要壓入棧頂?shù)腷yte妥衣,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
結(jié)合多重簽名一起使用
scriptSig: ..signatures... <serialized script>
scriptPubKey: OP_HASH160 <scriptHash> OP_EQUAL
表示一共有n個參與方,只要有m個參與方同意了這筆交易蜂筹,則這筆交易就生效了稠鼻,具體的規(guī)則是通過scriptHash里面的腳本內(nèi)容決定的
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
結(jié)合P2SH的新特征
- 多重簽名
多重簽名是一種允許多個公鑰共同簽署一筆比特幣交易的技術(shù)。比如說狂票,使用多重簽名技術(shù)候齿,愛麗絲,鮑勃和查理可以共同監(jiān)管一個比特幣闺属,這樣慌盯,要動用該比特幣,至少需要他們之中的兩個人的同意掂器。
- 比如類似于淘寶亚皂、京東這種中間商平臺介入的平臺, 實現(xiàn)2-3的支付模式
- 防止單方擅用資產(chǎn)国瓮,2-2的模式灭必,只有2方同時同意才可以動用資產(chǎn)
- 延遲交易
新的支付方式允許交易輸出在未來的某個時間點之前不可使用,OP_CHECKLOCKTIMEVERIFY
P2PKH賬戶的交易認(rèn)證
https://en.bitcoin.it/wiki/Transaction
目前比特幣支持兩種類型的交易:Pay-to-PubkeyHash乃摹、Pay-to-Script-Hash
- txid
- Input[] inputs
- Output[] outputs
- Input的構(gòu)成
- preTxid (該筆余額的來源交易hash)
- index(屬于該筆交易的output[]下標(biāo))
- scriptSig (<sig> <pubk>)(用秘鑰生成的簽名信息禁漓,和自己的公鑰信息)
- Output的構(gòu)成
- value
- scriptPubKey (pubkHash)
驗證一筆P2PKH交易的一個輸入是否合法:
- 先遍歷,根據(jù)每個Input的 Previous tx和Index孵睬,找到這筆input的輸出來源為哪筆交易的哪個輸出播歼。
- 并且把input的scriptSig ,pubkey 按照順序入棧
- 首先執(zhí)行OP_DUP掰读,這條指令是把棧頂元素pubkey 復(fù)制一份(scriptSig 秘狞,pubkey,pubkey)
- 緊接著執(zhí)行OP_HASH160蹈集,表示對棧頂進(jìn)行SHA256/RipeMD160烁试,實際就是計算公鑰hash:(scriptSig ,pubkey拢肆,pubkeyHash)
- 然后下一條是直接把數(shù)據(jù)46af3fb4…6829入棧(也就是對應(yīng)output里面的 pubkHash)
- 然后執(zhí)行OP_EQUALVERIFY减响,比較棧頂兩個元素是否相等,如果不相等善榛,整個腳本就執(zhí)行失敗
- 如果成功:最后執(zhí)行OP_CHECKSIG棧頂兩個元素進(jìn)行簽名校驗辩蛋,如果相等,出棧返回成功
總結(jié):先驗證這筆output是不是屬于該用戶移盆,再驗證該用戶的簽名是否有效
參考:
https://blog.csdn.net/jerry81333/article/details/56824166
初級版的比特幣交易
http://www.reibang.com/p/a57795ec562c