Tezosトランザクションの署名が無効です
2 回答
- 投票
-
- 2020-04-24
同じ署名に対応する2つの有効なECポイントがありますが、一部のブロックチェーンでは、可鍛性を回避するために、使用をこれら2つのECポイントの1つに制限しています(=署名を他の署名値に変換して作成するのは簡単です)秘密鍵にアクセスせずに異なるトランザクションIDを持つ2番目の有効なトランザクション).
編集: 対応する有効なトランザクションは次のとおりです.
008f1d96e2783258ff663f03dacfe946c026a5d194c73d1987b3da73fadea7d46b01549a0cde570a49b9200680341a6c78e87635480f940adc85a001f44eac02010238244743822921db1661fc7306c3044faac1e373906fdb5582d9454352b3b31c6c01549a0cde570a49b9200680341a6c78e87635480ff00bdd85a0018452ac02e0a712000153957451d3cc83a71e26b65ea2391a1b16713d2d0049ff4a47599e0c65447182eca4c900893a74de3ca24c26708fc9d4bf79891ca384b0d5f98618bc3acec4f0c6bffd002de6fd839a418f47e83404aed285fc0235
これは、再署名せず、秘密鍵にアクセスせずに作成されました.There are two valid EC points that correspond to the same signature, but some blockchains restrict the usage to one of those two EC points to avoid malleability (= it is easy to convert the signature to the other signature value, and thus create a second valid transaction which would have a different transaction id without haveing access to the private key).
Edit: The corresponding valid transaction is:
008f1d96e2783258ff663f03dacfe946c026a5d194c73d1987b3da73fadea7d46b01549a0cde570a49b9200680341a6c78e87635480f940adc85a001f44eac02010238244743822921db1661fc7306c3044faac1e373906fdb5582d9454352b3b31c6c01549a0cde570a49b9200680341a6c78e87635480ff00bdd85a0018452ac02e0a712000153957451d3cc83a71e26b65ea2391a1b16713d2d0049ff4a47599e0c65447182eca4c900893a74de3ca24c26708fc9d4bf79891ca384b0d5f98618bc3acec4f0c6bffd002de6fd839a418f47e83404aed285fc0235
This was created without re-signing and without access to the private key. -
- 2020-04-19
公開鍵を1回だけ公開し、カウンターを適切に挿入していることを確認してください.
また、 Netezos 、C#TezosSDKもご覧ください.トランザクションを偽造、署名、送信する方法の例を次に示します.
var key = Key.FromBase58("edskS9DjUKo8ogBBU8LeU..."); var rpc = new TezosRpc("https://rpc.tzkt.io/carthagenet/"); var head = await rpc.Blocks.Head.Hash.GetAsync<string>(); var counter = await rpc.Blocks.Head.Context.Contracts[key.PubKey.Address].Counter.GetAsync<int>(); var forge = new LocalForge(); var bytes = await forge.ForgeOperationAsync(head, new TransactionContent { Source = key.PubKey.Address, Counter = ++counter, Fee = 10_000, GasLimit = 20_000, StorageLimit = 20_000, Amount = 1_000_000, Destination = "tz1KhnTgw...", }); var sig = key.Sign(new byte[] { 3 }.Concat(bytes).ToArray()); var op = bytes.Concat(sig.ToBytes()).ToArray(); var tx = await rpc.Inject.Operation.PostAsync(Hex.Convert(op));
Netezosでも機能しない場合は、RPCノードが同期されて最新であるかどうかを確認してください.
Make sure you revealed public key just once and make sure you properly incement counter.
Also, take a look at Netezos, C# Tezos SDK. Here is an example of how to forge, sign and send a transaction:
var key = Key.FromBase58("edskS9DjUKo8ogBBU8LeU..."); var rpc = new TezosRpc("https://rpc.tzkt.io/carthagenet/"); var head = await rpc.Blocks.Head.Hash.GetAsync<string>(); var counter = await rpc.Blocks.Head.Context.Contracts[key.PubKey.Address].Counter.GetAsync<int>(); var forge = new LocalForge(); var bytes = await forge.ForgeOperationAsync(head, new TransactionContent { Source = key.PubKey.Address, Counter = ++counter, Fee = 10_000, GasLimit = 20_000, StorageLimit = 20_000, Amount = 1_000_000, Destination = "tz1KhnTgw...", }); var sig = key.Sign(new byte[] { 3 }.Concat(bytes).ToArray()); var op = bytes.Concat(sig.ToBytes()).ToArray(); var tx = await rpc.Inject.Operation.PostAsync(Hex.Convert(op));
If it doesn't work even with Netezos, check if your RPC node is synced and up to date.
-
元の質問のJSONと送信者アドレス[リンク](https://tezos.id/accounts/tz2G2Zy3sgYCuh1EQqrx9Q62CcpSkgcLPPDt)のステータスに基づいて、カウンターとリビールは問題ないように見えますか?Based on the JSON in the original question and the status of the sender address [link](https://tezos.id/accounts/tz2G2Zy3sgYCuh1EQqrx9Q62CcpSkgcLPPDt), does counter & reveal look ok?
- 0
- 2020-04-20
- Felix Laufenberg
-
mempool https://tzkt.io/tz2G2Zy3sgYCuh1EQqrx9Q62CcpSkgcLPPDt/operationsで失敗した操作など、より有用な情報が表示されるため、TzKTエクスプローラーを使用することをお勧めします.したがって、私が見ているのは、 `12:01:49UTC`からのカウンター` ..72`、 `..73`を使用したmempool操作で2つ失敗したことです.あなたの質問では、同じカウンターを持つJSONが表示されますが、ブランチhttps://tzkt.io/BKiXcfN1ZTXnNNbTWSRArSWzVFc6om7radWq5mTqGX6rY4P2Uhe-from `12:55:12UTC`です.したがって、すでにmempoolにあるカウンター `..72`、` ..73`を使用して操作を送信しようとしたと思います.I suggest you use TzKT explorer, because it shows more useful info, including operations failed in mempool https://tzkt.io/tz2G2Zy3sgYCuh1EQqrx9Q62CcpSkgcLPPDt/operations. So, what I see is two failed in mempool operations with counters `..72`, `..73` from `12:01:49 UTC`. In your question I see JSON with the same counters BUT with the branch https://tzkt.io/BKiXcfN1ZTXnNNbTWSRArSWzVFc6om7radWq5mTqGX6rY4P2Uhe - from `12:55:12 UTC`. So, I assume that you tried to send the operations with the counters `..72`, `..73` which had already been in mempool.
- 1
- 2020-04-20
- Groxan
-
一般的に、JSONは問題ないように見えますが、mempoolで失敗した「クローン」があったという事実により、説明したエラーが発生する可能性があります.Generally speaking, your JSON looks fine, but the fact that there were failed "clones" in the mempool may cause the error you described.
- 0
- 2020-04-20
- Groxan
-
迅速な対応に感謝致します.mempool内のトランザクションは、私が参照していた成功したトランザクションですが、ブランチが古くなっているため無効になりました.将来のトランザクションをブロックすると、アカウントが完全にブロックされ、Tezosノードで重大なバグが発生するはずです.、それがエラーの原因ではないと思います.Thanks for the quick response. The transaction in the mempool is the successfull transaction that I was referring to, however it is now invalid because the branch is outdated, if that were to block future transactions it would complete block the account and should be rendered a critical bug in the Tezos node, so I don't think that it should be the cause of the error.
- 0
- 2020-04-20
- Felix Laufenberg
-
残念ながら、HSMから署名を取得し、秘密鍵にアクセスできないため、Netezosで署名をテストすることはできません.Unfortunately I won't be able to test signing with Netezos since I retrieve the signature from an HSM and can not get access to the private key.
- 0
- 2020-04-21
- Felix Laufenberg
Tezos用の完全なカスタムウォレットソフトウェアをC#で作成していて、次の生のトランザクションを取得しました:
UnsignedHex: の008f1d96e2783258ff663f03dacfe946c026a5d194c73d1987b3da73fadea7d46b01549a0cde570a49b9200680341a6c78e87635480f940adc85a001f44eac02010238244743822921db1661fc7306c3044faac1e373906fdb5582d9454352b3b31c6c01549a0cde570a49b9200680341a6c78e87635480ff00bdd85a0018452ac02e0a712000153957451d3cc83a71e26b65ea2391a1b16713d2d00 の
HashPreimage: の03008f1d96e2783258ff663f03dacfe946c026a5d194c73d1987b3da73fadea7d46b01549a0cde570a49b9200680341a6c78e87635480f940adc85a001f44eac02010238244743822921db1661fc7306c3044faac1e373906fdb5582d9454352b3b31c6c01549a0cde570a49b9200680341a6c78e87635480ff00bdd85a0018452ac02e0a712000153957451d3cc83a71e26b65ea2391a1b16713d2d00 の
ハッシュ: 8541434de6c77aaa3e6a4d4e341717a5c96b14e990183fd33e8157ef53f38579
署名済み: の008f1d96e2783258ff663f03dacfe946c026a5d194c73d1987b3da73fadea7d46b01549a0cde570a49b9200680341a6c78e87635480f940adc85a001f44eac02010238244743822921db1661fc7306c3044faac1e373906fdb5582d9454352b3b31c6c01549a0cde570a49b9200680341a6c78e87635480ff00bdd85a0018452ac02e0a712000153957451d3cc83a71e26b65ea2391a1b16713d2d0049ff4a47599e0c65447182eca4c900893a74de3ca24c26708fc9d4bf79891ca384b0d5f98618bc3acec4f0c6bffd002de6fd839a418f47e83404aed285fc0235 の
ノードrpcで未加工の署名済みトランザクション(「署名済み」)を挿入しようとすると、次の応答が返されます.
[
{
「種類」:「一時的」、
"id": "failure"、
"msg": "操作oozXCEKTUFcw8PHcrskvuWphiH1kNz12eohX1mp8AKinJU9fPYSの適用中にエラーが発生しました:\n拒否されました(エラー:\n操作の署名が無効です\n)"
}
]
トランザクションの署名(secp256k1)をサードパーティのツールと照合して検証できます(つまり、「ハッシュ」値が正しく署名されていることを確認します).node rpc'Forge 'エンドポイントを使用して、次のJSONで正しいシリアル化を確認しました:
{"branch": "BKiXcfN1ZTXnNNbTWSRArSWzVFc6om7radWq5mTqGX6rY4P2Uhe"、
「コンテンツ」:[{
"種類": "明らかに"、
"料金": "1300"、
"gas_limit": "10100"、
"storage_limit": "300"、
"public_key": "sppk7ZjMvKgUwnjYZKoQEYaNhorr1NJxmqgHLjExsP3uq98XKChFius"、
"カウンター": "2622172"、
"ソース": "tz2G2Zy3sgYCuh1EQqrx9Q62CcpSkgcLPPDt"}、{
"種類": "トランザクション"、
"料金": "1520"、
"gas_limit": "10500"、
"storage_limit": "300"、
"金額": "300000"、
"カウンター": "2622173"、
"宛先": "tz2FwBnXhuXvPAUcr1aF3uX84Z6JELxrdYxD"、
"ソース": "tz2G2Zy3sgYCuh1EQqrx9Q62CcpSkgcLPPDt"}]
}
また、UnsignedRaw=>ハッシュをPythonコードで検証することもできました:
それはほとんど悪いエラーメッセージのようです.誰かが私の取引の問題が何であるかを理解するのを手伝ってくれますか?
P.s. の007fc1ecd6a56046aaaeab78bbfa1c889eb8f502b66c720bf1ac3b40ee9ecf6d6b01549a0cde570a49b9200680341a6c78e87635480f940adc85a001f44eac02010238244743822921db1661fc7306c3044faac1e373906fdb5582d9454352b3b31c6c01549a0cde570a49b9200680341a6c78e87635480ff00bdd85a0018452ac02c09a0c000153957451d3cc83a71e26b65ea2391a1b16713d2d00231176ec0cf55e3f04d5de633c33b38a6370ad2c37fd31c4c45e12ec9f1466753c8137f5dee8105bd5cc3d4ce780f51ec01d5adb21893e75eef4b960189818a3 の
:私は完全に有効なトランザクションを生成することができた同じソフトウェアを使用してセカンドランで3回目の実行は再び無効と見なされました.