1. 程式人生 > >一個完整的比特幣交易流程是怎麼樣的?

一個完整的比特幣交易流程是怎麼樣的?

本文解釋了比特幣交易的內容,目的和結果。下面的解釋適用於新手和中級比特幣使用者。

作為加密貨幣使用者,你需要熟悉交易雛形——為了你對這種不斷髮展的創新有信心,以及作為理解新興多簽名交易和合約的基礎,這兩者都將在本系列的後期進行探討。這不是純技術文章,解釋將集中在你需要了解的標準比特幣交易——我們通常做的支出交易——並且我們將掩蓋你可以安全忽略的內容。

本文底部的資訊圖提供了從錢包到區塊鏈的整個比特幣交易流程的全面說明。

注意:即使是核心開發人員也承認,用於描述交易及其元件的某些語言可能導致人們誤解了實際發生的事情。在下面的解釋中避免了這些誤解。因此,在嘗試儘可能簡單的描述的同時,藉助一些圖表,讓我們直接開始。

術語和縮寫的定義

  • Bitcoin:具有大寫B的比特幣指的是協議——程式碼,節點,網路及其對等互動。
  • bitcoin:用小寫字母b表示貨幣——我們通過比特幣網路傳送和接收的加密貨幣。
  • tx:在文字中使用的任何地方——是比特幣交易‘Bitcoin transaction的縮寫。
  • txid:是transaction id的縮寫——這是人和協議引用交易的雜湊。
  • Script:是比特幣協議的腳本系統的名稱,用於處理和驗證交易——指令碼是一個聰明的,基於堆疊的指令引擎,它使得從簡單支付到複雜的oracle監督合約的所有交易成為可能。
  • UTXO:Unspent Transaction Output
    的縮寫,也稱為“輸出”。
  • satoshi:1 BTC = 100,000,000 satoshi

什麼是比特幣交易?為什麼?

1.定義

比特幣交易是一個經過簽名的資料,它被廣播到網路上,如果有效,最終會進入區塊鏈的一個區塊。

2.目的

比特幣交易的目的是將一定數量的比特幣的所有權轉移到比特幣地址。

3.結果

當你傳送比特幣時,你的錢包客戶端會建立一個單一的資料結構,即比特幣交易,然後廣播到網路。網路上的比特幣節點將中繼和重新廣播交易,如果交易有效,節點將把它包含在他們正在挖掘的塊中。通常,在10-20分鐘內,交易將與區塊鏈中的一個區塊中的其他交易一起被包括在內。此時接收者能夠看到他們錢包中的交易金額。

4.例子

以下是今年早些時候區塊鏈中包含的示例交易:

11831773-410664a3c4a0e27b.png

image

此標準交易的主要組成部分採用顏色編碼:

  • 交易ID(以黃色突出顯示)
  • 描述符和元資料(藍色花括號在右邊詳細說明)
  • 輸入(粉色區域)
  • 輸出(綠色區域)

比特幣交易輸入和輸出

首先,關於交易的四個公理:

  • 我們傳送的任何比特幣金額總是傳送到一個地址。
  • 我們收到的任何比特幣金額都被鎖定在接收地址——這通常與我們的錢包相關聯。
  • 每當我們花費比特幣時,我們花費的金額將始終來自之前收到的並且目前存在於我們錢包中的資金。
  • 地址接收比特幣,但他們不傳送比特幣——比特幣是從錢包傳送的。

進入我們錢包的金額並不像實體錢包中的硬幣那樣混亂。收到的金額不會混合,但保持獨立且與錢包收到的確切金額不同。這是一個例子:

示例:

你建立一個全新的錢包,並及時收到三個0.01,0.2和3BTC的金額,如下所示:你將3BTC傳送到與錢包相關聯的地址,並由Alice向另一個地址付款。

11831773-30014950535a3e22.png

image

錢包報告的餘額為3.21BTC,但如果你真的看錢包裡面,你會看到——不是321,000,000 satoshi(321 mil satoshi),但是三個不同的數量仍然由他們的原始交易組合在一起:0.01,0.2和3BTC。

11831773-f5304ef088bb1585.png

image

收到的比特幣金額不會混合,但保持分開,作為傳送到錢包的確切金額。上例中的三個金額稱為其原始交易的輸出。

比特幣錢包始終保持輸出分離和獨特。

輸出output是(通過標準交易)傳送到比特幣地址的金額,以及解鎖輸出金額的一組規則。在比特幣用語中,輸出稱為“未使用的交易輸出”或UTXO

可以使用與接收地址相關聯的私鑰解鎖標準交易輸出。地址及其相關的公鑰/私鑰對將在本系列的後面部分介紹。目前,我們只關注總數。

示例:

讓我們考慮一個例子,在你向Bob傳送0.15BTC的情況下跟蹤錢。

正如我們所看到的,你的錢包沒有選擇15mil miloshi(0.15 BTC)來自一個無差別的321 mil satoshi組成錢包餘額。相反,錢包從錢包中包含的三個現有輸出outputs中選擇一個支出候選者。因此,它選擇(由於各種原因,現在不重要)0.2BTC輸出。錢包將解鎖0.2 BTC輸出並使用全部0.2BTC作為新的0.15 BTC交易的輸入input。0.2BTC輸出在此過程中花費spent

11831773-c4b4473c4584adec.png

image

你的錢包建立的花費交易將向Bob的地址傳送0.15BTC——它將作為輸出存放在他的錢包中——等待最終花費。

0.05BTC差額(0.2 BTC輸入減去0.15 BTC輸出)稱為改變change,交易將通過新建立的地址將其傳送回你的錢包。0.05 BTC改變的金額將作為新輸出存放在你的錢包中——等待最終花費。所以,現在你錢包裡會顯示以下內容:

11831773-bea952d3b16b021e.png

image

“等待花費”的三個輸出中的每一個被鎖定到其接收地址,直到選擇它們中的一個或多個作為新花費交易的輸入為止。

在後臺,當選擇UTXO作為新交易的輸入時,不同的錢包客戶端應用不同的邏輯規則。一個理智的錢包策略是儘可能先使用舊的UTXO,但實現方式不同。我們現在並不關注選擇UTXO的方式,因為我們的目標一直是強調我們的錢包收到的金額是分開的和不同的。

比特幣交易如何完成的總結

各種收到的金額不會像在實體錢包中那樣混合。相反,在我們花費比特幣時,收到的金額(UTXO)被單獨使用(或組合使用)。在建立支出交易時,我們的錢包選擇UTXO(具有足夠的價值以滿足我們想要傳送的金額)並且通常建立兩個新輸出:一個用於接收器,一個用於我們收到的更改到錢包。更改成為我們錢包中的全新UTXO,我們傳送的金額成為鎖定到收件人地址的UTXO——可能與錢包相關聯,也可能不與錢包相關聯,例如冷儲存。用作支出交易的輸入的原始UTXO將“花費”並永久銷燬。

這是錢包軟體如何處理輸出(UTXO)的介紹。一旦選擇了UTXO用於支出,它就需要與接收它的地址相關聯的私鑰。此私鑰兌換UTXO並允許它成為新支出交易中的輸入。以前的交易輸出被重新用作新交易的輸入的機制是比特幣協議功能的核心——完全符合Satoshi的設計。

建議你瀏覽我們匯智網的各種程式語言的區塊鏈教程和區塊鏈技術部落格,深入瞭解區塊鏈,比特幣,加密貨幣,以太坊,和智慧合約。

  • java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
  • php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
  • php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
  • java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
  • 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
  • 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
  • C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
  • EOS入門教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。

匯智網原創翻譯,轉載請標明出處。這裡是原文