天天看點

JavaScript編寫自己的比特币交易代碼

今天我們将編寫第一個比特币交易代碼。為了實作這一目标,我們将使用名為bitcore的JavaScript庫。JavaScript是最流行的現代程式設計語言,幾乎每個開發人員都知道它,是以它使這篇文章具有普遍性并且對更廣泛的閱聽人有用。

在繼續閱讀本文之前,你應該至少掌握有關比特币區塊鍊如何工作的基本技術知識。如果沒有,請花幾分鐘時間閱讀區塊鍊簡介。如果你有更多的時間,比如幾個小時,我建議你閱讀掌握比特币。

讓我們從一個具有以下依賴關系的新NPM項目開始:

[...]
"dependencies": {
    "bitcore-explorers": "^1.0.1",
    "bitcore-lib": "^0.13.19"
}
[...]
           

打開

index.js

檔案并導入

bitcore

庫:

var bitcore = require("bitcore-lib");
           

要花費比特币我們需要一個包含比特币的位址和一個允許我們花錢的私鑰。我們将導入

WIF

版本的私鑰。

WIF

Wallet Import Format

的縮寫。它可以在比特币錢包之間輕松導入密鑰。 然後我們将從該私鑰建立一個testnet位址:

var privateKeyWIF = 'cQN511BWtc2dSUMWySmZpr6ShY1un4WK42JegGwkSFX5a8n9GWr3';
var privateKey = bitcore.PrivateKey.fromWIF(privateKeyWIF);
var sourceAddress = privateKey.toAddress(bitcore.Networks.testnet);
           

**警告!**在那個例子中,我與你分享我的私鑰。你不應該在現實生活中這樣做。擁有私鑰的人是配置設定給該密鑰的位址的比特币的所有者。這是所有權的标志。

在這種情況下,我隻是與你分享了用于建立testnet位址的密鑰。Testnet是一個為軟體和腳本測試而建立的比特币網絡。它不包含真正的比特币,隻包含測試的比特币。 你可以免費獲得它們。即使有人偷了他們也沒什麼大不了的。我可以冒這個風險為你提供開箱即用的示例。

如果有人使用/偷走了這個位址的所有測試比特币,你可以給它接着充。複制位址

mibK5jk9eP7EkLH175RSPGTLR27zphvvxa

并将其粘貼到表單中。

是時候建立我們想要發送測試比特币的targetAddress了。

var targetAddress = (new bitcore.PrivateKey).toAddress(bitcore.Networks.testnet);
           

如果有任何比特币,請檢查我們的源位址。比特币網絡使用

UTXO

來存儲該資訊。

UTXO

Unspent Transaction Output

的縮寫。

我們有一個問題,我們沒有比特币網絡用戶端。整個節點需要至少125 GB的硬碟空間,這對我可憐的MacBook Air來說太多了。我們必須找到一種解決方法。我們不得不請某人為我們讀比特币網絡。并廣播我們的交易。

在這種情況下,我們正在失去比特币區塊鍊的最大優勢。系統的架構使我們不必信任任何一方。網絡共識,數學和加密使得區塊鍊中存儲的資料可信。但現在我們要求中間人為我們讀取這些資料。他可能會向我們提供虛假或過時的資料。

我們将使用來自

bitcore-explorers

庫的

Insight

。由于它非常受歡迎,我們隻是在這裡學習,我們可以假設它可以信任。最終的解決方案應該是擁有自己的比特币全節點。

好吧,讓我們使用

Insight

來檢查我們要花多少比特币。

var Insight = require("bitcore-explorers").Insight;
var insight = new Insight("testnet");

insight.getUnspentUtxos(sourceAddress, function(error, utxos) {
  if (error) {
    console.log(error);
  } else {
    console.log(utxos);
    // transaction code goes here
}
           

UTXOs

的輸出是一個數組。它的每個元素都包含有關作為

UTXO

所有者的位址和

Satoshis

(1 Satoshi = 0.00000001比特币)的資訊。它看起來像這樣:

[ <UnspentOutput: dbe9ce2ae27d7ffcba40195e7ee628e9165568115931386b27b0c0674fa019c5:1, satoshis: 5047177248, address: mibK5jk9eP7EkLH175RSPGTLR27zphvvxa> ]
           

是時候建立我們的交易了:

var tx = new bitcore.Transaction();
           

讓我們将收到的

UTXOs

設定為交易的

input

。需要注意的一件重要事情是:我們不是從

address

而是從

UTXOs

獲得比特币。

tx.from(utxos);
           

讓我們設定我們想要傳遞給他的交易和金額的接收者。數量以

Satoshis

給出,這是比特币的最小機關:

1 Satoshi = 0.00000001比特币

。這是我們交易的

output

tx.to(targetAddress, 10000);
           

是時候讨論值的

the change

UTXOs

是指向我們位址但尚未用完的交易的輸出。

UTXOs

就像一張鈔票。如果你的口袋裡有5美元的鈔票并且想購買2美元的啤酒,你就不會削減一部分賬單并将其交給收銀員。你給5美元的鈔票并收到3美元的改變。它與

UTXOs

完全相同。你必須在交易中使用整個

UTXO

并指定

change

值和

address

,然後應傳回

change

WTF?我是否必須指定

change

值?在商店裡,當我以5美元的價格購買2美元的啤酒時,我收到3美元的回報。這很明顯。無需計算。

在比特币中,存在一點差異。實際上,

change

隻是交易的另一個輸出。

outputs

的總和應該比

input

的總和小一點。差異稱為

mining fee

。你将其支付給礦工以包含在交易區塊中。像

bitcore.io

這樣的錢包或庫估算了我們的

mining fee

。是以在我們的例子中,我們應該傳回

change

到指定

address

tx.change(sourceAddress);
           

你可以注意到我們使用了

sourceAddress

。結果,該位址的一些現有

UTXOs

消失了(它們将被用完),但也會建立一個新的(來自

change

的那個)。

在現實生活中,錢包為你的每筆交易使用新位址。這樣做的目的是改善匿名性。怎麼可能從一個

private key

中錢包能夠建立許多

public keys

address

?閱讀确定性錢包以找到答案

大!一切都準備好了!我們現在唯一要做的就是用我們的

private key

簽署交易并将其發送到比特币區塊鍊。正如我之前提到的,我們沒有自己的比特币用戶端。我們使用外部工具與區塊鍊進行通信。問題是:我們能否相信它。當我們廣播交易時,該工具不存在捕獲私鑰或操縱交易的風險(例如,更改

targetAddress

)。如果該工具進行了上面列出的任何更改,則簽名将不再有效,并且将拒絕交易。唯一的風險是該工具根本不會發送交易。但我們可以在任何區塊鍊資料總管中驗證它。是以我們可以毫不畏懼地再次使用

Insight

tx.sign(privateKey);
tx.serialize();

insight.broadcast(tx, function(error, transactionId) {
  if (error) {
    console.log(error);
  } else {
    console.log(transactionId);
  }
});
           

這就是所有人!該交易被廣播到網絡。如果一切順利,我們将收到交易ID。然後将其複制并粘貼到比特币區塊鍊浏覽器中,看看它是否真的有效。

完整代碼可以在GitHub上找到。

建議你浏覽我們彙智網的各種程式設計語言的區塊鍊教程和區塊鍊技術部落格,深入了解區塊鍊,比特币,加密貨币,以太坊,和智能合約。

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

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

繼續閱讀