【发布时间】:2022-08-14 15:22:06
【问题描述】:
我已经使用 HSM 作为私钥存储实现了签名交易, 但我遇到了一些错误!
var network = Network.TestNet;
var destination = BitcoinAddress.Create(receiverAddress, network);
var sender = BitcoinAddress.Create(senderAddress, network);
var unspentCoins = (await GetUnSpentCoins(senderAddress, network));
var builder = network.CreateTransactionBuilder();
var tx = builder
.AddCoins(unspentCoins)
.Send(destination, Money.Coins(0.00001M))
.SubtractFees()
.SendEstimatedFees(new FeeRate(1m))
.SetChange(sender.ScriptPubKey)
.BuildTransaction(false);
var wallet = HSMWallet.Load(walletName);
var signedTx = wallet.SignTransaction(tx.ToHex());
var pubKey = new NBitcoin.PubKey(wallet.PubKey.RawPubKey);
var signature = new TransactionSignature(Encoders.Hex.DecodeData(signedTx));
builder
.AddKnownSignature(pubKey, signature, unspentCoins[0].Outpoint)
.SetSigningOptions(SigHash.All);
builder.SignTransactionInPlace(tx);
var error = builder.Check(tx);
var verify = builder.Verify(tx);
if (verify)
{
var result = await BroadcastTransaction(tx.ToHex(), Settings.BlockcypherToken, network);
return result;
}
在检查方法(builder.Check(tx)) 我得到两个错误:
- {输入 0 (SigHashType) 上的脚本错误}
- {费用太低,实际为 0.00000226,保单最低为 0.00000258}
我使用 PKCS11Introp.Net 并连接到 Utimaco HSM 以生成密钥对和签名操作:
public string SignTransaction(string hex)
{
var mechanism = Session.Factories.MechanismFactory.Create(CKM.CKM_ECDSA);
var dataHash = Digest(Digest(Convert.FromHexString(hex), CKM.CKM_SHA256), CKM.CKM_SHA256);
var signature = Session.Sign(mechanism, PrivateKeyHandle, dataHash);
Session.Verify(mechanism, PublicKeyHandle, dataHash, signature, out bool isValid);
if (isValid == false)
throw new Exception(\"error in signing transaction!\");
return ConvertUtils.BytesToHexString(ConstructEcdsaSigValue(signature));
}
我怎样才能使这项工作? 非常感谢
标签: c# bitcoin sign pkcs#11 hsm