Skip to main content

从canister中接受外部的Https请求

在互联网计算机区块链上,canister 智能合约可以向指定的 URL 进行 HTTP 请求,要么直接获得链外数据,要么与链外系统互动,如 Web 2.0 服务或企业 IT 基础设施。这些调用的结果被处理并达成共识,防止非确定性。这就避免了对可信预言机和桥的需求。

通常情况下,智能合约软件需要获得真实世界的数据,这些数据来源于承载它们的区块链所提供的安全和不可阻挡的链上宇宙之外。智能合约也可能需要与这个宇宙之外的链外系统互动。由于区块链的工作方式,历史上这给区块链开发者带来了重大障碍。

例如,为了获得链外数据,智能合约传统上与中央运营的甲骨文服务互动,如 Chainlink。这些服务是由受信任的中介机构提供的,如公司,它们的作用是将链外数据复制到区块链上,以便智能合约可以访问。问题是,这些服务必须:a)被信任为诚实的,不会被黑客攻击,或以其他方式变得有问题,以及 b)被支付。此外,当智能合约需要与链外服务互动时,例如通过调用基于网络的 API,它们也无能为力。为了解决这些需求,互联网计算机提供了一个 "HTTPS 外部请求"功能。

HTTPS 外部请求允许托管在互联网计算机上的 canister 智能合约请求一个 URL,例如下载一个时间序列,记录由集中式加密货币交易所(如 Coinbase Pro)发布的资产的近期价格。当这种情况发生时,托管智能合约的子网区块链中的每个节点都会分别请求该 URL。然后每个节点在本地将他们获得的结果传递给请求罐智能合约使用查询调用实现的特殊功能,该功能对结果进行预处理,目的是使其与其他节点获得和预处理的结果一致(在我们的 Coinbase 例子中,由于每个节点会在稍微不同的时刻请求时间序列,结果可能不同)。

如果通过对 canister 智能合约的查询调用获得的预处理结果在所有节点中足够一致,那么该结果将通过共识达成一致,并提供给请求 URL 的智能合约,以便它可以继续无信任地处理原始智能合约调用(TX)。

为了在链外系统中触发一个行动,智能合约可以在其对 URL 的请求中包括一个加密的链密钥签名。这允许目标服务验证它所收到的请求是由一个真正的智能合约执行产生的,并通过共识达成一致。在这样的架构中,当一个链外服务收到一个有效的 URL 请求时,它必须注意只执行一次,因为许多节点会提出相同的请求,对于第一次之后的每个后续请求,它应该返回完全相同的结果。