主页 > imtoken官网下载广告 > C#使用区块链浏览器的Web Api开发比特币应用

C#使用区块链浏览器的Web Api开发比特币应用

imtoken官网下载广告 2023-03-11 06:16:06

通常区块链浏览器提供区块浏览,或者更具体地说是一个 Web API,可以让您快速入门。区块链浏览器是一种自托管或第三方托管的解决方案,例如 QBitNinja,可为您提供有关区块链中的区块、交易和地址的信息。

Blockchain Explorer 连接到比特币节点,为区块链的数据编制索引并公开一个易于使用的 API。解决方案包括:QBitNinja、Blockcypher、Smartbit、Electrum server、Insight、NBXplorer。优点是:

缺点是:

不同的区块链浏览器公开不同的 API 和功能。例如,大多数区块链浏览器使用 HTTP Web API,而 Electrum 使用 Stratum 协议。 `区块浏览器永远不会拥有钱包的私钥。

以太区块链浏览器

使用 QBitNinja,很难跟踪总是更改地址的钱包,因为您需要轮询属于同一钱包的所有地址以检测任何更改。

但是,Electrum 或 NBXplorer 和 SmartBit 通过 websockets 或长轮询发布消息以太区块链浏览器,因此您无需轮询钱包的所有地址。

洞察力不易维护。 Blockcypher、QBitNinja 和 Smartbit 是第三方托管。如果您对以这种方式构建钱包感兴趣,请查看 nopara73 的 CodeProject 文章:使用 C# 中的 QBitNinja 构建您自己的比特币钱包。

NBxplorer 的创建是为了拥有一个非常简单的 API、自我监管,并且只跟踪钱包需要的东西。与 QBitNinja 不同,它依赖于你拥有一个完整的节点,但它提供了 websocket 通知和一种查询钱包余额的简单方法。

NBXplorer 也是单一服务器上的多种加密货币。截至 2018 年 10 月,它支持比特币、莱特币、BCash、BGold、Dash、Dogecoin、Dystem、Feathercoin、Groestlcoin、Monacoin、Polis、UFO、Viacoin 和 Zclassic。它与 NBitcoin 无缝集成。

以太区块链浏览器

要设置 NBXplorer,您需要一个具有默认参数的完全同步的 bitcoind 节点。然后使用默认参数克隆并运行 NBXplorer。

请参考NBXplorer.Client nuget包,然后您需要通知NBXplorer跟踪用户钱包:

1
2
3
4
5
6
7
8
9

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。

以太区块链浏览器

如果您想要一个新的未使用地址:

1

Console.WriteLine(client.GetUnused(userDerivationScheme, DerivationFeature.Deposit).Address);

然后您可以查询用户的 UTXO 并按如下方式使用它们:

1

以太区块链浏览器

var utxos = client.GetUTXOs(userDerivationScheme, null, false);

如果你想花掉这些 UTXO:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

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));

这个解决方案的一个问题是,如果你同时调用这个代码两次,你可能会使用同一个硬币广播两个交易,导致其中一个被删除。为防止出现此问题,您需要确保不会两次花费完全相同的硬币。解决问题的方法是简单地再试一次:

以太区块链浏览器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

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!!!
}
}

另一种常见的方法是使用全局列表来检查已使用的 outpoint。

================================================ ==========================

分享一些区块链相关问题,如比特币、以太坊、EOS、Fabric等。交互式在线编程实战教程: