Immutable X 分析
介绍
Immutable X是一个基于StarkWare的layer2网络使用Cairo编写的NFT跨链和交易应用。用户可以在此网络内进行快速低成本的交易。并且由于StarkNet底层使用了ZK-Rollup的方案,相比传统sidechain拥有更高的去中心化安全性、即时交易确认、高tps、抗DDos等优点。
原理
Immutable X使用ZK-Rollup,将layer2上的一定量的交易打包,批量生成有效的证明,提交到layer1上的智能合约进行验证。通过验证后即可完成“跨链”的存取操作。
Immutable X的使用
在Immutable X集成ERC721
先决条件:
- ERC721的部署:在layer1上部署继承了Immutable X的Mintable合约的ERC721。
- 合约注册:上文所述的合约要在Immutable X登记。
- 用户注册:用户使用前也需要先登记。目的是为了将layer1私钥与layer2私钥进行绑定。
ERC721的部署
在layer1上部署继承了Immutable X的Mintable合约的ERC721。确保IMX拥有铸币权。
Mintable.sol
此合约内部提供了一个mintFor方法确保IMX拥有铸币权。token特性相关的代码需要实现_mintFor方法。
modifier onlyIMX() {
require(msg.sender == imx, "Function can only be called by IMX");
_;
}
function mintFor(
address user,
uint256 quantity,
bytes calldata mintingBlob
) external override onlyIMX {
require(quantity == 1, "Mintable: invalid quantity");
(uint256 id, bytes memory blueprint) = Minting.split(mintingBlob);
_mintFor(user, id, blueprint);
blueprints[id] = blueprint;
emit AssetMinted(user, id, blueprint);
}
function _mintFor(
address to,
uint256 id,
bytes memory blueprint
) internal virtual;
合约注册
部署合约后,需要向 Immutable X 注册。
目前只支持手动验证注册,后续项目方支持自动验证注册。
将以下详细信息,在此处提交给项目方后收到回执邮件。
然后在https://api.x.immutable.com/v1/collections可以查询到我们的合约。
{
"name": "Collection Name (usually Partner Name)",
"description": "Some Description of this collection",
"owner_public_key": "<CHANGE-ME>",
"contract_address": "<CHANGE-ME>",
"metadata_api_url": "https://<CHANGE-ME>",
"icon_url": "https://<CHANGE-ME>",
"collection_image_url": "https://<CHANGE-ME>"
}
用户注册
将按照EIP-2645对用户的layer1和layer2的私钥进行绑定。
在Immutable X使用
铸币
- 用户在layer2用对应的私钥发起铸币请求。
- Immutable X Engine对签名、请求、状态等验证同步提交到layer2。
- layer2最后根据状态转移进行零知识证明生成proof。
- 将证明结果提交给layer1。
资产存款
用户在layer1上发起存款请求,layer2接收到事件后,在layer2上进行铸造。
- 用户首先向API请求存款数据。
- 用户拿到存款数据后,将token存入layer1的存款合约。
- 存款合约发出事件后,Immutable X engine收到事件后在layer2上处理存款请求。
- layer2生成proof提交到layer1。
资产提取
用户在layer2上发起提取请求。当确认后,用户可以在layer1上发起请求进行提款。
- 用户首先向API请求提款数据。
- 用户拿到提款数据后发起提款。
- 当layer2协商一致后并且proof成功上链后,layer1用户会收到提款事件。
- 用户layer1发起提款,并收到资产。
资产交易
用户交易本身发生在layer2,无须与layer1交互。
- 用户首先向API请求卖单数据。
- 用户根据数据提交卖单。(此部分没有进行实质上的状态数据变化,所有无须与其他节点同步)
- 某用户确认认购后,Immutable Engine将卖单买单数据同步给其他节点。
- 生成proof提交到layer1。
参考资料
Cairo合约开发文档 https://www.cairo-lang.org/
immutable x 文档 https://docs.x.immutable.com/docs/
starknet https://starkware.co/starknet/