5.8 合约信息(元数据)
优质
小牛编辑
144浏览
2023-12-01
合约信息(元数据)
在上一节中,我们解释了如何在blockchain上创建合同。现在我们讨论编译器输出的其他部分,合约元数据或合约信息。这个想法是这样的
- 合同信息被上传到可通过
url
公开访问的位置 - 任何人都可以找到只知道合同的地址的
url
这些要求通过使用2步blockchain注册机制非常简单地实现。第一步是在一个叫做HashReg
的合约中注册一个带有内容哈希的合约代码(哈希)。第二步是在UrlHint
合约中注册一个含有内容哈希的URL 。这些简单的注册合约将成为frontier提议的一部分。
所以如果你是一个认真的合约创建者,步骤如下:
- 将合约本身部署到blockchain
- 获取合约信息json文件。
- 将合约信息json文件部署到您选择的任何URL
- 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)
}
});