区块链教程: 使用Javascript发送数据到区块链

Bitpay开源了它们的Bitcore库包,我们可以使用它来基于Node.js发送信息到区块链。该库包能让我们生产比特币交易,却不用花费几天时间下载完整的区块链账本。

想象比特币和区块链如同笔和新的页面纸张,为了在“纸张”(Blockchain)上写字你需要墨水。在这个比喻中的“墨水”是指你用来创建交易的比特币。我们在里面写一个交易数据被称为“op_return”。一个op_return是操作码,你写在里面的消息就像使用数字墨水在世界范围的电子表格上写信息。

P_Return限制40字符,这是微博大小140字的1/3不到,你可以存储一些有趣的数据。这样应用程序就可以显示监管链,购买证明,或数字公证文件等新方法。

当你在区块链创建交易,它会在世界各地的数千台运行比特币软件的电脑上广播,所以这些交易op_return几秒钟也分布在整个网络。一旦数据被写入,它是不可能改变它。

这改变了我们可以创建应用程序的方式,因为一旦事务被创建后,我们能得到确保不变,因为不会以任何方式改变。另外,数据可以被能访问区块链的任何人验证。他们所需要的是正确的交易ID。

下面看看如何写一个区块链信息。前提是安装好Node.js

首先,创建一个新目录:
mkdir 'HelloWorld'

进入目录,安装两个库包,bitcore和bitcore-explorers:
sudo npm install bitcore@0.13.0 && sudo npm install bitcore-explorers

为确保安装正确:键入HelloWorld ls,可看到一个叫node_modules目录。

打开文本编辑器开始编码,创建一个文件HelloWorld.js:


var bitcore = require('bitcore');
var explorers = require(‘bitcore-explorers');

这样就能调用这两个库包:比如:
var insight = new explorers.Insight();

创建比特币钱包
我们从一个地方发少量比特币到另外一个地方,那就意味着需要两件事:比特币接受地址,和一个我们自己能控制的自己的比特币地址。

比特币是基于公有和私有key,你能创建你私有key的SHA-256 哈希创建公有key,那么你如何创建私有key?

有许多办法,最简单的是使用RushWallet.com产生实际的钱包,这对于长期存储比特币是不推荐的方法,却适合这里教程:
1.访问 RushWallet.com
2.创建钱包
3.创建完钱包,在"Your Bitcoin Address"会看到公有地址,复制存储到HelloWorld.js的变量“publicAddress”.
4.点击设置按钮,选择Export Keys,复制存储到HelloWorld.js的变量“privateKey”.

下面是到目前为止的代码:


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

var publicAddress = '1DuFRRFEJvchWpTQiDqMk3DW3mP9XZ3UTa';
var privateKey = '5KG7bZhGX5jaCD46cxbN1tX6nq1zSa4gAZ4baKmw277RKGbH3qc'

发送目标地址1HLoD9E4SDFFPDiYfNYnkBLQ85Y51J3Zb1是Stoshi的第一个钱包地址。赋值给bitcoinRecipient变量。

还需要几个变量,第一个是挖矿费,这是我们发送交易给区块链的基础费用,相当于邮票邮费。

var minerFee = 667;

下面是发送给区块链的信息:
var blockchainMessage = 'Hello Satoshi!';

你可以发送一便是到测试目标地址,首先检查我们公用地址的余额。


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

var publicAddress = '18JYiBktnAzbS2sEZSrdKgSEFwLjXvW9Uy';
var privateKey = ‘5HxKWX4pkze3AiB4yWrdZKMYrf9hWYdAVp3TnkpYMiGbxnLuLWN’

insight.getUnspentUtxos(publicAddress, function (error, utxos) {
console.log('utxos' + ' :' + JSON.stringify(utxos, undefined, 2));
});

你应该看到如下信息:


utxos :[
{
"address": "18JYiBktnAzbS2sEZSrdKgSEFwLjXvW9Uy",
"txid": "6c2e97cd1[author]0[/author]9[author]0[/author]6ad89fdd1[author]0[/author]c1f[author]0[/author]68fc2[author]0[/author]ecc7[author]0[/author]9a9dcc152dab1d7a2c7118a4158",
"vout": 1,
"scriptPubKey": "76a9145[author]0[/author]1a6c[author]0[/author]e1e7[author]0[/author]3[author]0[/author]1[author]0[/author][author]0[/author]a9a3cdc14b9[author]0[/author]676[author]0[/author]fc45bb388ac",
"amount": [author]0[/author].[author]0[/author][author]0[/author][author]0[/author][author]0[/author]42
}
]

这里查询UXTO未用交易输出,能看到这个钱包中有多少比特币,下面代码检查我们钱包是否有足够钱支付挖矿费:


if (bitcore.Unit.fromBTC(utxos[[author]0[/author]].toObject().amount).toSatoshis() - minerFee > minerFee) {
console.log("We've got enough Satoshis!");
}

如果得到错误信息,意味着你的钱包没有足够钱支付挖矿费。

单向和广播交易
发送比特币从A点到B点,从一个非常高的水平看,就像是签署一个数字检查。也就是只有你的“签名”,这是一个用你的私钥和过去可从一个比特币地址寄钱UXTO的生成数。这一数字检查可以写到任何比特币地址,op_return会像扮演一份这种检查备注,与交易有关的备注。

一旦交易被签署,我们需要告诉区块链,比特币做的最繁重的工作在这里,但在幕后发生的是:交易被最新版本的电子表格验证,确保你发送的钱是你实际上控制的。一经查实,矿工会记录你的交易,它将在blockchain公开它。

这里是签署和广播交易的片段代码:


// Sign the transaction with a combo of your private key, the address you want to pay, and your last UXTO.

insight.getUnspentUtxos(publicAddress, function (error, utxos) {
console.log('utxos' + ' :' + JSON.stringify(utxos, undefined, 2));
if(utxos.length == [author]0[/author]) {
console.log(
"Not enough Satoshis to cover the miner fee.");
return
} else if (bitcore.Unit.fromBTC(utxos[[author]0[/author]].toObject().amount).toSatoshis() - minerFee > minerFee) {
console.log(
"We've got enough Satoshis!");

var transaction = new bitcore.Transaction()
.from(utxos[[author]0[/author]])
// using the last UXTO to sign the next transaction
.to(bitcoinRecipient, 42[author]0[/author][author]0[/author] - minerFee)
// Send 42[author]0[/author][author]0[/author] Satoshi's
.addData(blockchainMessage)
// Our message to Satoshi
.sign(privateKey);
// Last step for the digital autograph

console.log('transaction_hex: ' + transaction.checkedSerialize());

insight.broadcast(transaction, function (error, body) {
if (error) {
console.log('Error in broadcast: ' + error);
}
else {
console.log(
"Success! Here's our Transaction ID: " + body);
console.log('http:
//explorer.chain.com/transactions/' + body + "#!transaction-op-return")
}
});
}
});

上述代码完成后,运行:
node HelloWorld.js

总结:自动驾驶汽车,数字民主和运输食品等等都可以从区块链中得到好处,从这个网络我们能读取 信任更重要是对变化做出反应。

Blockchain Tutorial: Write a message to the Bitcoi
[该贴被banq于2016-09-23 13:43修改过]