65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (4投票s)

2016 年 6 月 19 日

公共领域

3分钟阅读

viewsIcon

19288

C# 比特币钱包开发的快速入门

目录

重要提示

如果您想在生产环境中使用它,请与我联系。 只要没有人将其用于生产环境,我就会根据自己的需要不断更改它。

引言

开发人员的时间就是金钱。 本指南是 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 日:初始版本
© . All rights reserved.