Bitcoin source code 2 Transactions - killelder/cryptocurrency GitHub Wiki
前一篇 Bitcoin source code 1 Block Chain
大部分人對於比特幣的了解, 大多都在Block Chain上面
這邊開始應該是一般人比較沒有接觸到的細節
OpCodes
opcode用在標準交易的pubkey scripts
opcode這邊不太懂opcode, 所以先跳過, 之後還要補
Address Conversion
P2PKH和P2SH被拿來用作Bitcoin addresses
參考詳解比特幣地址
地址既不是你的钱包私钥也不是公钥,别人光知道地址是无法动用你的资金的,
不过可以根据公开的区块链信息查阅所有进出这个地址的交易记录
這邊會介紹如何encode和decode這些Hash值
P2PKH (Pay to Public Key Hash) : 以"1"開頭, 用一對私鑰和公鑰控制的錢包
P2SH (Pay to Script Hash) : 以"3"開頭, 用來多重簽名, SegWit以及一些智能合約, 通常都採用"3"型地址
字符首是"5", "K", "L"的不是地址, 是WIF(Wallet Import Format)的私鑰, 不可洩漏
- Get your Hash :
P2PKH : hash a ECDSA(橢圓曲線加密演算法) public key
P2SH : hash a redeem script serialized used in raw transactions
P2PKH是hash一個public key
P2SH是hash一堆交易紀錄
-
把address version byte加到hash前面 :
0x00 ==> P2PKH on main Bitcoin network
0x6F ==> P2PKH on testing Bitcoin network
0x05 ==> P2SH on mainnet
0xC4 ==> P2sh on testnet -
複製一份加入version的hash, 然後做兩次SHA256
-
拿出3的前4 Bytes, 當成是checksum
-
把checksum加在version hash的後面 ==> version, hash, checksum, 然後編碼成base58 string
code_string = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
Base58是用於Bitcoin中使用的一種獨特的編碼方式,
主要用於產生Bitcoin的錢包地址。
相比Base64,Base58不使用數字"0",字母大寫"O",字母大寫"I",和字母小寫"l",以及"+"和"/"符號。
設計Base58主要的目的是:
- 避免混淆。在某些字體下,數字0和字母大寫O,以及字母大寫I和字母小寫l會非常相似。
- 不使用"+"和"/"的原因是非字母或數字的字符串作為帳號較難被接受。
- 沒有標點符號,通常不會被從中間分行。
- 大部分的軟體支持雙擊選擇整個字符串。)
Raw Transaction Format
比特幣的交易是用序列化的byte在節點中交易, 稱作raw format
把TXID和merkle root包裝近一個block, 使得交易成為共識規則的一部分
Bicoin Core 0.9.3所有交易都使用version 1 format
version (4 Bytes) + tx_incount + tx_in + tx_outcount + tx_out + lock_time (4 Bytes)