Private-Key

使用 ECDSA 簽署數據

  • May 12, 2016

我在這篇文章中閱讀了比特幣背後的數學知識,我似乎無法理解的一件事是如何使用上述算法對“數據”進行簽名。這個“數據”究竟是什麼?是我的比特幣嗎?如果是這樣,比特幣在數據方面究竟是如何表示的?假設我的 Coinbase 錢包中有 5 個比特幣,我想發送給我的朋友。如文章中所述,這將如何轉化為整個“獲取私鑰並用它簽署您的數據”過程?

抱歉,如果這是一個太新手的問題,我是密碼學概念的新手。提前致謝!

今天存在的每個比特幣都作為比特幣區塊鏈上的未使用交易輸出 (UTXO) 存在。即,現有已確認交易的輸出尚未被用作其他交易的輸入。

Coinbase 有一組 UTXO,代表他們持有的比特幣。當你告訴 Coinbase 從你的錢包中向某人支付比特幣時,他們會選擇其中一個或多個 UTXO 進行支付。

然後,他們形成一大塊數據來聲明這些 UTXO,並創建一個新的 UTXO,將比特幣提供給接收者,並將任何更改返還給它們。這是他們用密鑰為他們支付的每個 UTXO 簽名的那部分數據。

確認交易後,收件人的新 UTXO 就是您發送給他們的比特幣。當他們看到 UTXO 出現在區塊鏈上時,他們就知道你付錢給他們了。然後他們可以形成一筆交易,花費該 UTXO 將這些比特幣轉移給其他人。

Acoin由 3 個事物描述。

  • outpoint:txid創建事務中的和輸出索引。明確辨識正在花費的硬幣
  • 數量
  • scriptPubKey

要花費一枚硬幣,您需要創建一個交易,將 outpoint 指定為輸入。您指定一些目的地(稱為輸出)。這scriptPubKey通常要求您提供簽名來驗證支出。

ECDSA 指定取h = H(m) mod n,其中 H(m) 是一種散列算法,並使用此數據通過私鑰計算簽名。你的問題是,什麼是m

m(被簽名的數據)是根據 SIGHASH 標誌序列化的事務,該標誌確定簽名中送出的部分。

  • SIGHASH_ALL 將整個事務作為“數據”送出,因此如果任何數據更改(有人添加輸入或更改目標),簽名將變為無效。
  • SIGHASH_NONE 擷取輸出之外的所有內容(輸出索引調整為零)。只要輸入保持不變,這將確保簽名有效。輸出可以隨意改變。
  • SIGHASH_SINGLE 擷取輸入和輸出。在不使簽名無效的情況下,其他任何內容都可以更改。
  • SIGHASH_ANYONECANPAY 可以應用在其他 sighash 類型之上。只有一個輸入被簽名(你的)和輸出。

SIGHASH 標誌附加到簽名中,允許其他人在簽名時重複執行的過程。

還有一些其他修改: - 輸入腳本設置為零,因為簽名不能自己簽名。-txout.scriptPubKey被添加txin.scriptSig為此 vin (自上次 OP_CODESEPARATOR 以來的部分) - 在最後,hashTypeCode附加(4 字節 sighash 標誌)

有關此過程的更多詳細資訊,請閱讀此頁面和圖片:https ://en.bitcoin.it/wiki/OP_CHECKSIG

隔離見證包括對m派生方式的修改。參見 BIP 143:https ://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki

引用自:https://bitcoin.stackexchange.com/questions/44078