【问题标题】:Error Getting Address from GetAddress - Trezor Development从 GetAddress 获取地址时出错 - Trezor 开发
【发布时间】:2017-12-27 10:05:28
【问题描述】:

我正在为 Trezor 构建一个 C# HID 库。它运作良好。我能够越过 pin 条目并检索我的 xpub,并且可以获得地址。但是,返回的地址与我在 Trezor 钱包网站上的任何地址都不匹配。

您可以在此处查看 HID 文档: https://doc.satoshilabs.com/trezor-tech/api-workflows.html#passphrase-meta-workflow

这不是一个真正的 C# 问题。相反,对于任何 Trezor HID 开发人员来说,这是一个普遍的问题。最大的问题是,如果我将 HDNodePathType 消息作为 GetAddress 方法的 Multisig 属性传递,我会收到错误“无法编码地址”。 我需要通过 GetAddress 消息传递什么来获取有效地址?

这是一个 Android 代码库: https://github.com/trezor/trezor-android

【问题讨论】:

  • 通常,您的第一个地址的路径应该比您的xpub 的路径长 4 个字节。典型的xpub 路径是m/44'/0'/0',而典型的地址路径看起来像m/44'/0'/0'/0/0xpub 会创建完整的地址,例如 xpub/0/0 。所以...您确定要确保在 C# 上创建的路径与网站中的路径字节相同。使用 python 库可以完成最简单的低级 Trezor 测试。
  • 另外...确保您可以使用 python 库获得与网络钱包匹配的地址。然后调试您输入 python 的路径,以尝试匹配您在 C# 中获得的路径。一个可以想象的错误是字符'/ 的不需要的字符串转义。我假设这已经检查过了。顺便说一句...您可以使用xprvload-device。这可能有助于关联路径和 xpub。

标签: c# blockchain bitcoin hid trezor


【解决方案1】:

这个问题现在已经解决了。 Trezor.Net 有一个工作示例可以克隆here

这是获取地址的code

public async Task<string> GetAddressAsync(IAddressPath addressPath, bool isPublicKey, bool display, AddressType addressType, InputScriptType inputScriptType, string coinName)
{
    try
    {
        var path = addressPath.ToArray();

        if (isPublicKey)
        {
            var publicKey = await SendMessageAsync<PublicKey, GetPublicKey>(new GetPublicKey { CoinName = coinName, AddressNs = path, ShowDisplay = display, ScriptType = inputScriptType });
            return publicKey.Xpub;
        }
        else
        {
            switch (addressType)
            {
                case AddressType.Bitcoin:

                    //Ultra hack to deal with a coin name change in Firmware Version 1.6.2
                    if ((Features.MajorVersion <= 1 && Features.MinorVersion < 6) && coinName == "Bgold")
                    {
                        coinName = "Bitcoin Gold";
                    }

                    return (await SendMessageAsync<Address, GetAddress>(new GetAddress { ShowDisplay = display, AddressNs = path, CoinName = coinName, ScriptType = inputScriptType })).address;

                case AddressType.Ethereum:

                    var ethereumAddress = await SendMessageAsync<EthereumAddress, EthereumGetAddress>(new EthereumGetAddress { ShowDisplay = display, AddressNs = path });

                    var sb = new StringBuilder();
                    foreach (var b in ethereumAddress.Address)
                    {
                        sb.Append(b.ToString("X2").ToLower());
                    }

                    var hexString = sb.ToString();

                    return $"0x{hexString}";
                default:
                    throw new NotImplementedException();
            }
        }
    }
    catch (Exception ex)
    {
        Logger?.Log("Error Getting Trezor Address", LogSection, ex, LogLevel.Error);
        throw;
    }
}

【讨论】:

    猜你喜欢
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 2018-05-08
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多