本文尝试编程读取区块高度170中的一笔交易的详细信息:
https://btc.com/170
很多网站提供区块链浏览器,可以方便地读取区块和交易的详细信息,比如这些网站:
有些网站还给程序员提供更为方便的Restful的API接口,比如blockchain.info提供的查询交易信息的API接口:
https://blockchain.info/rawtx/f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16
解析上面的JSON数据并不难,但没必要重复发明轮子,已经有程序员开发好了相关服务和类库,它就是 QBitNinja.Client。源代码主站点:
https://github.com/MetacoSA/QBitNinja
用这些代码,自己可以搭建一个区块链API的服务器,当然我们这里直接调用它提供的服务,只需要安装客户端即可。网址是:
http://api.qbit.ninja/
用NuGet安装QBitNinja.Client的程序引用之后,用几行语句就可以方便地获取交易信息。
using QBitNinja.Client; using QBitNinja.Client.Models;
声明一个client实例,把交易ID转换为uint256对象,然后就可以获取交易信息。
QBitNinjaClient client = new QBitNinjaClient(Network.Main); uint256 txid = uint256.Parse("f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16"); GetTransactionResponse txr = client.GetTransaction(txid).Result; Console.WriteLine("version: " + txr.Transaction.Version); Console.WriteLine("block height: " + txr.Block.Height); Console.WriteLine("txid: " + txr.TransactionId);
这笔交易的版本是1,区块高度为170。
NBitcoin中提供了一个Transaction类,所有与交易有关的信息都在这里了,最重要的信息是交易的输入项(inputs)和输出项(outputs)。
程序的输出:
f4184fc59.......31e9e16 inputs: 0437cd7f8525......06ee5a597c9 0 outputs: 04ae1a62fe......414e7aab37397f554 a7df5f142c21c......baded5c72a704f7e6cd84c OP_CHECKSIG 1Q2TWHE3GMdB6BZKafqwxXtWAWgFt5Jvm3 1000000000 0411db93e1d......909a5cb2e0eaddfb84cc f9744464f82......99b8643f656b412a3 OP_CHECKSIG 12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S 4000000000
交易的输入项(inputs)来自于之前的某笔交易的输出(PrevOut)。
输出(outputs)有两项:一项为10BTC,一项为40BTC,注意这里的单位都是聪(Satoshi) 。
输出脚本中记录的都是公钥哈希,可以解析为比特币地址。
这个例子中的交易是区块高度为170的区块中的第二笔交易,所以也可以用下面的代码直接找到这笔交易。
BlockFeature height = new BlockFeature(170); GetBlockResponse gbr = client.GetBlock(height).Result; Transaction tx = gbr.Block.Transactions[1]; // 第一笔交易的序号是0
上面的代码访问了一个中心网站:
http://api.qbit.ninja
比特币既然是去中心化的,就不应该依赖于任何一个中心节点,NBitcoin也提供了连接Bitcoin Core全节点钱包的类库,下一节再介绍。
--- END ---