Tezos 트랜잭션에 대한 잘못된 서명
2 대답
- 투표
-
- 2020-04-24
동일한 서명에 해당하는 두 개의 유효한 EC 포인트가 있지만 일부 블록 체인은 가단성을 피하기 위해 두 EC 포인트 중 하나로 사용을 제한합니다 (=서명을 다른 서명 값으로 쉽게 변환 할 수 있으므로 개인 키에 대한 액세스 권한이없는 다른 트랜잭션 ID를 갖는 두 번째 유효한 트랜잭션).
편집 : 해당하는 유효한 거래는 다음과 같습니다.
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
공개 키를 한 번만 공개하고 카운터를 올바르게 삽입했는지 확인하세요.
또한 Netezos ,C # Tezos SDK를 살펴보세요. 다음은 거래를 위조,서명 및 전송하는 방법의 예입니다.
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과 발신자 주소 [link] (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:49 UTC`의 카운터`..72`,`..73`을 사용하는mempool 작업에서 두 번 실패한 것입니다.귀하의 질문에 나는 동일한 카운터가있는 JSON을 보지만 https://tzkt.io/BKiXcfN1ZTXnNNbTWSRArSWzVFc6om7radWq5mTqGX6rY4P2Uhe-`12:55:12 UTC`에서.따라서 이미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
저는 C #으로 Tezos를위한 완전한 맞춤형 지갑 소프트웨어를 작성하고 있으며 다음과 같은 원시 트랜잭션을 받았습니다.
UnsignedHex : <엠> 008f1d96e2783258ff663f03dacfe946c026a5d194c73d1987b3da73fadea7d46b01549a0cde570a49b9200680341a6c78e87635480f940adc85a001f44eac02010238244743822921db1661fc7306c3044faac1e373906fdb5582d9454352b3b31c6c01549a0cde570a49b9200680341a6c78e87635480ff00bdd85a0018452ac02e0a712000153957451d3cc83a71e26b65ea2391a1b16713d2d00
HashPreimage : <엠> 03008f1d96e2783258ff663f03dacfe946c026a5d194c73d1987b3da73fadea7d46b01549a0cde570a49b9200680341a6c78e87635480f940adc85a001f44eac02010238244743822921db1661fc7306c3044faac1e373906fdb5582d9454352b3b31c6c01549a0cde570a49b9200680341a6c78e87635480ff00bdd85a0018452ac02e0a712000153957451d3cc83a71e26b65ea2391a1b16713d2d00
해시 : 8541434de6c77aaa3e6a4d4e341717a5c96b14e990183fd33e8157ef53f38579
서명 : <엠> 008f1d96e2783258ff663f03dacfe946c026a5d194c73d1987b3da73fadea7d46b01549a0cde570a49b9200680341a6c78e87635480f940adc85a001f44eac02010238244743822921db1661fc7306c3044faac1e373906fdb5582d9454352b3b31c6c01549a0cde570a49b9200680341a6c78e87635480ff00bdd85a0018452ac02e0a712000153957451d3cc83a71e26b65ea2391a1b16713d2d0049ff4a47599e0c65447182eca4c900893a74de3ca24c26708fc9d4bf79891ca384b0d5f98618bc3acec4f0c6bffd002de6fd839a418f47e83404aed285fc0235
RPC 노드에 서명 된 원시 트랜잭션 ( 'Signed')을 삽입하려고하면 다음과 같은 응답이 표시됩니다.
[
{
"kind": "임시",
"id": "실패",
"msg": "oozXCEKTUFcw8PHcrskvuWphiH1kNz12eohX1mp8AKinJU9fPYS 작업을 적용하는 동안 오류가 발생했습니다. \n 거부되었습니다 (오류 : \n 작업 서명이 잘못되었습니다 \n)"
}
]
제 3 자 도구에 대해 거래의 서명 (secp256k1)을 확인할 수 있으며 확인합니다 (순전히 '해시'값이 올바르게 서명되었는지). 노드 rpc 'Forge'엔드 포인트를 사용하여 다음 JSON으로 올바른 직렬화를 확인했습니다.
{ "branch": "BKiXcfN1ZTXnNNbTWSRArSWzVFc6om7radWq5mTqGX6rY4P2Uhe",
"내용": [{
"종류": "공개",
"fee": "1300",
"gas_limit": "10100",
"storage_limit": "300",
"public_key": "sppk7ZjMvKgUwnjYZKoQEYaNhorr1NJxmqgHLjExsP3uq98XKChFius",
"카운터": "2622172",
"source": "tz2G2Zy3sgYCuh1EQqrx9Q62CcpSkgcLPPDt"},{
"종류": "거래",
"fee": "1520",
"gas_limit": "10500",
"storage_limit": "300",
"amount": "300000",
"카운터": "2622173",
"destination": "tz2FwBnXhuXvPAUcr1aF3uX84Z6JELxrdYxD",
"source": "tz2G2Zy3sgYCuh1EQqrx9Q62CcpSkgcLPPDt"}]
}
또한 UnsignedRaw=> Python 코드로 해시를 확인할 수있었습니다.
거의 잘못된 오류 메시지 인 것 같습니다. 누구든지 내 거래의 문제가 무엇인지 알아낼 수 있습니까?
P.s. 동일한 소프트웨어와 두 번째 실행에 나는 완전히 유효한 트랜잭션을 생성 할 수 있었다 : 007fc1ecd6a56046aaaeab78bbfa1c889eb8f502b66c720bf1ac3b40ee9ecf6d6b01549a0cde570a49b9200680341a6c78e87635480f940adc85a001f44eac02010238244743822921db1661fc7306c3044faac1e373906fdb5582d9454352b3b31c6c01549a0cde570a49b9200680341a6c78e87635480ff00bdd85a0018452ac02c09a0c000153957451d3cc83a71e26b65ea2391a1b16713d2d00231176ec0cf55e3f04d5de633c33b38a6370ad2c37fd31c4c45e12ec9f1466753c8137f5dee8105bd5cc3d4ce780f51ec01d5adb21893e75eef4b960189818a3
세 번째 실행은 다시 유효하지 않은 것으로 간주되었습니다.