主页 > imtoken钱包新版下载 > C#使用区块链浏览器的Web Api开发比特币应用
C#使用区块链浏览器的Web Api开发比特币应用
区块链浏览器通常提供块浏览,或者更具体地说是 Web API,可以帮助您快速入门。 区块链浏览器是一种自托管或第三方托管的解决方案,如 QBitNinja,可为您提供有关区块链中的区块、交易和地址的信息。
区块链浏览器连接到比特币节点,索引区块链的数据并公开一个易于使用的 API。 解决方案包括:QBitNinja、Blockcypher、Smartbit、Electrum 服务器、Insight、NBXplorer。 优点是:
弱点是:
不同的区块链浏览器暴露不同的 API 和功能。 例如,大多数区块链浏览器使用 HTTP Web API,而 Electrum 使用 Stratum 协议。 `区块浏览器永远不会拥有钱包的私钥。
使用 QBitNinja,很难跟踪总是更改地址的钱包,因为您需要轮询属于同一钱包的所有地址以检测任何更改。
然而,Electrum 或 NBXplorer 和 SmartBit 通过 websockets 或长轮询发布消息,所以你不需要轮询你钱包的所有地址。
洞察力不容易维护。 Blockcypher、QBitNinja 和 Smartbit 是托管的。 如果您有兴趣以这种方式构建钱包,请查看 nopara73 的 CodeProject 文章:在 C# 中使用 QBitNinja 构建您自己的比特币钱包。
NBxplorer 的创建具有非常简单的 API,可以自托管,并且只跟踪钱包需要的内容。 与 QBitNinja 相反,它依赖于你拥有一个完整的节点以太坊区块浏览器api,但它提供了 websocket 通知以及查询钱包余额的简单方法。
NBXplorer 也是单一服务器上的多加密货币。 截至 2018 年 10 月,它支持比特币、莱特币、BCash、BGold、Dash、Dogecoin、Dystem、Feathercoin、Groestlcoin、Monacoin、Polis、UFO、Viacoin 和 Zclassic。 它与 NBitcoin 无缝集成。
要设置 NBXplorer,您需要一个具有默认参数的完全同步的 bitcoind 节点。 然后使用默认参数克隆并运行 NBXplorer。
参考NBXplorer.Client nuget包然后需要通知NBXplorer跟踪用户钱包:
var network = new NBXplorerNetworkProvider(ChainType.Main).GetBTC();
var userExtKey = new ExtKey();
var userDerivationScheme = network.DerivationStrategyFactory.CreateDirectDerivationStrategy(userExtKey.Neuter(), new DerivationStrategyOptions()
{
// Use non-segwit
Legacy = true
});
ExplorerClient client = new ExplorerClient(network);
client.Track(userDerivationScheme);
如果您想使用 Testnet 或 Regtest,请更改 ChainType.Main。
如果你想要一个新的未使用的地址:
Console.WriteLine(client.GetUnused(userDerivationScheme, DerivationFeature.Deposit).Address);
然后您可以查询用户的 UTXO 并按如下方式使用它们:
var utxos = client.GetUTXOs(userDerivationScheme, null, false);
如果你想花费这些 UTXO:
var coins = utxos.GetUnspentCoins();
var keys = utxos.GetKeys(userExtKey);
TransactionBuilder builder = new TransactionBuilder();
builder.AddCoins(coins);
builder.AddKeys(keys);
builder.Send(new Key(), Money.Coins(0.5m));
builder.SetChange(changeAddress.ScriptPubKey);
// Set the fee rate
var fallbackFeeRate = new FeeRate(Money.Satoshis(100), 1);
var feeRate = tester.Client.GetFeeRate(1, fallbackFeeRate).FeeRate;
builder.SendEstimatedFees(feeRate);
/////
var tx = builder.BuildTransaction(true);
Console.WriteLine(client.Broadcast(tx));
这个解决方案的一个问题是,如果你同时调用这个代码两次,你可能会广播两个使用相同币种的交易以太坊区块浏览器api,导致其中一个交易被删除。 为防止出现此问题,您需要确保不会两次使用完全相同的硬币。 该问题的解决方案是简单地重试:
while(true)
{
var coins = utxos.GetUnspentCoins();
var keys = utxos.GetKeys(userExtKey);
TransactionBuilder builder = new TransactionBuilder();
builder.AddCoins(coins);
builder.AddKeys(keys);
builder.Send(new Key(), Money.Coins(0.5m));
builder.SetChange(changeAddress.ScriptPubKey);
// Set the fee rate
var fallbackFeeRate = new FeeRate(Money.Satoshis(100), 1);
var feeRate = tester.Client.GetFeeRate(1, fallbackFeeRate).FeeRate;
builder.SendEstimatedFees(feeRate);
/////
var tx = builder.BuildTransaction(true);
var result = client.Broadcast(tx);
if(result.Success)
{
Console.WriteLine("Success!");
break;
}
else if(result.RPCCode.HasValue && result.RPCCode.Value == RPCErrorCode.RPC_TRANSACTION_REJECTED)
{
Console.WriteLine("We probably got a conflict, let's try again!");
continue;
}
else
{
Console.WriteLine($"Something is really wrong {result.RPCCode} {result.RPCCodeMessage} {result.RPCMessage}");
// Do something!!!
}
}
另一种常见的方法是拥有一个可以检查的已用出点的全局列表。
================================================ == =====================
分享一些与比特币、以太坊、EOS、Fabric等区块链相关的交互式在线编程实战教程: