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版本的私钥。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比特币)的信息。它看起来像这样:

[ <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 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上找到。

原文地址:https://www.cnblogs.com/mailer/p/9759000.html

时间: 2024-10-07 00:13:36

JavaScript编写自己的比特币交易代码的相关文章

比特币自动交易代码和套利机器人 (开源软件)

简单介绍几个比特币/山寨币的自动交易系统,利用开源代码自己可以再定制好的交易策略,有兴趣的朋友一起来探讨. 如果您知道其它好的开源自动交易系统,欢迎添加. 软件名称: Blackbird编程语言: C++下载地址: https://github.com/butor/blackbird支持平台: Bitfinex, OKCoin, Bitstamp, Kraken, ItBit, Gemini软件简介: 比特币多交易平台间套利系统.利用平台间价格变化盈利,无需在平台之间转账. 软件名称: Gekk

BitcoinJS - 支持比特币交易的 JavaScript 库

BitcoinJS 是一个干净,可读的 JavaScript 开发库,用于比特币交易.支持 Node.js 平台和浏览器端.已有超过150万的钱包用户在使用, BitcoinJS 是几乎所有的 Web 端比特币钱包交易最重要的库.它支持先进的功能,如多SIG ,速度快以及优化的代码. 官方网站 您可能感兴趣的相关文章 网站开发中很有用的 jQuery 效果[附源码] 分享35个让人惊讶的 CSS3 动画效果演示 十分惊艳的8个 HTML5 & JavaScript 特效 Web 开发中很实用的1

编写更好的jQuery代码(转)

这是一篇关于jQuery的文章,写到这里给初学者一些建议. 原文地址:http://flippinawesome.org/2013/11/25/writing-better-jquery-code/ 现在已经有很多文章讨论jQuery和JavaScript的性能问题,然而,在这篇文章中我计划总结一些提升速度的技巧和一些我自己的建议来改善你的jQuery和JavaScript代码.更好的代码意味着更快的应用程序,快速渲染和反应性意味着一个更好的用户体验. 首先,我们要记住最重要的一点是:jQuer

【教程】HTML5+JavaScript编写flappy bird

     作者: 风小锐      新浪微博ID:永远de风小锐      QQ:547953539      转载请注明出处 PS:新修复了两个bug,已下载代码的同学请查看一下 大学立即要毕业了.未来的公司为我们制定了在校学习计划.希望我们能在毕业之前掌握一些技术,当中有一项就是使用HTML5+JavaScript编写flappy bird这个小游戏. 相信大家和我一样,对这个小游戏还是非常熟悉的,控制小鸟跳过高矮不一的水管,并记录下每局得到的分数,对于亲手编写这个小游戏非常感兴趣,立即開始

编写更好的jQuery代码的建议

编写更好的jQuery代码的建议 2013/12/05 | 分类: WEB前端, 开发 | 15 条评论 | 标签: JQUERY 分享到:125 本文由 伯乐在线 - yanhaijing 翻译自 Mathew Carella.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. 讨论jQuery和javascript性能的文章并不罕见.然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码.好的代码会带来速度的提升.快速渲染和响应意味着更好的

使用 JavaScript 编写优化算法 (1)

之前一直用Python来写优化算法,为了增强 JS 的熟练程度,开始将原有的代码改写成 JS.采用的工具包括 node.js + Grunt + nodeunit + github + npm + travis-ci. 最初的版本采用过程式的方式实现,没有采用面向对象或事件驱动的模式. #!/usr/bin/env node --harmony // Random Search "use strict"; var util = require("util"); fu

JavaScript学习总结(十二)——JavaScript编写类

在工作中经常用到JavaScript,今天总结一下JavaScript编写类的几种写法以及这几种写法的优缺点,关于JavaScript编写类的方式,在网上看到很多,而且每个人的写法都不太一样,经常看到的就是以下几种方式. 1.构造函数方式 用构造函数模拟"类",在其内部用this关键字指代实例对象. 基本语法: function 类名(){     this.属性名;//公共属性     var 属性名;//私有属性    /*凡是定义类的公共属性和公共方法都要使用this*/   

编写高效的js/jQuery代码 :rocket:

讨论jQuery和javascript性能的文章并不罕见.然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码.好的代码会带来速度的提升.快速渲染和响应意味着更好的用户体验. 首先,在脑子里牢牢记住jQuery就是javascript.这意味着我们应该采取相同的编码惯例,风格指南和最佳实践. 首先,如果你是一个javascript新手,我建议您阅读 <给JavaScript初学者的24条最佳实践>http://youngsterxyf.gi

Javascript编写类的混合方式

构造方法的方式可以为同一个类的每一个对象分配不同的内存, 这很适合写类的时候设置属性, 但是设置方法的时候我们就需要让同一个类的不同对象共享同一个内存了. 写方法用原型的方式最好. 所以写类的时候需要把构造方法和原型两种方式混合着用. 废话少说, 看代码: //创建一个Student类 //属性通过构造方法设置 //方法通过Student.prototype设置 function Student(name){ this.name = name; Student.prototype.sayName