HiddenBitcoin: 高级 C# 比特币钱包库 - 监控区块链(第二部分 - 第 1 课)






4.58/5 (4投票s)
C# 比特币钱包开发的快速入门
目录
- 第一部分:保证您的币安全
- 第二部分:第 1 课 - 监控区块链(本篇)
- 第二部分:第 2 课 - 监控您的钱包
- 第三部分:花费您的币(进行中)
重要提示
如果您想在生产中使用它,请与我联系。 只要没有人在生产中使用它,我就会根据我的需要不断更改它。
引言
开发人员的时间就是金钱。 本指南是 C# 开发人员快速入门比特币的理想选择。
我正在开发一个比特币钱包,名为 HiddenWallet。 HiddenBitcoin 库是 NBitcoin 和我的用户界面之间的另一个抽象层。
在本三部分教程结束时,您将能够构建一个比特币钱包。
引用
虽然对 API 进行编程可以帮助快速启动应用程序,但开发人员受到针对 API 进行创新的限制。
Nicolas Dorier,比特币核心开发人员,NBitcoin(C# 比特币库)的创建者。 在使用我的高级 API 时,请记住这句话。
他也是 C# 比特币书 的主要作者,我正在与他合作编写。
有多高级? 在我看来,GUI 开发人员、设计师不应该犯太多错误。 他们不应该了解输入、输出和 scriptpubkey。 他们应该坚持地址、私钥和钱包级别。 此外,应该完全抽象掉 NBitcoin。
如果您熟悉 NBitcoin,您可以在 C# 比特币书 中找到本教程更深层次的版本,作为一个案例研究。
如何监控地址?
区块链
比特币区块链是一个公共账本,因此每个人都可以看到那里发生的每笔交易。 任何人都可以随时提交交易。 然而,此时,交易尚未确认,如果添加的交易费用太低,则可能不会发生确认。 每 10 分钟确认一组交易。
地址余额
您可以非常直接地获取地址的余额
var network = Network.MainNet;
// HttpMonitor can monitor The Blockchain through HTTP (QBitNinja)
var httpMonitor = new HttpMonitor(network);
// Checking address balances
AddressBalanceInfo balanceInfo = httpMonitor.GetAddressBalanceInfo("1ENCTCkqoJqy2XZ2m2Dy1bRax7hsSnC5Fc");
Console.WriteLine($"Address balance: {balanceInfo.Balance}"); // 0,05474889
Console.WriteLine($"Confirmed balance: {balanceInfo.Confirmed}"); // 0
Console.WriteLine($"Unconfirmed balance: {balanceInfo.Unconfirmed}"); // 0,05474889
有多种方法可以访问区块链,通过 HTTP API、SPV 或完整节点。
目前 HiddenBitcoin 可以使用 HTTP,所以暂时不用管其他的。
注意我也做了一个 SPV 实现,但是问题太多了,所以我决定暂时不要走这条路。
运行一个完整的节点非常麻烦,而且情况并没有好转。 虽然我认为代码应该很容易实现,但 HiddenWallet 的受众是普通用户,而不是公司,也不是开发人员,他们永远不会运行完整的节点。
话虽如此,我将把它实现到 HiddenBitcoin 中,但这不是目前的优先事项。
另一个重要说明:Balance
= Confirmed
+ Unconfirmed
。 这意味着,未确认的余额可以是正数或负数,例如,如果您从该地址发送一些钱。
地址历史
// Get history of an address
AddressHistory history = httpMonitor.GetAddressHistory("1ENCTCkqoJqy2XZ2m2Dy1bRax7hsSnC5Fc");
Console.WriteLine("Number of transactions: " + history.Records.Count);
// Exercise: are all transaction confirmed?
var allTransactionsConfirmed = true;
foreach (AddressHistoryRecord record in history.Records)
{
Console.WriteLine(record.TransactionId + " : " + record.Amount);
allTransactionsConfirmed = allTransactionsConfirmed && record.Confirmed;
}
Console.WriteLine("All transactions are confirmed: " + allTransactionsConfirmed);
// Exercise: get the balance of the address
Console.WriteLine("Total received - Total spent = Balance");
Console.WriteLine(history.TotalReceived + " - " + history.TotalSpent + " = " +
(history.TotalReceived - history.TotalSpent));
如何监控交易?
一笔交易可以有多个输入和多个输出。
// Get some data from the transaction
TransactionInfo transactionInfo1 = httpMonitor.GetTransactionInfo(history.Records.First().TransactionId);
Console.WriteLine("txid: " + transactionInfo1.Id);
Console.WriteLine("Network: " + transactionInfo1.Network);
Console.WriteLine("Confirmed: " + transactionInfo1.Confirmed);
Console.WriteLine("Total amount of all inputs: " + transactionInfo1.TotalInputAmount);
Console.WriteLine("Total amount of all outputs: " + transactionInfo1.TotalOutputAmount);
Console.WriteLine("Fee : " + transactionInfo1.Fee);
Console.WriteLine(Environment.NewLine + "Input addresses and amounts: ");
foreach (var input in transactionInfo1.Inputs)
{
Console.WriteLine(input.Amount + " " + input.Address);
}
Console.WriteLine(Environment.NewLine + "Output addresses and amounts: ");
foreach (var output in transactionInfo1.Outputs)
{
Console.WriteLine(output.Amount + " " + output.Address);
}
我的 API 不关心一些交易,我们称它们为奇异交易,以下是如何处理它们
// Sometimes my API can't fully process a transaction, because it has OP_RETURN for example
// It should not be a concern for a Bitcoin wallet that purely handles money,
// if a transaction output or input has not been added
// that means it has some other purpose, a wallet API can dismiss it
// This tx is exotic (has OP_RETURN)
TransactionInfo transactionInfo2 =
httpMonitor.GetTransactionInfo("8bae12b5f4c088d940733dcd1455efc6a3a69cf9340e17a981286d3778615684");
Console.WriteLine(transactionInfo2.Id);
Console.WriteLine("There are exotic inputs or outputs, so not all of them have been added successfully: "
+ Environment.NewLine + !transactionInfo2.AllInOutsAdded);
下一步?
在下一课中,我将向您展示如何监控 Safe,我在第一部分中向您介绍了它。
许可协议
如果您不喜欢我的教程或代码,您有义务进行瑟曦·兰尼斯特 (Cersei Lannister) 的耻辱游街。
此外,您死后,我将有权带走您的灵魂。