铜仁市论坛

首页 » 分类 » 问答 » 应用的加密互联网计算机的一个公钥
TUhjnbcbe - 2021/7/31 21:57:00

互联网计算机是由运行高级去中心化协议的独立数据中心网络创建的革命性区块链计算机,使开发人员、组织和企业家能够构建和部署安全的应用程序和自治软件程序。

与在专有基础结构或特定托管服务上运行的典型的基于云或分布式体系结构不同,互联网计算机提供了一个开放平台,软件和服务可直接在开放互联网上运行。

分散的互联网计算机协议(ICP)通过实施高级加密技术来创建此安全网络。

在分散的分布式系统中,会出现各种问题。在对等级别,我们如何在这种敌对的开放环境中的节点之间传播工件?我们如何以最有效的方式做到这一点?我们如何定义最合适的网络拓扑?

接下来,有一个共识协议,主要问题是确保在没有中央权限的情况下,以正确的顺序验证和处理正确的交易。

在DFINITY基金会,研发与我们创建的公共平台之间没有区别。

我们的研发团队成员定期实施新技术,并了解他们的想法在实际应用中的应用。

在加密级别实现此功能的一个很好的例子是互联网计算机的非交互式分布式密钥生成(NIDKG)协议-基金会首次发布了新颖的核心加密技术。

引入非交互式DKG

在互联网计算机上运行的应用程序或服务的最终用户与软件容器进行交互,并且不会直接看到用于构建此分散式开发平台的高级加密技术。

互联网计算机定义了一个简单而干净的界面,该界面指定了容器的工作方式,从而实现了一个软件生态系统,其中不同的应用程序可以相互通信并使用彼此的API。

深入研究揭示了数字签名的用法,通过该签名,互联网计算机可以对输出进行认证和验证。

数字签名是现代加密技术曙光的一部分,出现在年代后期的Diffie-Hellman和RSA的开创性著作中。

最终用户和与其他容器对话的容器需要信息进行认证。

但是,在互联网计算机上,容器托管在子网中,子网由全球各地的节点集合运行。

因此,节点必须运行分布式协议以达成一致并签署互联网计算机的输出。

阈值签名使子网上的节点可以协同签名数据,如果有足够的节点合作,则可以签名。

另一方面,一些恶意节点无法偏离和签署未经授权的消息。

到目前为止,一切都很好,但是有一个转折。

在互联网计算机上,运行子网的节点集将发生变化,节点可以加入并离开各自的子网。

根据网络的需求和要求,所需的安全级别、数据中心的可用容量、随机硬件故障等,运行子网的节点集会随着时间而变化,这意味着阈值签名者组会随着时间而发展。

这样做的影响是,在子网内不断变化的节点中,继续生成、注册和分发新的公共密钥会在逻辑上变得很复杂。

作为替代解决方案,即使同一子网始终可以被静态公钥引用,即使组成子网的节点处于不断变化的状态,也可以极大地简化密钥管理。

幸运的是,公共密钥保存具有加密解决方案,并且可以重新共享密钥。

通过这些密钥重新共享方案,参与阈值签名方案的一组签名者可以将阈值签名的能力转移给另一组签名者。

现有的密钥重分配方案有很多好处,但是它们有一个局限性:它们是交互式的,从而引发了异步问题。

如果缺少来自节点的消息,则不清楚该消息是仅延迟还是该节点崩溃或受到损害。

DFINITY研发团队已经发明了一种新的非交互式密钥重新共享协议,每个旧的签名者只需要向新的签名者广播一条消息。

为了确保安全地完成此操作,使用了高级密码学中的许多概念,包括使用前向机密和非交互式零知识证明的加密。

因为它是非交互的,所以密钥重新共享协议的操作方式非常适合异步环境,其好处包括密钥保存。

在子网的整个生命周期中,单个公用密钥就可以知道它,并且互联网计算机上的其他各方不必跟踪更改公用密钥的情况。

查看子网密钥管理的不同阶段,该协议首先适用于初始密钥生成。

互联网计算机可以使用NIDKG协议来启动新的子网,并为初始节点提供阈值签名密钥,而不必在设置过程中涉及初始节点。

节点仅了解它们已被分配给子网,就可以推断出它们的签名密钥的秘密份额,然后开始运行该子网。

在子网运行时,分布式密钥重新共享协议用于注册新的加入节点。

不需要长时间的注册过程,因为子网只是将加密的密钥材料留给了加入的节点。

预期最经常发生的是,一组节点将自己重新分配密钥,这听起来有些违反直觉,因为节点已经具有阈值签名密钥。

但是,这种想法源于主动安全性的概念。

问题在于,随着时间的流逝,节点可能会受到损害。

想象一个由相同节点运行一定时间长度的子网,这为攻击者提供了一个时间窗,在此期间,他们可以以某种方式了解节点在签名密钥中的阈值份额。

主动安全性通过继续刷新签名密钥的阈值份额来提供解决方案,这意味着节点重新共享密钥以获取签名密钥的新阈值秘密共享。

之后,它们将删除其旧共享,这意味着即使攻击者随着时间的推移从每个节点学习了一些共享,只要在任何给定时间仅知道任何给定纪元的少数共享,阈值签名密钥仍然是安全的。

NIDKG是DFINITY研发团队带头推动的众多创新之一,其追求互联网计算机的宏伟愿景来更新Web的创新能力,这一愿景正在稳步成为公共现实。

我们期待着欢迎开发人员探索网络的功能并创建未来的应用程序和服务。

加入我们的开发人员社区,并在forum.dfinity.org上开始构建。

延伸阅读

仔细研究软件容器-智能合约的发展

互联网计算机-通过运行一个先进的分散协议的独立数据中心网络创造了一个革命性的区块链计算机-实现了无缝的软件生态系统,不同的应用程序和程序通信,并使用对方的API。通过容器(由代码和数据组成的计算单元)使之成为可能,容器可以部署在互联网计算机上,并可以通过互联网访问。软件容器是开放式协作互联网的基础,并且是互联网计算机的关键概念。初次听说容器时,背景不同的人会建立不同的关联:

以太坊开发人员可能会考虑智能合约

博士学位学生可能考虑actor模型

系统工程师可能会像在操作系统中一样考虑进程

虚拟机专家可能会想到WebAssembly模块

尽管每个比较都是正确的,但它们也不完整。但总的来说,它们描绘了一幅完整的图画。容器作为智能合约容器就像智能合约一样,因为其执行受安全协议互联网计算机协议(ICP)的支配。因此,容器是防篡改的,这意味着只能通过由协议控制的区块链中包含的消息来修改其状态。此外,由于容器代码的执行是完全确定性的,因此可以通过检查区块链中的消息以加密安全的方式审核容器的状态。容器具有传统智能合约的所有功能。但是,与智能合约相反,容器具有性能特征,因此可以使用它们来构建可扩展的软件服务。容器作为actor现在,让我们退后一步,从更抽象的角度考虑“容器”。从这个角度看,容器更象是一个actor在由计算机科学家卡尔·休伊特和其他捐助者开创的角色模型。参与者模型是并发计算的数学模型,其中参与者响应一条消息,可以修改其本地或私有状态,发送消息并创建更多参与者。在许多方面,容器都像actor一样。例如,actor有:

只能由容器本身修改的私有状态

一个执行线程,因此不需要基于锁的同步

通过异步消息与其他容器通信的能力

创建新容器的能力

传统actor和容器之间的重要区别是互联网计算机上的容器具有双向消息传递。邮件分为请求和响应,可以在其中答复请求,并且互联网计算机会跟踪响应的回调。用actor的术语来说,每个参与者都有一个用于接收消息的邮件地址。容器还具有一个邮寄地址,该邮寄地址看起来类似于IPv6地址。单个容器只有一个执行线程进行更新,但是互联网计算机会并行执行可能数量庞大的容器。这就是互联网计算机克服某些早期智能合约平台性能的限制的方式。此外,我们区分了需要更新容器状态的请求和不能修改容器状态的查询。尽管容器的更新吞吐量受到区块链和单执行线程的限制,但容器可以同时服务数百个查询,从而实现每秒数千个查询的吞吐量,并以毫秒为单位测量延迟。为了完善此图,必须补充一点,即最终用户至少在某种程度上也要作为参与者参与模型。这意味着浏览器和移动应用程序可以直接在容器上执行更新和查询操作。由DFINITY基金会开发的Motoko编程语言受actor模型的启发。容器作为进程容器非常类似于Linux、MacOS或Windows等操作系统中的进程。操作系统跟踪进程的有效内存范围,而容器在其线性内存上有一个边界,该边界由互联网计算机强制执行。当有工作要做时,操作系统调度程序会唤醒进程,而互联网计算机会调度容器的执行。操作系统代表进程维护状态,例如打开文件描述符和父进程。同样,互联网计算机代表容器来维护状态,但是代替文件描述符之类的东西,它会跟踪容器的令牌和cycles的余额、未完成的调用和权限等等。正如进程无法直接修改其文件描述符表一样,容器也无法直接修改其令牌余额。操作系统为进程提供功能,使它们能够执行特殊操作,例如处理文件和与外围设备通信。同样,互联网计算机向容器提供API,以便它们可以:

付款

呼唤其他容器

创建和管理容器

管理权限

获取系统时间(分布式系统中的重要功能)

互联网计算机的一个独特功能是它提供对安全随机性的访问。将来,容器还可以通过此类API签署比特币和以太坊合约。在幕后,进程和容器之间的最大区别在于,容器在子网中的所有节点上复制。当进程发生故障时,它崩溃,但是由于WebAssembly中的陷阱导致容器发生故障时,它不会崩溃。而是将其状态回滚到开始执行当前消息之前的状态,以便容器可以继续执行新消息。当然,如果容器在接收到的所有消息上崩溃时,这都没有什么帮助,但是对于容器逻辑中的意外丢失案例,这是非常有用的保护措施。实际上,容器无法与进程可以相同的方式终止-因为没有exit()或abort()系统调用。只能由其控制器通过管理命令从互联网计算机中删除容器。容器的控制器是允许执行管理命令(例如删除或更新容器)的用户或其他容器。在互联网计算机上构建自治服务时,控制另一个容器的容器是关键要素。容器作为WebAssembly模块实例容器非常类似于WebAssembly模块实例。这不仅仅是一个类比-这是在互联网计算机上实际实现容器的方式。从技术上讲,容器的代码部分是一个WebAssembly模块,该模块可导入系统API。也就是说,互联网计算机提供给容器的功能。而且,容器可以导出自己的API,其他容器也可以调用该API。根据WebAssembly规范:“模块实例是模块的动态表示,具有其自己的状态和执行堆栈。”因此,容器是WebAssembly模块的实例,而不仅仅是WebAssembly模块的一个重要区别。容器使用正交持久性来使模块实例看起来永远存在,从而使数据库或文件IO变得过时。要持久存储变量,开发人员只需将变量写入内存即可。持久化数据的操作对开发人员是完全透明的,并且在某种意义上讲,正交化是指开发人员不必执行任何特殊的操作即可持久化数据。跟踪到容器的线性内存的所有“写入”有两个原因。首先,这样就可以回滚失败的计算或WebAssembly陷阱。接下来,如果子网中的一个副本由于断电等不可预见的事件而崩溃,则当该副本恢复联机时,它将请求其他副本的已修改页面,从而可以恢复操作。这就是互联网计算机保持给WebAssembly模块实例提供无限期生命的错觉。拥抱WebAssembly可为互联网计算机带来以下好处:

容器可以用可以编译成WebAssembly的任何语言(例如Motoko、Rust)编写,并且以不同语言编写的容器可以完全互操作。

WebAssembly是确定性的,除了一些容易排除的边缘情况。

WebAssembly具有形式语义,在更长的时间内,我们期望看到端到端经过正式验证的WebAssembly执行环境,以提高安全性。

此外,我们将随着WebAssembly规范的发展而发展,在新功能变得足够成熟时增加对新功能的支持。例如,在我们的路线图上可以在单个容器中支持多个模块。软件容器是互联网计算机的基础,互联网规模的服务将由许多合作伙伴共同实施。拥有十亿用户的服务可能需要数千个容器才能存储用户数据。但这不是问题。容器抽象旨在按比例缩放,非常直接,通过随着时间的推移变得更强大来实现,但主要是通过水平缩放,或使用大量协作实现单个服务的容器来向外扩展。互联网计算机极大地简化了编写和部署代码的过程,访问
1
查看完整版本: 应用的加密互联网计算机的一个公钥