5.8 合约信息(元数据)

优质
小牛编辑
138浏览
2023-12-01

合约信息(元数据)

在上一节中,我们解释了如何在blockchain上创建合同。现在我们讨论编译器输出的其他部分,合约元数据或合约信息。这个想法是这样的

  • 合同信息被上传到可通过url公开访问的位置
  • 任何人都可以找到只知道合同的地址的url

这些要求通过使用2步blockchain注册机制非常简单地实现。第一步是在一个叫做HashReg的合约中注册一个带有内容哈希的合约代码(哈希)。第二步是在UrlHint合约中注册一个含有内容哈希的URL 。这些简单的注册合约将成为frontier提议的一部分。

所以如果你是一个认真的合约创建者,步骤如下:

  1. 将合约本身部署到blockchain
  2. 获取合约信息json文件。
  3. 将合约信息json文件部署到您选择的任何URL
  4. Register codehash - >content hash - > url

JS API可以通过提供帮助来简化此过程。调用admin.register从合约中提取信息,在给定文件中写出其json序列化,计算文件的内容哈希值,最后将该内容哈希值注册到合同的代码散列。将该文件部署到任何url后,您可以使用admin.registerUrl在blockchain上注册带有内容哈希的URL。(请注意,如果使用固定内容寻址模型作为文档存储,则不再需要url提示。)

source = "contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"
// compile with solc
contract = eth.compile.solidity(source).test
// create contract object
var MyContract = eth.contract(contract.info.abiDefinition)
// extracts info from contract, save the json serialisation in the given file,
contenthash = admin.saveInfo(contract.info, "~/dapps/shared/contracts/test/info.json")
// send off the contract to the blockchain
MyContract.new({from: primaryAccount, data: contract.code}, function(error, contract){
  if(!error && contract.address) {
    // calculates the content hash and registers it with the code hash in `HashReg`
    // it uses address to send the transaction.
    // returns the content hash that we use to register a url
    admin.register(primaryAccount, contract.address, contenthash)
    // here you deploy ~/dapps/shared/contracts/test/info.json to a url
    admin.registerUrl(primaryAccount, hash, url)
  }
});