x/metaprotocol 模块增加了对附加在交易上的额外字段进行编码和解码的支持。 extension_options 和 non_critical_extension_options 是可选字段,可用于将数据附加到有效交易上。这些字段会由区块链进行校验,但不会以任何方式被使用。如果这些字段以空列表([ ])形式提供,或者使用 ExtensionData 类型的列表,则可以通过校验。 应用程序不会使用这些附加数据,但会确保提供了正确的类型,并且这些数据能够被成功反序列化。附加的数据会成为区块的一部分。
当 extension_options 或 non_critical_extension_options 中填充的类型不是 /gaia.metaprotocols.ExtensionData 时,这类交易会被视为无效并被拒绝。
下面是一个格式正确的 non_critical_extension_options 字段示例:
{
  "@type": "/gaia.metaprotocols.ExtensionData", // must be this exact string
  "protocol_id": "some-protocol",
  "protocol_version": "1",
  "data": "<base64 encoded bytes>"
}
下面是一个在 bank.MsgSend 交易中正确填充 non_critical_extension_options 的示例:
{
  "body": {
    "messages": [
      {
        "@type": "/cosmos.bank.v1beta1.MsgSend",
        "from_address": "cosmos1ehpqg9sj09037uhe56sqktk30asn47asthyr22",
        "to_address": "cosmos1ehpqg9sj09037uhe56sqktk30asn47asthyr22",
        "amount": [
          {
            "denom": "uatom",
            "amount": "100"
          }
        ]
      }
    ],
    "memo": "memo_smaller_than_512_bytes",
    "timeout_height": "0",
    "extension_options": [],
    "non_critical_extension_options": [
      {
        "@type": "/gaia.metaprotocols.ExtensionData",
        "protocol_id": "some-protocol",
        "protocol_version": "1",
        "data": "<base64 encoded bytes>"
      }
    ]
  },
  "auth_info": {
    "signer_infos": [],
    "fee": {
      "amount": [],
      "gas_limit": "200000",
      "payer": "",
      "granter": ""
    },
    "tip": null
  },
  "signatures": []
}

The x/metaprotocol module adds support for encoding and decoding additional fields attached to transactions. extension_options and non_critical_extension_options are optional fields that can be used to attach data to valid transactions. The fields are validated by the blockchain, but they are not used in any way. The fields pass validation if they are provided as empty lists ([ ]) or they use a list of ExtensionData types. The application does not use the attached data but it does ensure that the correct type is provided and that it can be successfully unmarshalled. The attached data will be part of a block.
Txs where extension_options or non_critical_extension_options are populated with a type other than /gaia.metaprotocols.ExtensionData are considered invalid and will be rejected.
Here is an example of a correctly formed non_critical_extension_options field:
{
  "@type": "/gaia.metaprotocols.ExtensionData", // must be this exact string
  "protocol_id": "some-protocol",
  "protocol_version": "1",
  "data": "<base64 encoded bytes>"
}
Here is an example of a correctly populated non_critical_extension_options on a bank.MsgSend transaction:
{
  "body": {
    "messages": [
      {
        "@type": "/cosmos.bank.v1beta1.MsgSend",
        "from_address": "cosmos1ehpqg9sj09037uhe56sqktk30asn47asthyr22",
        "to_address": "cosmos1ehpqg9sj09037uhe56sqktk30asn47asthyr22",
        "amount": [
          {
            "denom": "uatom",
            "amount": "100"
          }
        ]
      }
    ],
    "memo": "memo_smaller_than_512_bytes",
    "timeout_height": "0",
    "extension_options": [],
    "non_critical_extension_options": [
      {
        "@type": "/gaia.metaprotocols.ExtensionData",
        "protocol_id": "some-protocol",
        "protocol_version": "1",
        "data": "<base64 encoded bytes>"
      }
    ]
  },
  "auth_info": {
    "signer_infos": [],
    "fee": {
      "amount": [],
      "gas_limit": "200000",
      "payer": "",
      "granter": ""
    },
    "tip": null
  },
  "signatures": []
}