facet 想法来源
如果你可以预测只能合约的结果,那么就直接使用预测的结果,不再执行智能合约
function mint(uint256 id) {
require(_ownerOf[id] == address(0), "Id already minted");
balanceOf[to]++;
ownerOf[id] = msg.sender;
}
例如上面的nft mint合约,当我们想mint id=99的 NFT时,在确定99在未mint的情况下,我们执行mint id=99的操作时我们会得到balanceof中记录to地址+1
owner 中 id =99的地址记录为自己的地址
但是实际上是无法确定的,如果两个人同时mint id = 99 时,就不能确定结果
原因是由于区块链是无序的非确定性的,所以我们是无法提前知道只能合约的执行结果的
但是如果将Ethereum作为交易的排序器,那么智能合约的输入参数的顺序就是确定了,那么智能合约的结果也就可以确定了
仅做一笔eth=0的eth转账,在备注里加入calldata
data:application/vnd.facet.tx+json;rule=esip6,{"op":"call","data":{"to":"0xa38ad4c62a70e14619fa56548bb5e11381d58ff6","function":"transfer","args":{"to":"0x75B3763c6E8a0A0e2AcBAB8916d681CBb9059ee3","amount":"39872000000000000000000"}}}
确定调用的合约地址以及合约的入参
facet API
https://api.facet.org/transactions/:hash
https://api.facet.org/transactions/
facet 如何工作
facet 创建了一个facet-vm 该虚拟机负责对交易进行计算存储
具体流程如下:
- 首先,用户将mint的详细信息编码成以太坊交易。Facet 使用 dataURI 而不是 ABI 编码,除此之外,这一步与基于智能合约的mint非常相似。
- 接下来,用户将该编码信息作为 calldata 添加到以太坊交易中,并将交易发送给 0x0000000000000000000000000000face7 而不是智能合约。
- Facet 虚拟机会观察发送到0x0000000000000000000000000000000face7 的信息,并将你的mint交易路由到相应的 Dumb Contract(Facet Contract 被称为 Dumb Contract)。
- 合约逻辑会执行,状态会持久化,交易收据会通过 API 提供。
如何调用 dumb contract
要调用 dumb contract ,你需要向 null address 发送一个特殊格式的以太坊交易。具体来说,你必须使用 Ethscriptions 协议将请求编码为 dataURI。
下面是一个简单的 ERC20 mint 交易示例:
application/vnd.facet.tx;rule=esip6,{
"op": "call",
"data": {
"to": "0x1234eccd1000898941bc19d3f356322783941fa6",
"function": "mint",
"args": {
"amount": "1000000000000000000000"
}
}
}