主页 > 下载imtoken钱包官网苹果版 > 用 JavaScript 编写自己的比特币交易代码

用 JavaScript 编写自己的比特币交易代码

今天我们将编写第一笔比特币交易。为此必须买整个比特币才有密钥ma,我们将使用一个名为 bitcore 的 JavaScript 库。JavaScript 是最流行的现代编程语言,几乎每个开发人员都知道它,因此它使本文对更广泛的受众具有通用性和有用性。

在继续本文之前,您应该至少对比特币区块链的工作原理有基本的技术知识。如果没有,请花几分钟时间阅读区块链简介。如果你有更多时间,比如几个小时,我建议你阅读 Mastering Bitcoin。

让我们从一个具有以下依赖项的新 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 的缩写。它可以轻松地在比特币钱包之间导入密钥。然后我们将从这个私钥创建一个测试网地址:

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

警告!在该示例中,我与您共享我的私钥。你不应该在现实生活中这样做。拥有私钥的人是分配给该密钥地址的比特币的所有者。这是所有权的标志。

在这种情况下,我只是与您分享了用于创建测试网地址的密钥。Testnet 是为软件和脚本测试而创建的比特币网络。它不包含真正的比特币,仅测试比特币。您可以免费获得它们。就算有人偷了也没什么大不了的。我可以承担这个风险,并为您提供一个开箱即用的示例。

如果有人使用/窃取了该地址的所有测试比特币,您可以为其充值。复制地址 mibK5jk9eP7EkLH175RSPGTLR27zphvvxa 并将其粘贴到表单中。

是时候创建我们想要发送测试比特币的目标地址了。

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
}

UTXO 的输出是一个数组。它的每个元素都包含有关地址和作为 UTXO 所有者的 Satoshis(1 Satoshi = 0.00000001 比特币)的信息。它看起来像这样:

[  ]

创建我们的交易的时间:

var tx = new bitcore.Transaction();

让我们将接收到的 UTXO 设置为交易的输入。需要注意的一件重要事情是:我们不是从地址获取比特币,而是从 UTXO 获取比特币。

tx.from(utxos);

让我们设置我们要交付给他的交易和金额的接收者。金额以比特币的最小单位 Satoshis 给出:1 Satoshi = 0.00000001 比特币。这是我们交易的输出:

tx.to(targetAddress, 10000);

是时候讨论价值观的变化了。UTXO 是指向我们地址但尚未花费的交易的输出。UTXO 就像一张钞票。如果你口袋里有一张 5 美元的钞票,想买一杯 2 美元的啤酒,你不会剪掉一部分钞票交给收银员。你给一张 5 美元的钞票,得到 3 美元的零钱。它与 UTXO 完全相同。您必须在交易中使用整个 UTXO 并指定零钱价值和地址,然后零钱应该被退回。

怎么回事?我必须指定更改值吗?在商店里,当我花 5 美元买一瓶 2 美元的啤酒时,我得到 3 美元的回报。这是显而易见的。无需计算。

在比特币中,有一点不同。实际上,变化只是交易的另一个输出。输出的总和应该略小于输入的总和。差额称为挖矿费。您将其支付给矿工以包含在交易块中。像 bitcore.io 这样的钱包或库会估算我们的挖矿费用。所以在我们的例子中,我们应该将零钱退回到指定的地址。

tx.change(sourceAddress);

您会注意到我们使用了 sourceAddress。结果,该地址的一些现有 UTXO 消失了(它们将被用完),但也创建了一个新的 UTXO(来自更改的 UTXO)。

在现实生活中,钱包会为您的每笔交易使用新地址。这样做的目的是提高匿名性。钱包怎么可能从一个私钥创建多个公钥和地址?阅读确定性钱包以找出答案

大的!全部都准备好了!我们现在唯一要做的就是用我们的私钥签署交易并将其发送到比特币区块链。正如我之前提到的,我们没有自己的比特币客户端。我们使用外部工具与区块链进行通信。问题是:我们能相信它。当我们广播交易时,该工具不存在捕获私钥或操纵交易(例如更改目标地址)的风险。如果该工具进行了上面列出的任何更改,则签名将不再有效并且交易将被拒绝。唯一的风险是该工具根本不会发送交易。但我们可以在任何区块链浏览器中验证它。所以我们可以放心地再次使用 Insight:

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

就这样!交易被广播到网络。如果一切顺利必须买整个比特币才有密钥ma,我们将收到交易 ID。然后将其复制并粘贴到比特币区块链浏览器中,看看它是否真的有效。

完整的代码可以在 GitHub 上找到。

我们建议您浏览我们的各种编程语言的区块链教程和区块链技术博客,以深入了解区块链、比特币、加密货币、以太坊和智能合约。