Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NBitcoin抛出InvalidOperationException,并显示消息:“No No No modHFGen.dll;Mac HMACSHA256未被识别。”;_C#_.net_Bitcoin - Fatal编程技术网

C# NBitcoin抛出InvalidOperationException,并显示消息:“No No No modHFGen.dll;Mac HMACSHA256未被识别。”;

C# NBitcoin抛出InvalidOperationException,并显示消息:“No No No modHFGen.dll;Mac HMACSHA256未被识别。”;,c#,.net,bitcoin,C#,.net,Bitcoin,我在尝试签署交易时收到消息: Transaction payment = new Transaction(); BitcoinSecret PaymentSecret = new BitcoinSecret("1sXCvdpXz...UqkXW9mvT"); ... payment.Sign(Container.PaymentSecret, false); 我深入研究了开源的NBitcoin API,发现这些行给了我错误信息。我能做什么?() HMAC后面有一个连字符。HMAC-SHA256我

我在尝试签署交易时收到消息:

Transaction payment = new Transaction();
BitcoinSecret PaymentSecret = new BitcoinSecret("1sXCvdpXz...UqkXW9mvT");
...
payment.Sign(Container.PaymentSecret, false);
我深入研究了开源的NBitcoin API,发现这些行给了我错误信息。我能做什么?()


HMAC后面有一个连字符。HMAC-SHA256

我刚刚在我的机器上试过这个代码,它工作得非常好

public void CanSignSimple()
{
    Key bob = new Key();
    Transaction tx = new Transaction();
    tx.Inputs.Add(new TxIn()
    {
        ScriptSig = bob.ScriptPubKey
    });
    tx.Sign(bob, false);
}
应该注意的是,我现在没有使用Bouncy castle库。我在NBitcoin中复制了bouncycastle所需的部分。 您的bug看起来像是在使用NBitcoin和官方的BouncyCastle,只有您自己使用官方的BouncyCastle库重新编译了所有内容,或者您使用的是旧版本的NBitcoin,才会发生这种情况


您使用的是什么版本?

如果有人想知道到底发生了什么,下面是一段会导致错误的代码片段:

    string mechanism = "HMACSHA256";
    if (mechanism.StartsWith("HMAC"))
    {
        Console.WriteLine("good");
    }
    else
    {
        Console.WriteLine("bad");
    }
    Console.ReadLine();
如果设置mechanism=“HMAC-SHA256”,则不会发生错误。 如果您使用mechanism.StartsWith(“HMAC”,StringComparison.InvariantCulture),则不会发生错误

我还修复了github中的错误,并创建了一个对NBitcoin API的拉取请求,因此希望以后其他人不会出现这种情况。

问题出在这里:

NBitcoin/NBitcoin.BouncyCastle/security/MacUtilities.cs

机制字符串是“HMACSHA256”,if语句的计算结果对我来说永远不会为true,因为我的语言是匈牙利语,“CS”是匈牙利语的字母。因此,根据StartsWith函数,“HMACSHA256”在匈牙利语中不是以“HMAC”开头的

Nicolas Dorier在NBitcoin API中修复了该问题,将StringComparison.OrdinalIgnoreCase设置添加到StartWith函数中

如果有人想测试它,下面是Nicolas发来的电子邮件:

好的,历史

在匈牙利语中,v1为假,v2为真


这些都不是事实,我用的是NuGet的最新版本。我刚刚为自己构建了NBitcoin.dll。在
DeterministicECDSA.cs
file/
public DeterministicECDSA(String hashName)
函数中,如果我手动将
macName
变量改为
“HMAC-SHA256”
,它将起作用。在
hmac=MacUtilities.GetMac(macName)之前调试变量时,
macName
的值是多少行?你能运行我给你的代码吗?我刚刚创建了一个新项目,安装了nbitcoin并运行了代码,但没有复制您的bug。我的版本没有“-”,通过在MacUtilities中一步一步地执行,这是在NBitcoin源代码中,它可以正确地处理它。(HMACSHA256)从中,您可以看到我正确地处理了这两种情况,有破折号和没有破折号。一切似乎都是正确的。我一直在玩弄代码,我想如果(mechanism.StartsWith(“HMAC”))
由于某种原因不能像预期的那样工作。长话短说,这就解决了我的问题:
if(mechanism.StartsWith(“HMAC”,StringComparison.InvariantCulture))
。我已经在github上为原始项目创建了一个pull请求。我没有停止检查代码,也没有发现问题。。。看看我是如何从一个数组中提取“mechanism”的,其中所有内容都是大写的。我会接受你的PR,但我想先了解一下为什么它不起作用。我复制并粘贴了这段代码,它在我的机器上运行良好。请问你的语言是什么?这是一个非常有趣的错误。我在想,也许stackoverflow在这里发挥了一些魔力,但我创建了一个新项目,copypasted,错误仍然存在。我有匈牙利键盘,但我的计算机中的所有软件(windows、visualstudio)都是用英语运行的。我现在也在台湾,但那不重要。我已将我的
System.Threading.Thread.CurrentThread.CurrentUICulture
邮寄给您,希望对您有所帮助。
    string mechanism = "HMACSHA256";
    if (mechanism.StartsWith("HMAC"))
    {
        Console.WriteLine("good");
    }
    else
    {
        Console.WriteLine("bad");
    }
    Console.ReadLine();
public static IMac GetMac(string algorithm)
{
    ...
    if(mechanism.StartsWith("HMAC"))
    {
        ...
    }
    ...
}
Thread.CurrentThread.CurrentCulture = new CultureInfo("hu"); 
string mechanism = "HMACSHA256"; 
var v1 = mechanism.StartsWith("HMAC");

mechanism = "HMAC-SHA256"; 
var v2 = mechanism.StartsWith("HMAC");