2

使用方法查询归档节点的交易时,EXPERIMENTAL_tx_status有些交易没有。这怎么可能,该交易与其他交易有何不同?receiptsreceipts_outcome

如果我理解正确,receipts_outcome是应用的结果receipts。根据explorer的说法,这笔交易有Convert Transaction To Receipt一部分,所以应该会产生一些收据。

根据文档

收据是系统中唯一可操作的对象。当我们在 NEAR 平台上谈论“处理交易”时,这最终意味着在某个时候“应用收据”。

一个好的心智模型是将收据视为要在目的地(接收者)执行的付费消息。Transaction 是外部发出的创建 Receipt 的请求(存在 1 对 1 的关系)。

我的查询

{
  "jsonrpc": "2.0",
  "id": "2",
  "method": "EXPERIMENTAL_tx_status",
  "params": ["7beNxrbHxMRspJWT9NeEVwx719kVcmY9tRdPG9SYro26", "bumbleee99.near"]
}

回复

{
    "jsonrpc": "2.0",
    "result": {
        "status": {
            "SuccessValue": ""
        },
        "transaction": {
            "signer_id": "bumbleee99.near",
            "public_key": "ed25519:DFM5GRGbpNkk4XkhcFnRUFeKG8a3nzTH8NwZp754pC48",
            "nonce": 59080995000003,
            "receiver_id": "bumbleee99.near",
            "actions": [
                {
                    "AddKey": {
                        "public_key": "ed25519:CUoNs153GHrPZ9F8HpvhzFr1mwuUFUdGQsRNE2CTNjVH",
                        "access_key": {
                            "nonce": 0,
                            "permission": "FullAccess"
                        }
                    }
                }
            ],
            "signature": "ed25519:15v34qoyCHSvSL5uLcaPqD9vXvjcPrCaZVStCMms8e58C62z2UHiazwUXzHajPEgdHpwn7s4J9dd5UPmtvzbYgM",
            "hash": "7beNxrbHxMRspJWT9NeEVwx719kVcmY9tRdPG9SYro26"
        },
        "transaction_outcome": {
            "proof": [
                {
                    "hash": "ECKDm5FVhzit7Wqs9sEyBB9NtuTrVRZmWwcxkkg2yUh4",
                    "direction": "Right"
                },
                {
                    "hash": "E4VXdwsNj3fZCbP6y9YH3M5oZHPDcdArqU9kbZJa95Qp",
                    "direction": "Right"
                }
            ],
            "block_hash": "ASY6HgDUQUXUa99L7dPEfghKEnEk5SNkwQrx24u3Fobz",
            "id": "7beNxrbHxMRspJWT9NeEVwx719kVcmY9tRdPG9SYro26",
            "outcome": {
                "logs": [],
                "receipt_ids": [
                    "JDnBrxh6L9KFgVUEg6U8d39rEUEmbvLQ5tZQUmJTMyFJ"
                ],
                "gas_burnt": 209824625000,
                "tokens_burnt": "20982462500000000000",
                "executor_id": "bumbleee99.near",
                "status": {
                    "SuccessReceiptId": "JDnBrxh6L9KFgVUEg6U8d39rEUEmbvLQ5tZQUmJTMyFJ"
                },
                "metadata": {
                    "version": 1,
                    "gas_profile": null
                }
            }
        },
        "receipts_outcome": [
            {
                "proof": [
                    {
                        "hash": "8RwCWE9HgqenPKv8JW9eg2iSLMaQW82wvebYSfjPbdTY",
                        "direction": "Left"
                    },
                    {
                        "hash": "E4VXdwsNj3fZCbP6y9YH3M5oZHPDcdArqU9kbZJa95Qp",
                        "direction": "Right"
                    }
                ],
                "block_hash": "ASY6HgDUQUXUa99L7dPEfghKEnEk5SNkwQrx24u3Fobz",
                "id": "JDnBrxh6L9KFgVUEg6U8d39rEUEmbvLQ5tZQUmJTMyFJ",
                "outcome": {
                    "logs": [],
                    "receipt_ids": [],
                    "gas_burnt": 209824625000,
                    "tokens_burnt": "20982462500000000000",
                    "executor_id": "bumbleee99.near",
                    "status": {
                        "SuccessValue": ""
                    },
                    "metadata": {
                        "version": 1,
                        "gas_profile": []
                    }
                }
            }
        ],
        "receipts": []
    },
    "id": "2"
}

您可以看到两者transaction_outcome.outcome.receipt_idstransaction_outcome.outcome.status指向带有 ID 的收据JDnBrxh6L9KFgVUEg6U8d39rEUEmbvLQ5tZQUmJTMyFJ。我试过用EXPERIMENTAL_receipt这样的方法查询关于这个收据的节点

{
  "jsonrpc": "2.0",
  "id": "2",
  "method": "EXPERIMENTAL_receipt",
  "params": {"receipt_id": "JDnBrxh6L9KFgVUEg6U8d39rEUEmbvLQ5tZQUmJTMyFJ"}
}

但是节点返回错误,表明没有给定 ID 的收据

{
    "jsonrpc": "2.0",
    "error": {
        "name": "HANDLER_ERROR",
        "cause": {
            "name": "UNKNOWN_RECEIPT",
            "info": {
                "receipt_id": "JDnBrxh6L9KFgVUEg6U8d39rEUEmbvLQ5tZQUmJTMyFJ"
            }
        },
        "code": -32000,
        "message": "Server error",
        "data": {
            "name": "UNKNOWN_RECEIPT",
            "info": {
                "receipt_id": "JDnBrxh6L9KFgVUEg6U8d39rEUEmbvLQ5tZQUmJTMyFJ"
            }
        }
    },
    "id": "2"
}
4

1 回答 1

2

TL;DR 收据是本地收据


您示例中的交易是一个简单的AddKey操作,其中发送者是接收者(记住这一点,这很重要)

  1. “执行”交易(意味着将交易转换为收据)
  2. 申请收据

由于交易转换为收据的结果是您的transaction_outcome

"outcome": {
  "receipt_ids": [
    "JDnBrxh6L9KFgVUEg6U8d39rEUEmbvLQ5tZQUmJTMyFJ"
  ],
  "status": {
    "SuccessReceiptId": "JDnBrxh6L9KFgVUEg6U8d39rEUEmbvLQ5tZQUmJTMyFJ"
  },

这张收据即将申请,并且predecessor_idreceiver_id是相等的。nearcore这种收据称为本地收据(sir - sender-is-receiver),这些收据不存储在数据库nearcore中。

我们在 NEAR Indexer Framework 端模拟它们(这就是为什么您可以 JDnBrxh6L9KFgVUEg6U8d39rEUEmbvLQ5tZQUmJTMyFJ在 NEAR Explorer 的交易详细信息页面上看到 Receipt)

而且因为nearcore不会将此类收据存储在您UNKNOWN_RECEIPT从 RPC 获得的数据库中。

于 2022-02-14T13:11:58.297 回答