溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用JavaScript編寫自己的比特幣交易代碼

發(fā)布時間:2021-09-30 10:27:38 來源:億速云 閱讀:310 作者:柒染 欄目:互聯(lián)網(wǎng)科技

本篇文章給大家分享的是有關(guān)如何使用JavaScript編寫自己的比特幣交易代碼,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

今天我們將編寫第一個比特幣交易代碼。為了實現(xiàn)這一目標,我們將使用名為bitcore的JavaScript庫。JavaScript是最流行的現(xiàn)代編程語言,幾乎每個開發(fā)人員都知道它,因此它使這篇文章具有普遍性并且對更廣泛的受眾有用。

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

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

打開index.js文件并導入bitcore庫:

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

要花費比特幣我們需要一個包含比特幣的地址和一個允許我們花錢的私鑰。我們將導入WIF版本的私鑰。WIFWallet Import Format的縮寫。它可以在比特幣錢包之間輕松導入密鑰。 然后我們將從該私鑰創(chuàng)建一個testnet地址:

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

**警告!**在那個例子中,我與你分享我的私鑰。你不應該在現(xiàn)實生活中這樣做。擁有私鑰的人是分配給該密鑰的地址的比特幣的所有者。這是所有權(quán)的標志。

在這種情況下,我只是與你分享了用于創(chuàng)建testnet地址的密鑰。Testnet是一個為軟件和腳本測試而創(chuàng)建的比特幣網(wǎng)絡。它不包含真正的比特幣,只包含測試的比特幣。 你可以免費獲得它們。即使有人偷了他們也沒什么大不了的。我可以冒這個風險為你提供開箱即用的示例。

如果有人使用/偷走了這個地址的所有測試比特幣,你可以給它接著充。復制地址mibK5jk9eP7EkLH175RSPGTLR27zphvvxa并將其粘貼到表單中。

是時候創(chuàng)建我們想要發(fā)送測試比特幣的targetAddress了。

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

如果有任何比特幣,請檢查我們的源地址。比特幣網(wǎng)絡使用UTXO來存儲該信息。UTXOUnspent Transaction Output的縮寫。

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

在這種情況下,我們正在失去比特幣區(qū)塊鏈的最大優(yōu)勢。系統(tǒng)的架構(gòu)使我們不必信任任何一方。網(wǎng)絡共識,數(shù)學和加密使得區(qū)塊鏈中存儲的數(shù)據(jù)可信。但現(xiàn)在我們要求中間人為我們讀取這些數(shù)據(jù)。他可能會向我們提供虛假或過時的數(shù)據(jù)。

我們將使用來自bitcore-explorers庫的Insight。由于它非常受歡迎,我們只是在這里學習,我們可以假設它可以信任。最終的解決方案應該是擁有自己的比特幣全節(jié)點。

好吧,讓我們使用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的輸出是一個數(shù)組。它的每個元素都包含有關(guān)作為UTXO所有者的地址和Satoshis(1 Satoshi = 0.00000001比特幣)的信息。它看起來像這樣:

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

是時候創(chuàng)建我們的交易了:

var tx = new bitcore.Transaction();

讓我們將收到的UTXOs設置為交易的input。需要注意的一件重要事情是:我們不是從address而是從UTXOs獲得比特幣。

tx.from(utxos);

讓我們設置我們想要交付給他的交易和金額的接收者。數(shù)量以Satoshis給出,這是比特幣的最小單位:1 Satoshi = 0.00000001比特幣。這是我們交易的output

tx.to(targetAddress, 10000);

是時候討論值的the changeUTXOs是指向我們地址但尚未用完的交易的輸出。UTXOs就像一張鈔票。如果你的口袋里有5美元的鈔票并且想購買2美元的啤酒,你就不會削減一部分賬單并將其交給收銀員。你給5美元的鈔票并收到3美元的改變。它與UTXOs完全相同。你必須在交易中使用整個UTXO并指定change值和address,然后應返回change。

WTF?我是否必須指定change值?在商店里,當我以5美元的價格購買2美元的啤酒時,我收到3美元的回報。這很明顯。無需計算。

在比特幣中,存在一點差異。實際上,change只是交易的另一個輸出。outputs的總和應該比input的總和小一點。差異稱為mining fee。你將其支付給礦工以包含在交易區(qū)塊中。像bitcore.io這樣的錢包或庫估算了我們的mining fee。所以在我們的例子中,我們應該返回change到指定address

tx.change(sourceAddress);

你可以注意到我們使用了sourceAddress。結(jié)果,該地址的一些現(xiàn)有UTXOs消失了(它們將被用完),但也會創(chuàng)建一個新的(來自change的那個)。

在現(xiàn)實生活中,錢包為你的每筆交易使用新地址。這樣做的目的是改善匿名性。怎么可能從一個private key中錢包能夠創(chuàng)建許多public keysaddress?閱讀確定性錢包以找到答案

大!一切都準備好了!我們現(xiàn)在唯一要做的就是用我們的private key簽署交易并將其發(fā)送到比特幣區(qū)塊鏈。正如我之前提到的,我們沒有自己的比特幣客戶端。我們使用外部工具與區(qū)塊鏈進行通信。問題是:我們能否相信它。當我們廣播交易時,該工具不存在捕獲私鑰或操縱交易的風險(例如,更改targetAddress)。如果該工具進行了上面列出的任何更改,則簽名將不再有效,并且將拒絕交易。唯一的風險是該工具根本不會發(fā)送交易。但我們可以在任何區(qū)塊鏈資源管理器中驗證它。所以我們可以毫不畏懼地再次使用Insight

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

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

這就是所有人!該交易被廣播到網(wǎng)絡。如果一切順利,我們將收到交易ID。然后將其復制并粘貼到比特幣區(qū)塊鏈瀏覽器中,看看它是否真的有效。

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

建議你瀏覽我們匯智網(wǎng)的各種編程語言的區(qū)塊鏈教程和區(qū)塊鏈技術(shù)博客,深入了解區(qū)塊鏈,比特幣,加密貨幣,以太坊,和智能合約。

  • java比特幣開發(fā)教程,本課程面向初學者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Java代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構(gòu)造裸交易等,是Java工程師不可多得的比特幣開發(fā)學習課程。

  • php比特幣開發(fā)教程,本課程面向初學者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Php代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構(gòu)造裸交易等,是Php工程師不可多得的比特幣開發(fā)學習課程。

  • 以太坊入門教程,主要介紹智能合約與dapp應用開發(fā),適合熟悉javascript或某一開發(fā)語言的程序員入門。

  • 以太坊開發(fā)進階教程,主要是介紹使用node.js、mongodb、區(qū)塊鏈、ipfs實現(xiàn)去中心化電商DApp實戰(zhàn),適合進階。

  • java以太坊開發(fā)教程,主要是針對java和android程序員進行區(qū)塊鏈以太坊開發(fā)的web3j詳解。

  • php以太坊,主要是介紹使用php進行智能合約開發(fā)交互,進行賬號創(chuàng)建、交易、轉(zhuǎn)賬、代幣開發(fā)以及過濾器和交易等內(nèi)容。

  • python以太坊,主要是針對python工程師使用web3.py進行區(qū)塊鏈以太坊開發(fā)的詳解。

  • C#以太坊,主要講解如何使用C#開發(fā)基于.Net的以太坊應用,包括賬戶管理、狀態(tài)與交易、智能合約開發(fā)與交互、過濾器和交易等。

  • EOS入門教程,本課程幫助你快速入門EOS區(qū)塊鏈去中心化應用的開發(fā),內(nèi)容涵蓋EOS工具鏈、賬戶與錢包、發(fā)行代幣、智能合約開發(fā)與部署、使用代碼與智能合約交互等核心知識點,最后綜合運用各知識點完成一個便簽DApp的開發(fā)。

以上就是如何使用JavaScript編寫自己的比特幣交易代碼,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI