合约部署阶段
在初始化(远程证明)阶段将Enclave的远程证明写入区块后,就可以在链上进行隐私合约的部署了。v2.2.1_private_contract版本只支持rust语言开发的合约。
用户发起部署合约的请求,并把合约发送给隐私合约环境。
隐私计算网关在接收到用户部署请求后,把其中的合约送入Enclave的WASM中进行初始化。部分情况中,这一步还需要借助链上数据参与,则由隐私计算网关打包查询请求与链交互后,再在WASM中初始化合约。
Enclave初始化合约完成后,通知隐私计算网关。
若Enclave初始化合约成功,隐私计算网关会将合约通过链上系统合约存入区块链存证。链上的合约可用于合约逻辑的可靠性校验参照及合约的公共监管。
隐私计算网关通知用户部署合约的事件状态。
18.2.3. 合约调用阶段
用户可以随时发起对已经部署的隐私合约的调用请求。在调用隐私合约前,用户需要从区块链上获取远程证明并从中获得Enclave的加密公钥和签名验证公钥。隐私合约的调用流程如下:
用户向隐私合约环境发起调用隐私合约的请求。这个请求中包含要调用的隐私合约ID、涉及到的链上数据的key、用户准备的链外数据。(其中,链上的数据和用户准备的链外数据可能是加密的。我们会在之后的小章节中介绍加密数据的推荐处理方式。)
隐私计算网关根据用户调用合约的请求构造一个区块链请求,这个区块链请求用于从链上读取对应的隐私合约和链上数据。隐私计算网关将这个请求发送到区块链。
隐私计算网关从区块链上获取到隐私合约代码和需要的链上数据后,连同来自用户的链外数据一起,转发给Enclave。Enclave接收到隐私合约代码、区块链上数据、用户提供的链外数据后,
若数据是密文,使用加密私钥解密数据;
以传入Enclave的链上、链外数据为入参执行隐私合约;
按需要选择是否对执行结果加密;
打包执行结果,其中内容包括:隐私合约执行结果、隐私合约、链上及链外的入参数据;
使用签名私钥对打包好的执行结果签名。
Enclave将执行结果与签名返回到隐私计算网关。
隐私计算网关调用系统合约把执行结果与签名传到链上。系统合约会从链上获取Enclave远程证明,从中提取出签名公钥,并对执行结果的签名进行验证,并从执行结果中提取隐私合约、链上数据部分,与区块链上的信息进行比对。如果这些验证都通过了,则系统合约执行成功,隐私合约的执行结果会被打包到区块中等待共识出块。