거래가 실패한 이유를 어떻게 이해할 수 있습니까?
1 대답
- 투표
-
- 2019-02-02
실패한 트랜잭션을 감지하고 사전 신청 (RPC)에서 오류 코드를 반환해야합니다. 이 트랜잭션이 주입되었으므로 지갑의 버그 또는 잘못된 오류 처리를 나타냅니다. 이 거래가 실패한 이유를 쉽게 알 수 있습니다. 잔액 전액을 보내려고했지만 소각을 감당할 자금이 충분하지 않습니다.
RPC를 사용하여 메타 데이터를 가져올 수 있습니다. 이 예에서는 레벨
입니다.296452
에서 오피시를 확인합니다. 원래 링크에서 관심이있는 ophash는onuEbjVrbaXtn4iK8KFzc4a8xTkfkyAfxiNE698SLm3MtnimdUs
블록에 관한 전체 정보는 다음에서 액세스 할 수 있습니다.
https://rpc.tezrpc.me/chains/main/blocks/296452
더 쉽게 관심있는 특정 작업을 필터링 할 수 있습니다. 작업은 2 개의 값으로 색인이 생성됩니다. 첫 번째 인덱스는 지갑에서 수행되는 작업의 경우 항상 3입니다.
https://rpc.tezrpc.me/chains/main/blocks/296452 /operation_hashes/3
[ "ooeujV9F66p54xzKL3d8UgsdriAPwqroipLZRdVXVJKpD6oAMJA","onuEbjVrbaXtn4iK8KFzc4a8xTkfkyAfxiNE698SLm3MtnimdUs"]
여기서 두 번째 작업 해시 (인덱스 1)는 우리가 관심을 갖는 것이므로 위치 3/1에서 ophash를 찾을 수 있습니다.
https://rpc.tezrpc.me/chains/main/blocks/296452 /operation_hashes/3/1
"onuEbjVrbaXtn4iK8KFzc4a8xTkfkyAfxiNE698SLm3MtnimdUs"
마지막으로
296452
블록과3/1
위치에서의 작업에 대한 rpc를 요청합니다.https://rpc.tezrpc.me/chains/main/blocks/296452 /operations/3/1
<사전> <코드> { "프로토콜": "PsddFKi32cMJ2qPjf43Qv5GDWLDPZb3T3bF6fLKiF5HtvHNU7aP", "chain_id": "NetXdQprcVkpaWU", "hash": "onuEbjVrbaXtn4iK8KFzc4a8xTkfkyAfxiNE698SLm3MtnimdUs", "분기": "BMVq2BDfVH4Y3NdNa9Dr8smiHHkFkFqiD7qRKT9SH6TH4zrr74M", "내용": [ { "종류": "거래", "source": "tz1eKsvd2G7QXsJvim5ZBYhxnuN7SJLe2phy", "수수료": "1420", "카운터": "302028", "gas_limit": "10300", "storage_limit": "300", "금액": "1681485669", "destination": "tz1MNEqXdtu8YT4ppF5tRJ7PLS8vRZJ19FRQ", "metadata": { "balance_updates": [ { "종류": "계약", "contract": "tz1eKsvd2G7QXsJvim5ZBYhxnuN7SJLe2phy", "변경": "-1420" }, { "kind": "냉동고", "category": "수수료", "delegate": "tz1Yju7jmmsaUiG9qQLoYv35v5pHgnWoLWbt", "레벨": 72, "변경": "1420" } ], "operation_result": { "status": "역 추적 됨", "오류": [ { "종류": "임시", "id": "proto.003-PsddFKi3.contract.cannot_pay_storage_fee" }, { "kind": "영구", "id": "proto.003-PsddFKi3.context.storage_error", "missing_key": [ "계약", "인덱스", "ed25519", "cc", "fb", "95", "87", "2a", "59f77f5729e9376bcb315e917e322e", "밸런스" ], "기능": "가져 오기" } ], "잔액 _ 업데이트": [ { "종류": "계약", "contract": "tz1eKsvd2G7QXsJvim5ZBYhxnuN7SJLe2phy", "변경": "-1681485669" }, { "종류": "계약", "contract": "tz1MNEqXdtu8YT4ppF5tRJ7PLS8vRZJ19FRQ", "변경": "1681485669" }, { "종류": "계약", "contract": "tz1eKsvd2G7QXsJvim5ZBYhxnuN7SJLe2phy", "변경": "-257000" } ], "consumed_gas": "10260", "allocated_destination_contract":true } } } ], "signature": "sigS5LzsJh9wuk4vniGtB2xn8jiFgBjVujd3nrWXVSZhigQhKwm7scVoEVgWmGSrqPq5uM3frp6b1dBZYzfnhAYTiSv1YEw5" }첫 번째 오류 코드는
입니다.proto.003-PsddFKi3.contract.cannot_pay_storage_fee
Failed transactions should be detected and get an error code returned in the preapply (RPC). So that this transaction even have been injected indicate a bug or bad error handling in a wallet. It is very easy to see why this transaction failed. It tried to send the full balance and wont have enough funds to cover the burn.
You can use the rpc to get the metadata. In this example you would check the ophashes on level
296452
. The ophash we are interested in from your original link isonuEbjVrbaXtn4iK8KFzc4a8xTkfkyAfxiNE698SLm3MtnimdUs
The entire information regarding the block can be accessed at
https://rpc.tezrpc.me/chains/main/blocks/296452
To make it easier we can filter out the specific operation we are interested in. Operations are indexed by 2 values. The first index will always be 3 for operations done from a wallet.
https://rpc.tezrpc.me/chains/main/blocks/296452/operation_hashes/3
["ooeujV9F66p54xzKL3d8UgsdriAPwqroipLZRdVXVJKpD6oAMJA","onuEbjVrbaXtn4iK8KFzc4a8xTkfkyAfxiNE698SLm3MtnimdUs"]
The second operation hash (index 1) here is the one we are interested in, so we'll find your ophash at location 3/1.
https://rpc.tezrpc.me/chains/main/blocks/296452/operation_hashes/3/1
"onuEbjVrbaXtn4iK8KFzc4a8xTkfkyAfxiNE698SLm3MtnimdUs"
Finally we ask the rpc for block
296452
and the operation at location3/1
.https://rpc.tezrpc.me/chains/main/blocks/296452/operations/3/1
{ "protocol": "PsddFKi32cMJ2qPjf43Qv5GDWLDPZb3T3bF6fLKiF5HtvHNU7aP", "chain_id": "NetXdQprcVkpaWU", "hash": "onuEbjVrbaXtn4iK8KFzc4a8xTkfkyAfxiNE698SLm3MtnimdUs", "branch": "BMVq2BDfVH4Y3NdNa9Dr8smiHHkFkFqiD7qRKT9SH6TH4zrr74M", "contents": [ { "kind": "transaction", "source": "tz1eKsvd2G7QXsJvim5ZBYhxnuN7SJLe2phy", "fee": "1420", "counter": "302028", "gas_limit": "10300", "storage_limit": "300", "amount": "1681485669", "destination": "tz1MNEqXdtu8YT4ppF5tRJ7PLS8vRZJ19FRQ", "metadata": { "balance_updates": [ { "kind": "contract", "contract": "tz1eKsvd2G7QXsJvim5ZBYhxnuN7SJLe2phy", "change": "-1420" }, { "kind": "freezer", "category": "fees", "delegate": "tz1Yju7jmmsaUiG9qQLoYv35v5pHgnWoLWbt", "level": 72, "change": "1420" } ], "operation_result": { "status": "backtracked", "errors": [ { "kind": "temporary", "id": "proto.003-PsddFKi3.contract.cannot_pay_storage_fee" }, { "kind": "permanent", "id": "proto.003-PsddFKi3.context.storage_error", "missing_key": [ "contracts", "index", "ed25519", "cc", "fb", "95", "87", "2a", "59f77f5729e9376bcb315e917e322e", "balance" ], "function": "get" } ], "balance_updates": [ { "kind": "contract", "contract": "tz1eKsvd2G7QXsJvim5ZBYhxnuN7SJLe2phy", "change": "-1681485669" }, { "kind": "contract", "contract": "tz1MNEqXdtu8YT4ppF5tRJ7PLS8vRZJ19FRQ", "change": "1681485669" }, { "kind": "contract", "contract": "tz1eKsvd2G7QXsJvim5ZBYhxnuN7SJLe2phy", "change": "-257000" } ], "consumed_gas": "10260", "allocated_destination_contract": true } } } ], "signature": "sigS5LzsJh9wuk4vniGtB2xn8jiFgBjVujd3nrWXVSZhigQhKwm7scVoEVgWmGSrqPq5uM3frp6b1dBZYzfnhAYTiSv1YEw5" }
You will see that the first error code is
proto.003-PsddFKi3.contract.cannot_pay_storage_fee
거래 오류 코드?
무작위로 실패한 tzscan.io의 예제 트랜잭션 은 특정 오류 코드 .터미널 출력에 액세스하지 않고 알 수없는 노드에 의해 주입되었습니다.
오류가 어떻게 발생했는지 추적 할 수있는 방법이 있습니까? 이것은 단순히tzscan에 표시되지 않습니까?