本文尝试编程读取区块高度170中的一笔交易的详细信息:

https://btc.com/170

很多网站提供区块链浏览器,可以方便地读取区块和交易的详细信息,比如这些网站:

  • https://btc.com
  • https://blockchain.info
  • https://www.blocktrail.com/BTC
  • https://www.blockchain.com/explorer
  • https://blockexplorer.com
  • https://live.blockcypher.com/btc
  • https://explorer.bitcoin.com/btc
  • https://chainz.cryptoid.info/btc
  • https://chain.so

有些网站还给程序员提供更为方便的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 —

发表评论