资讯专栏INFORMATION COLUMN

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

lolomaco / 2783人阅读

摘要:今天我们将编写第一个比特币交易代码。是一个为软件和脚本测试而创建的比特币网络。最终的解决方案应该是拥有自己的比特币全节点。数量以给出,这是比特币的最小单位比特币。正如我之前提到的,我们没有自己的比特币客户端。

今天我们将编写第一个比特币交易代码。为了实现这一目标,我们将使用名为bitcore的JavaScript库。JavaScript是最流行的现代编程语言,几乎每个开发人员都知道它,因此它使这篇文章具有普遍性并且对更广泛的受众有用。

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

让我们从一个具有以下依赖关系的新NPM项目开始:

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

打开index.js文件并导入bitcore库:

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

要花费比特币我们需要一个包含比特币的地址和一个允许我们花钱的私钥。我们将导入WIF版本的私钥。WIFWallet 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来存储该信息。UTXOUnspent 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比特币)的信息。它看起来像这样:

[  ]

是时候创建我们的交易了:

var tx = new bitcore.Transaction();

让我们将收到的UTXOs设置为交易的input。需要注意的一件重要事情是:我们不是从address而是从UTXOs获得比特币。

tx.from(utxos);

让我们设置我们想要交付给他的交易和金额的接收者。数量以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。你将其支付给矿工以包含在交易区块中。像bitcore.io这样的钱包或库估算了我们的mining fee。所以在我们的例子中,我们应该返回change到指定address

tx.change(sourceAddress);

你可以注意到我们使用了sourceAddress。结果,该地址的一些现有UTXOs消失了(它们将被用完),但也会创建一个新的(来自change的那个)。

在现实生活中,钱包为你的每笔交易使用新地址。这样做的目的是改善匿名性。怎么可能从一个private key中钱包能够创建许多public keysaddress?阅读确定性钱包以找到答案

大!一切都准备好了!我们现在唯一要做的就是用我们的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工程师不可多得的比特币开发学习课程。

php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。

以太坊入门教程,主要介绍智能合约与dapp应用开发,适合熟悉javascript或某一开发语言的程序员入门。

这里是原文

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/24324.html

相关文章

  • JavaScript编写自己比特交易代码

    摘要:今天我们将编写第一个比特币交易代码。是一个为软件和脚本测试而创建的比特币网络。最终的解决方案应该是拥有自己的比特币全节点。数量以给出,这是比特币的最小单位比特币。正如我之前提到的,我们没有自己的比特币客户端。 今天我们将编写第一个比特币交易代码。为了实现这一目标,我们将使用名为bitcore的JavaScript库。JavaScript是最流行的现代编程语言,几乎每个开发人员都知道它,...

    Lin_YT 评论0 收藏0
  • 如何开发比特钱包应用程序

    摘要:创建比特币钱包需要一组优秀的程序员。如何使用流行的库构建自己的比特币钱包应用程序创建比特币钱包应用程序的一种方法是依赖现有工具。具有以下功能它允许开发人员使用密码加密创建比特币钱包应用程序。 尽管目前加密货币市场相当黯淡,但比特币和其他山寨币继续受欢迎。每天都有新的交易者加入市场,希望能够在下一个价格高涨时获利。 随着市场的突飞猛进,开发商也在获益。新交易者的首要任务是设置比特币钱包。...

    Cympros 评论0 收藏0
  • 如何开发比特钱包应用程序

    摘要:创建比特币钱包需要一组优秀的程序员。如何使用流行的库构建自己的比特币钱包应用程序创建比特币钱包应用程序的一种方法是依赖现有工具。具有以下功能它允许开发人员使用密码加密创建比特币钱包应用程序。 尽管目前加密货币市场相当黯淡,但比特币和其他山寨币继续受欢迎。每天都有新的交易者加入市场,希望能够在下一个价格高涨时获利。 随着市场的突飞猛进,开发商也在获益。新交易者的首要任务是设置比特币钱包。...

    crossea 评论0 收藏0
  • 区块链开发中使用最流行编程语言

    摘要:我们目前正处于一个新兴的区块链开发行业中。,一种在以太坊开发人员中流行的新的简单编程语言,因为它是用于开发以太坊智能合约的语言。它是全球至少万开发人员使用的世界上最流行的编程语言之一。以太坊,主要是针对工程师使用进行区块链以太坊开发的详解。 我们目前正处于一个新兴的区块链开发行业中。区块链技术处于初期阶段,然而这种颠覆性技术已经成功地风靡全球,并且最近经历了一场与众不同的繁荣。由于许多...

    2shou 评论0 收藏0
  • 以太坊连载(一):以太坊是什么?

    摘要:然而,每个以太坊节点都运行着以太坊虚拟机是为了保持整个区块链的一致性。以太坊区块链跟踪每个账户的状态,所有以太坊区块链上的状态转换都是账户之间价值和信息的转移。费用通过以太坊自有的有价代币,以太币的形式支付。 以太坊是什么?以太坊是一个全新开放的区块链平台,它允许任何人在平台中建立和使用通过区块链技术运行的去中心化应用。就像比特币一样,以太坊不受任何人控制,也不归任何人所有——它是一个...

    gekylin 评论0 收藏0

发表评论

0条评论

lolomaco

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<