代码元数据
原文:https://docs.elrond.com/developers/developer-reference/code-metadata
代码元数据是表示智能合约在部署后允许的操作的标志,特别是:
upgradeable
-如果合约将来可以升级readable
-如果该合约的存储可以被其他合约读取payable
-如果合约可以在不调用任何端点的情况下接收资金(就像用户帐户一样)。注:合约不一定要支付才能在支付端点接收资金。payable by smart contracts
-就像payable
标志一样,但是只能从其他智能合约接收资金。用户转账将被拒绝。
重要
代码元数据必须在部署时指定,如果合约是可升级的,那么它也必须在升级时指定。
重要
一旦一个合约被标记为 不可升级,它的代码和代码元数据就变成不可变,永远**。
可用性
使用 erdpy 部署(或升级)智能合约时,其默认代码元数据标志为:upgradeable
、readable
和非、payable
。默认值可以通过如下修改命令erdpy contract deploy
(或erdpy contract upgrade
)来覆盖:
--metadata-not-upgradeable
-将合约标记为非upgradeable
--metadata-not-readable
-将合约标记为非readable
--metadata-payable
-将合约标记为payable
--metadata-payable-by-sc
-将合约标记为payable by smart contracts
有关更多信息,请访问 erdpy CLI 。
将元数据转换为字节
在内部,元数据存储为 2 字节宽的位标志。为了更容易理解,让我们这样定义标志:
bitflags! {
struct CodeMetadata: u16 {
const UPGRADEABLE = 0b0000_0001_0000_0000; // LSB of first byte
const READABLE = 0b0000_0100_0000_0000; // 3rd LSB of first byte
const PAYABLE = 0b0000_0000_0000_0010; // 2nd LSB of second byte
const PAYABLE_BY_SC = 0b0000_0000_0000_0100; // 3rd LSB of second byte
}
}
或者,如果您喜欢十六进制而不是二进制:
const UPGRADEABLE: u16 = 0x01_00;
const READABLE: u16 = 0x04_00;
const PAYABLE: u16 = 0x00_02;
const PAYABLE_BY_SC = 0x00_04;
例如,如果我们希望部署一个可支付和可升级的合约,我们的元数据将是0x0102
。
结论
我们希望这些标志将使创建和升级智能合约变得更加容易。
如果你想看更多关于如何使用代码元数据的例子,请看这里:https://github . com/elrond network/elrond-wasm-RS/tree/master/contracts/examples