以太坊智能合约的元数据

合约元数据

Solidity编译器自动生成JSON文件,即合约元数据,其中包含有关当前合约的信息。您可以使用此文件查询编译器版本,使用的源,ABI和NatSpec文档,以更安全地与合约交互并验证其源代码。

编译器将元数据文件的Swarm哈希附加到每个合约的字节码末尾(详见下文),以便您可以以经过身份验证的方式检索文件,而无需求助于集中式数据提供程序。

您必须将元数据文件发布到Swarm(或其他服务),以便其他人可以访问它。您可以使用 生成名为的文件的命令来创建文件。它包含对源代码的Swarm引用,因此您必须上载所有源文件和元数据文件。solc --metadataContractName_meta.json

元数据文件具有以下格式。以下示例以人类可读的方式呈现。格式正确的元数据应正确使用引号,将空格减少到最小,并对所有对象的键进行排序以获得唯一的格式。此处不允许使用注释,仅用于解释目的。

{
  //必需:元数据格式的版本
  version: "1",
  //必需:源代码语言,基本上选择“子版本”
  //规范
  language: "Solidity",
  //必需:有关编译器的详细信息,内容是特定的
  //语言
  compiler: {
   // Solidity必需:编译器的版本
    version: "0.4.6+commit.2dabbdf0.Emscripten.clang",
//可选:生成此输出的编译器二进制文件的哈希值
    keccak256: "0x123..."
  },
  //必需:编译源文件/源单元,键是文件名
  sources:
  {
    "myFile.sol": {
      //必需:源文件的keccak256哈希值
      "keccak256": "0x123...",
    //必需(除非使用“内容”,见下文):排序的URL
     //对于源文件,协议或多或少是任意的,但是a
      //建议使用Swarm URL
      "urls": [ "bzzr://56ab..." ]
    },
    "mortal": {
     //必需:源文件的keccak256哈希值
      "keccak256": "0x234...",
       //必需(除非使用“url”):源文件的文字内容
      "content": "contract mortal is owned { function kill() { if (msg.sender == owner) selfdestruct(owner); } }"
    }
  },
   //必需:编译器设置
  settings:
  {
  // Solidity必需:已重新排序的已排序列表
    remappings: [ ":g/dir" ],
   //可选:优化程序设置(启用默认值为false)
    optimizer: {
      enabled: true,
      runs: 500
    },
    // Solidity必需:合同或库的文件和名称
   //为其创建元数据。
    compilationTarget: {
      "myFile.sol": "MyContract"
    },
    // Solidity必需:所用库的地址
    libraries: {
      "MyLib": "0x123123..."
    }
  },
  //必需:生成有关合同的信息。
  output:
  {
       //必需:ABI合同定义
    abi: [ ... ],
     //必需:NatSpec合同的用户文档
    userdoc: [ ... ],
    //必需:NatSpec开发者合同文件
    devdoc: [ ... ],
  }
}

警告

由于生成的合约的字节码包含元数据哈希,因此对元数据的任何更改都会导致字节码的更改。这包括对文件名或路径的更改,并且由于元数据包括所有使用的源的散列,因此单个空格更改会导致不同的元数据和不同的字节码。

注意

请注意,上面的ABI定义没有固定的顺序。它可以随编译器版本而改变。

字节码数据哈希的编码

因为我们可能支持将来检索元数据文件的其他方法,所以映射存储在 CBOR编码中。由于编码的开头不容易找到,因此它的长度是以双字节大端编码添加的。因此,当前版本的Solidity编译器将以下内容添加到部署的字节码的末尾:{“bzzr0”: }

0xa1 0x65 ‘b’ ‘z’ ‘z’ ‘r’ ‘0’ 0x58 0x20 <32 bytes swarm hash> 0x00 0x29

因此,为了检索数据,可以检查部署的字节码的结尾以匹配该模式,并使用Swarm哈希来检索文件。

注意

编译器当前使用元数据的“swarm版本0”哈希值,但这可能在将来发生变化,因此不要依赖此序列来开始。我们可能还会向此CBOR结构添加其他数据,因此最佳选择是使用适当的CBOR解析器。0xa1 0x65 ‘b’ ‘z’ ‘z’ ‘r’ ‘0’

自动接口生成和NatSpec的用法

元数据以下列方式使用:想要与合约(例如Mist或任何钱包)交互的组件从文件的Swarm散列中检索合约的代码,然后检索该文件的Swarm散列。该文件被JSON解码为如上所述的结构。

然后,组件可以使用ABI自动为合约生成基本用户界面。

此外,钱包可以使用NatSpec用户文档在用户与合约交互时向用户显示确认消息,同时请求对交易签名的授权。

有关以太坊自然规范(NatSpec)的更多信息,请点击此处。

源代码验证的用法

为了验证编译,可以通过元数据文件中的链接从Swarm检索源。使用指定的设置在该输入上调用正确版本的编译器(被检查为“官方”编译器的一部分)。将得到的字节码与创建事务或CREATE操作码数据的数据进行比较。这会自动验证元数据,因为它的哈希是字节码的一部分。过多的数据对应于构造函数输入数据,应根据接口对其进行解码并呈现给用户。
以太坊智能合约的元数据_第1张图片

你可能感兴趣的:(以太坊,区块链,Solidity)