我如何理解交易失败的原因?
1 个回答
- 投票数
-
- 2019-02-02
应该检测到失败的事务,并在预申请(RPC)中返回错误代码.因此,即使已注入此事务,也表明钱包中存在错误或错误处理错误.很容易看出为什么这个交易失败了.它试图将全部余额寄出,并且没有足够的资金来支付烧钱.
您可以使用rpc获取元数据.在此示例中,您将在
296452
级别上检查ophashes.我们从您的原始链接中获得的信息是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"
最后,我们要求rpc块
296452
和在位置3/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" }
您将看到第一个错误代码是
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中根本没有显示?