HiddenBitcoin: 高级 C# 比特币钱包库 - 监控您的钱包(第 2 部分 - 第 2 课)






4.84/5 (4投票s)
C# 比特币钱包开发的快速入门
目录
- 第 1 部分:保护您的硬币
- 第 2 部分:第 1 课 - 监控区块链
- 第 2 部分:第 2 课 - 监控您的钱包(本课)
- 第 3 部分:花费您的硬币(进行中)
重要提示
如果您想在生产环境中使用它,请与我联系。 只要没有人将其用于生产环境,我就会根据自己的需要不断更改它。
引言
开发人员的时间就是金钱。 本指南是 C# 开发人员快速入门比特币的理想选择。
我正在开发一个名为 HiddenWallet 的比特币钱包。 HiddenBitcoin 库是在 NBitcoin 和我的用户界面之间引入的另一个抽象层。
在本三部分教程结束时,您将能够构建一个比特币钱包。
引用
虽然对 API 进行编程可以帮助快速启动应用程序,但开发人员受到针对 API 进行创新的限制。
Nicolas Dorier,比特币核心开发人员,NBitcoin 的创建者,C# 比特币库。 在使用我的高级 API 时,请记住此引言。
他也是 C# 比特币书籍 的主要作者,我是它的合著者。
有多高级? 我认为,GUI 开发人员、设计师不应该犯太多错误。 他们不应该了解输入、输出和 scriptpubkeys。 他们应该坚持地址、私钥和钱包级别。 此外,NBitcoin 应该被完全抽象出来。
如果您熟悉 NBitcoin,您可以在 C# 比特币书籍中找到本教程的更深层次版本,作为案例研究。
监控您的钱包
1. 设置您的 Safe
正如您在前一课中学到的,创建一个将被监控的 safe。
Network network = Network.TestNet;
Safe safe = Safe.Create(out mnemonic, "password", "Hidden.wallet", network);
或者如果它已经创建,则加载它
Safe safe = Safe.Load("password", walletFilePath);
2. 创建一个 SafeMonitor
var safeMonitor = new HttpSafeMonitor(safe, addressCount: 1000);
这将在 QBitNinja 上注册前 1000 个地址。
使用 HTTP,存在隐私问题,因为 HTTP API 知道哪些地址在 Safe 中。
这些问题可以通过使用 SPV 或完整节点来解决。 它们的实现预计将在未来进行。
3. 进行一些交易
检索一些地址并将一些测试网币发送到它们,这样就会有一些东西需要监控。 您可以轻松获得测试网币,只需 Google 一下即可。
Console.WriteLine(safeMonitor.Safe.GetAddress(0));
Console.WriteLine(safeMonitor.Safe.GetAddress(10));
Console.WriteLine(safeMonitor.Safe.GetAddress(999));
4. 关注初始化进度
我提供了一些事件,可以帮助您检查 QBitNinja 和您的 Monitor 之间是否已正确同步。
// Report initialization progress
safeMonitor.InitializationStateChanged += delegate(object sender, EventArgs args)
{
var monitor = (HttpSafeMonitor) sender;
Console.WriteLine($"Initialization state: {monitor.InitializationState}");
};
safeMonitor.InitializationProgressPercentChanged += delegate(object sender, EventArgs args)
{
var monitor = (HttpSafeMonitor) sender;
Console.WriteLine($"Initializing: {monitor.InitializationProgressPercent}%");
};
// Let's wait until initialized
while (safeMonitor.InitializationState != State.Ready)
Thread.Sleep(100);
5. 获取余额
在后台,HttpSafeMonitor
不断保持自身同步。 延迟大约为 5 秒。
SafeBalanceInfo safeBalanceInfo = safeMonitor.SafeBalanceInfo;
Console.WriteLine($"Number of monitored addresses: {safeBalanceInfo.MonitoredAddressCount}");
Console.WriteLine($"Balance: {safeBalanceInfo.Balance}");
Console.WriteLine($"Confirmed: {safeBalanceInfo.Confirmed}");
Console.WriteLine($"Unconfirmed: {safeBalanceInfo.Unconfirmed}");
foreach (AddressBalanceInfo balanceInfo in safeBalanceInfo.AddressBalances)
{
if (balanceInfo.Balance != 0)
Console.WriteLine($"{balanceInfo.Address}: {balanceInfo.Balance}");
}
6. 获取 Safe 历史记录
您可以以非常相似的方式获取历史记录。
SafeHistory history = safeMonitor.SafeHistory;
Console.WriteLine("totalreceived: " + history.TotalReceived);
Console.WriteLine("totalspent: " + history.TotalSpent);
foreach (AddressHistoryRecord record in history.Records)
{
Console.WriteLine(record.Address + " " + record.Amount);
}
7. 监听更改
每当发生更改时,我都会为您提供一个事件。
safeMonitor.BalanceChanged += delegate(object sender, EventArgs args)
{
var monitor = (HttpSafeMonitor) sender;
Console.WriteLine($"Confirmed balance of safe: {monitor.SafeBalanceInfo.Confirmed}");
Console.WriteLine($"Unconfirmed balance of safe: {monitor.SafeBalanceInfo.Unconfirmed}");
Console.WriteLine(
$"TransacitonId: {monitor.SafeHistory.Records.OrderBy
(x => x.DateTime).Last().TransactionId}");
};
运行该软件,并将一些测试网币发送到其中一个地址,查看当交易传播和确认时,该事件如何触发。
下一步?
在下一部分中,我将为您提供花费资金的能力。
许可协议
如果您不喜欢我的教程或代码,您有义务进行瑟曦·兰尼斯特的耻辱游行。
此外,您死后,我将有权夺走您的灵魂。
历史
- 2016 年 6 月 19 日:初始版本