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");