签名验证失败;请验证账号和chain-id:未经授权

问题描述 投票:0回答:1

你不会想知道我花了多少时间来解决这个问题。

我正在尝试通过 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

  1. 我已经根据terra-money的terra.js库验证了Protobuf数据 https://github.com/terra-money/terra.js。而且数据看起来是正确的。

  2. 我还确认签名包含正确的 Chain-Id 和序列号。

这个问题与我当前正在构建的C# SDK有关。它允许用户将 Tx 数据广播到 Terra (Cosmos)。 如果您想生成 PR,请点击以下链接:

https://github.com/TerraMystics/terra-sharp

c# blockchain terra cosmos-sdk
1个回答
0
投票

根据您的问题描述,问题似乎与交易签名的数据准备不正确有关。以下是确保正确传递所有必要数据进行签名的几个步骤:

  1. 初步检查:确保当您签署交易时,您传递的字节数与使用其他工作方法时相同。这将有助于消除数据准备中可能出现的错误。
  2. 传递所有必要的数据:确保SignerData包含所有必填字段(并非全部必填):

    SignerData{
        ChainID:       networkId,
        AccountNumber: accountNumber,
        Sequence:      sequence,
        PubKey:        pubKey,
        Address:       sdk.AccAddress(pubKey.Address()).String(),
        Address:       addressBech32,
    }

  1. 除了SignerData之外,使用正确的SignModeSequence传递SignatureV2也很重要。示例:
sigData := signing.SingleSignatureData{
    SignMode:  signMode,
    Signature: nil,
}
sig := signing.SignatureV2{
    PubKey:   pubKey,
    Data:     &sigData,
    Sequence: sequence,
}
sigs := []signing.SignatureV2{sig}
txBuilder.SetSignatures(sigs...)
  1. 签名数据: 请考虑 github.com/cosmos/cosmos-sdk/client/txSign 方法中的签名过程。这将使您深入了解要签名的数据及其准备的要求。 https://github.com/cosmos/cosmos-sdk/blob/7628592c6a1fbefdff0afa71e89f08b147a02977/client/tx/tx.go#L251-L361

注意,在上述方法中,在签名之前也准备了一些数据,您可以看到。实际签名是在方法末尾使用 keybase.Sign 完成的,其中 keybasekeyring

© www.soinside.com 2019 - 2024. All rights reserved.