你不会想知道我花了多少时间来解决这个问题。
我正在尝试通过 Terra Pisco/Rebel1 Api 向 Cosmos 区块链发送广播。
LUNA2:https://pisco-lcd.terra.dev/swagger/#/
LUNC:https://rebel1.grouptwo.org/swagger/#/
当我运行模拟Api时,交易完美运行。 但是,当我仅通过标准 api 运行事务时,它会失败并出现“签名验证失败”错误。 此问题与传递给 Cosmos 的签名不包含正确的 Chain-Id 或序列号有关。不过我已经确认base64有它。根据 Cosmos SDK 支持团队的说法,发送的所有有效负载都是正确的(Protobuf 和 Rest JSON)。
我在下面的 cosmos-sdk 存储库中生成了一个问题(它包含所有详细信息、模型、dtos、protos,我通过了 cosmos): https://github.com/cosmos/cosmos-sdk/issues/14789
我已经根据terra-money的terra.js库验证了Protobuf数据 https://github.com/terra-money/terra.js。而且数据看起来是正确的。
我还确认签名包含正确的 Chain-Id 和序列号。
这个问题与我当前正在构建的C# SDK有关。它允许用户将 Tx 数据广播到 Terra (Cosmos)。 如果您想生成 PR,请点击以下链接:
根据您的问题描述,问题似乎与交易签名的数据准备不正确有关。以下是确保正确传递所有必要数据进行签名的几个步骤:
SignerData{
ChainID: networkId,
AccountNumber: accountNumber,
Sequence: sequence,
PubKey: pubKey,
Address: sdk.AccAddress(pubKey.Address()).String(),
Address: addressBech32,
}
sigData := signing.SingleSignatureData{
SignMode: signMode,
Signature: nil,
}
sig := signing.SignatureV2{
PubKey: pubKey,
Data: &sigData,
Sequence: sequence,
}
sigs := []signing.SignatureV2{sig}
txBuilder.SetSignatures(sigs...)
注意,在上述方法中,在签名之前也准备了一些数据,您可以看到。实际签名是在方法末尾使用 keybase.Sign 完成的,其中 keybase 是 keyring。