本文主要是介绍Dfinity(ICP)身份认证和账本快速入门-3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Dfinity身份认证和账本快速入门
什么是Internet Identity
Internet Identity 使您可以在访问将其用作身份验证方法的应用程序时安全且匿名地进行身份验证。为您登录的每个应用程序创建不同的身份,您将能够使用所有已注册的设备或身份验证方法登录同一帐户。
与大多数身份验证服务不同,您的 Internet 身份不需要您设置和管理密码或向应用程序提供任何个人身份信息。相反,您可以使用您创建的身份验证配置文件,例如智能手机的面部识别、计算机解锁密码或安全密钥。Internet Identity 使您可以在访问将其用作身份验证方法的应用程序时安全且匿名地进行身份验证。为您登录的每个应用程序创建不同的身份,您将能够使用所有已注册的设备或身份验证方法登录同一帐户。
与大多数身份验证服务不同,您的 Internet 身份不需要您设置和管理密码或向应用程序提供任何个人身份信息。相反,您可以使用您创建的身份验证配置文件,例如智能手机的面部识别、计算机解锁密码或安全密钥。
Internet Identity如何运作
Internet 身份利用 Web 身份验证 (WebAuthn) API 使用智能合约为 Internet 计算机上运行的应用程序提供安全的加密身份验证。Internet Identity 使您能够使用内置于智能手机或笔记本电脑中的安全芯片或插入计算机 USB 端口的安全密钥来验证您的身份并授权访问应用程序。
与 Internet Identity 集成的应用程序会提示您使用先前注册的用户号进行注册或登录。注册设备是一个简单的过程,它为您生成存储在 Internet 计算机区块链上的唯一加密密钥。然后,您可以使用您的用户编号注册其他设备,以便您可以在所有设备上访问应用程序。
当您访问使用 Internet 身份验证您的身份的应用程序时,您的浏览器会连接到 Internet 身份并生成一个密钥以供该应用程序使用。在您验证您的身份后,Internet 身份将授权访问该应用程序。
您的浏览器会下载授权,然后将您重定向到应用程序。该应用程序验证来自 Internet 身份的授权,并授予您作为特定于应用程序的匿名身份的访问权限。在内部,每个应用程序都有不同的身份,但任何单个应用程序的身份在所有设备上都是相同的。您的所有设备仅代表可用于验证用户号的不同方法。
此外,您可以根据需要注册任意数量的用户编号以实现冗余,为其他设备用户设置不同的设备身份验证配置文件,或确保访问使用 Internet 身份的服务。
Internet Identity 恢复
当您注册身份时,系统会提示您复制加密安全的种子短语或添加专用安全密钥以进行恢复。
您可以随时选择执行此操作,但请注意,如果您丢失了用户编号或不再有权访问授权设备,则需要使用种子短语或恢复安全密钥来恢复您的身份。如果没有其中之一,您将无法访问需要关联身份的任何应用程序。
如何使用Internet Identity
当您访问将其用作身份验证方法的应用程序时,Internet 身份使您能够安全且匿名地进行身份验证。为您登录的每个应用程序创建不同的身份,您将能够使用所有已注册的设备或身份验证方法登录同一帐户。这一切都是使用在互联网计算机区块链上运行的加密智能合约来完成的。
与大多数身份验证方法不同,您的 Internet 身份不需要您设置和管理密码或向应用程序或 Internet 身份提供任何个人识别信息。相反,您可以使用用户编号和您选择的身份验证方法(例如智能手机的面部识别、计算机解锁密码或安全密钥)创建身份验证配置文件。
Windows 用户只能将安全密钥用作授权设备。
Firefox 目前不接受 OSX 与安全密钥以外的任何设备身份验证方法。
创建Internet Identity
通过选择身份验证方法并为您生成 Internet 身份用户编号,您可以安全地访问在 Internet 计算机上运行的使用 Internet 身份进行身份验证的应用程序。您可以通过注册新用户号来创建任意数量的身份。
当您第一次访问运行在 Internet 计算机上的应用程序时,您会被定向到 Internet 身份并要求输入用户号进行登录。如果您是新用户,则需要注册以获取用户号。
要以首次用户身份创建 Internet 身份:
-
转到Internet 身份。
-
单击使用 Internet 身份注册。
-
输入用于创建 Internet 身份的设备配置文件的名称。例如:iPhone 或 YubiKey。
-
注册您的设备。
如果该选项可用,请选择使用专用安全密钥或您正在使用的设备的身份验证方法进行注册。
例如,如果您的设备启用了生物识别来解锁它,您可能会看到使用这些作为您的身份验证方法的选项。您还可以使用解锁计算机的密码或解锁手机的 PIN 码,具体取决于您使用的设备。
-
验证设备。
使用您在出现提示时选择的方法进行身份验证。
-
点击确认。
在您执行此步骤之前,不会创建您的身份。
此时,根据您使用的设备,可能会要求您使用设备身份验证方法,或使用保存在安全密钥中的身份。如果您是第一次注册,请选择使用设备认证。
-
保存您的用户编号。
注册设备后,您将收到一个用户编号。
这个号码是唯一的,但不是秘密,所以你应该把这个号码保存在多个地方。您的浏览器会记住您的用户编号,但如果您在另一台计算机上登录、更改浏览器配置文件或清除浏览器状态,您将需要它。
-
点击继续。
-
设置帐户恢复
除了注册多个设备和使用安全密钥外,您还可以在出现提示时单击设置帐户恢复来设置帐户恢复。
在下一个屏幕上,您可以选择以下选项之一:
-
种子短语
选择此选项可生成可用于恢复帐户的加密安全种子短语。确保将此短语保存在安全且只有您知道的地方。请注意,种子短语中的第一个字符串是您的用户编号。您将需要此号码来开始恢复过程。
-
安全密钥
如果您无法访问授权设备,请使用专用安全密钥恢复您的帐户。此密钥必须与您主动用于登录 Internet 身份的密钥不同。将此密钥保存在安全且只有您知道的地方。您需要知道您的用户编号才能开始恢复。
-
稍后设置恢复
您可以跳过帐户恢复过程并随时从登录页面选择进行设置。
-
-
点击继续
在下一个屏幕上,您将看到您的用户编号和您注册的身份验证设备。从这里,您可以添加和删除设备,并设置帐户恢复方法。
添加设备
添加设备的工作流程可能因您已添加到身份中的设备而异。例如,如果您首先授权您的计算机创建您的用户号码,并且您想添加您的手机作为第二个身份验证方法,您必须能够在授权计算机上对您的手机进行身份验证。您必须始终能够使用已授权的设备对要添加的设备进行授权。
如果您要使用已注册的计算机或手机注册新设备(例如新安全密钥或新浏览器配置文件),则可以直接从 Internet 身份管理中轻松完成此操作。
其他工作流程可能更复杂,例如,使用经过身份验证的计算机将手机添加为身份验证设备。
要使用手机的解锁方法将手机注册为附加身份验证方法:
-
在手机的浏览器中打开 Internet Identity 网页。
-
单击已注册但使用新设备?
-
输入您的用户号,然后点击继续。
-
点击开始。
-
选择在屏幕锁定时使用此设备。
系统会要求您解锁设备。
-
授权您的手机。
解锁手机后,您将获得一个 URL 和一个二维码。您必须在已授权的计算机的浏览器中使用该 URL 或 QR 码。例如,您可以复制 URL 并将其通过电子邮件发送给自己,然后将其粘贴到计算机上的浏览器中。
-
输入您的用户号并点击登录。
-
将您的手机与您的身份关联起来。
如果您确定您在浏览器中粘贴的链接来自您,请单击是,链接新设备。
-
为设备配置文件命名并单击链接设备。
您的手机将被重定向到登录页面,您现在可以使用它和您的用户号登录。
找回Internet Identity
当您注册身份时,系统会提示您复制加密安全的种子短语或添加专用安全密钥以进行恢复。
您可以随时选择执行此操作,但请注意,如果您丢失了用户编号或不再有权访问授权设备,则需要使用种子短语或恢复安全密钥来恢复您的身份。如果没有其中之一,您将无法访问需要关联身份的任何应用程序。
如果您设置了恢复短语或恢复安全密钥,您可以通过单击**丢失访问权限并想要恢复?**从 Internet 身份登录页面。
Internet Computer ledger
令牌分发、交易管理、基于令牌的抵押和服务支付的 Internet 计算机协议 (ICP) 组件。该文档包括对支持 Internet 计算机协议令牌管理的设计、实现、安全保证、系统要求和应用程序编程接口 (API) 的概述。
与 Internet 计算机账本集成旨在为需要了解 Internet 计算机协议 (ICP) 实用程序令牌的术语和整体交易管理流程的组织和开发人员提供高级概述。
阅读本指南时,请注意,后续文档中可能会提供有关特定组件或接口的其他详细信息,以补充本文档中提供的概述。此外,本概述重点介绍如何使用Rosetta API与 Internet 计算机集成。其他集成选项也是可能的。
基本术语
Internet Computer 主要是用于运行软件的分布式和分散式平台。当您编写在 Internet Computer上运行的应用程序时,您以称为容器的概念计算单元的形式部署您的程序。容器类似于“智能合约”,它由程序的源代码及其运行状态组成,并在保证安全性和活性的区块链网络上进行复制。
最终用户或其他容器可以向容器功能发送消息以执行特定操作。消息可以是在不保存应用程序数据状态的情况下检索信息的查询调用,也可以是更改并保留状态的更新调用。通过使用运行容器的所有 Internet 计算机节点之间的共识协议来商定执行更新的顺序。
Ledger 容器概述
Internet 计算机协议 (ICP) 使用称为账本容器的专用容器实现令牌管理。有一个账本容器与互联网计算机上的所有其他容器一起运行。分类账容器基本上是一个持有账户和交易的智能合约。这些交易要么为账户铸造 ICP 代币, 要么将 ICP 代币从一个账户转移到另一个账户,要么销毁ICP 代币,从而消除它们的存在。分类账容器维护所有交易的可追溯历史,从其起源或开始状态开始。
帐户
帐户属于并由帐户所有者控制,该所有者必须是 IC 委托人。两个或多个 IC 委托人不得拥有任何账户(无“联名账户”)。
一个帐户所有者可以控制多个帐户。在这种情况下,每个账户对应一对(account_owner, sub_account)。子账户是一个可选的位串,有助于区分同一所有者的不同子账户。
账本上的帐户由其地址标识,该地址源自主体 ID 和子帐户标识符。
在这种情况下,您可以将主体标识符视为与用户的比特币或以太坊公钥哈希的粗略等效。您使用相应的密钥对消息进行签名,从而对账本容器进行身份验证并对委托人的帐户进行操作。容器也可以在账本容器中拥有帐户,但目前此类帐户的功能是有限的。账本容器使用 Internet 计算机内部的管理操作进行初始化。作为初始化过程的一部分,使用一组帐户和关联的 ICP 代币余额创建容器。
交易类型
有三种操作可以改变账本容器的内部状态:
- 为账户铸造 ICP 代币。
- 在账户之间转移 ICP 代币。
- 燃烧ICP代币。
所有操作都记录为账本容器中的交易。
账本将交易作为散列区块链进行维护。当记录状态变化时,每个新交易都被放置在一个块中并分配一个唯一的索引。整个链通过签署最新的链链接定期进行认证。用于验证链的签名可以由任何有权访问 Internet 计算机根公钥的第三方进行验证。可以通过查询账本来检索特定交易。
使用 Rosetta API 与Internet Computer ledger容器集成
可以通过多种方式与 Internet 计算机和ledger容器进行交互。此文档概述了如何使用Rosetta 应用程序编程接口与账本容器集成。这是一个有据可查的开放标准,旨在支持多种区块链数据格式和交换交易的结构化通信。
该接口由集成软件——`dfinity/rosetta-api 实现。该软件使您能够在 Internet 计算机网络之外部署被动 Rosetta 节点,并使用该节点与 Internet 计算机上运行的账本容器进行通信。
下图提供了使用dfinity/rosetta-api
集成软件在 Rosetta 节点和 Internet 计算机之间进行通信的简化视图。
正如此图所示,Rosetta 节点维护 Internet 计算机账本容器的本地副本。dfinity/rosetta-api
Rosetta 节点上运行的软件会定期更新其本地账本视图,方法是在账本容器中查询账本链的最新区块,然后查询任何丢失的账本区块。Rosetta 节点使用互联网计算机的根密钥来确保账本的本地副本是真实的。集成软件还允许您使用 Rosetta 节点将交易提交到 Internet 计算机账本。
集成工作流概述
如果您使用 Rosetta 节点与 Internet 计算机分类账容器通信,以下总结了传输 ICP 令牌的基本操作流程。在这种情况下,您必须是使用存储在钱包中的签名密钥对 Internet 计算机进行身份验证的 Internet 计算机主体。
用户向Rosetta节点提交交易请求后,将请求传递给运行在该节点上的集成软件与互联网计算机进行交互,完成以下操作:
-
它从账本的本地副本中读取,以确定
latest_index
标签所标识的最新交易索引和区块高度的状态。 -
它生成一个随机
nonce
值——用于确保交易是唯一的。 -
它为账本容器创建一个入口消息,该消息调用该
send
函数并指定交易的金额和目的地:send(nonce, latest_index, dst, amount)
-
它使用存储在钱包中的密钥对入口消息进行签名,以识别所有者的委托人 ID。
-
它将消息转发到 Internet 计算机上的账本容器。
设置 Rosetta 节点
您可以设置符合 Rosetta API 的节点来与 Internet 计算机交互并交换 Internet 计算机协议 (ICP) 令牌。为了使说明简单,我们使用 Docker 镜像创建与 Rosetta API 的集成——也可以使用源代码构建和运行二进制文件。如果您的本地计算机上还没有 Docker,请下载并安装最新版本。
要设置 Rosetta 节点(连接到测试网):
-
安装 Docker并启动 Docker 守护进程。
dockerd
当您重新启动计算机时,Docker 守护进程 ( ) 应该会自动启动。如果您手动启动 Docker 守护程序,则说明因本地操作系统而异。 -
dfinity/rosetta-api
通过运行以下命令从 Docker Hub拉取最新镜像:docker pull dfinity/rosetta-api
-
通过运行以下命令启动集成软件:
docker run \--interactive \--tty \--publish 8080:8080 \--rm \dfinity/rosetta-api
此命令在本地主机上启动软件并显示类似于以下内容的输出:
Listening on 0.0.0.0:8080 Starting Rosetta API server
默认情况下,该软件不会连接到运行在 Internet 计算机生产网络上的账本容器,而是连接到测试网之一。
如果您被分配了一个测试网络和相应的账本容器标识符,您可以通过指定一个额外的
canister
参数来针对该网络运行该命令。例如,以下命令说明了通过将canister
参数设置为来连接到测试网络上的账本容器2xh5f-viaaa-aaaab-aae3q-cai
。docker run \--interactive \--tty \--publish 8080:8080 \--rm \dfinity/rosetta-api--canister 2xh5f-viaaa-aaaab-aae3q-cai
You are all caught up to block height 109
完成此步骤后,节点继续作为不参与出块的被动节点运行。
-
打开一个新的终端窗口或选项卡并运行
ps
命令以验证服务的状态。如果您需要停止服务,请按 CONTROL-C。例如,您可能希望这样做以更改您正在使用的容器标识符。
要在设置节点后测试集成,您需要编写一个程序来模拟委托人提交交易或查找帐户余额。
在生产中运行 Rosetta 节点
当你完成测试后,你应该没有运行在生产模式泊坞窗图像--interactive
,--tty
以及--rm
命令行选项。这些命令行选项用于附加交互式终端会话并删除容器,主要用于测试目的。
要在生产环境中运行该软件,您可以使用--detach
在后台运行容器的选项启动 Docker 映像,并且可以选择指定--volume
用于存储块的命令。
要将 Rosetta 节点实例连接到主网,请添加标志: --mainnet
和--not-whitelisted
。
要求和限制
Docker 映像中提供的集成软件有一项要求,该要求不属于标准 Rosetta API 规范的一部分。
对于涉及 ICP 代币的交易,必须在网络收到签名交易前 24 小时内创建未签名交易。原因是每个事务的 ‘created_at’ 字段指的是一个现有的事务(本质上是在事务创建时本地可用的 last_index)。任何引用过旧交易的提交交易都会被拒绝,以保持运营效率。
除此要求外,Rosetta API 集成软件完全符合所有标准 Rosetta 端点并通过所有rosetta-cli
测试。该软件可以接受任何有效的 Rosetta 请求。但是,集成软件仅提示使用 Ed25519 签署交易,而不是此处列出的所有签名方案,并且仅回复规范支持的潜在响应的一小部分。例如,该软件没有实现 Rosetta 的任何 UTXO 功能,因此您不会在任何软件响应中看到任何 UTXO 消息。
ICP 实用程序代币的基本属性
ICP 代币类似于管理去中心化网络(如比特币)的实用程序代币,但在重要方面也有所不同。
ICP代币在以下方面类似于比特币:
- 每个 ICP 代币可整除 10^8 次。
- 从创世初始状态开始,所有交易都存储在分类账中。
- 代币是完全可互换的。
- 帐户标识符是 32 个字节,大致相当于公钥的哈希值,可选择与一些额外的子帐户说明符一起使用。
ICP 代币在以下方面与比特币不同:
- 抵押的参与者节点不使用工作证明,而是使用阈值 BLS 签名的变体来就链的有效状态达成一致。
- 任何交易都可以存储一个 8 字节的备忘录——这个备忘录字段被 Rosetta API 用来存储区分交易的随机数。然而,该领域的其他用途也是可能的。
官方问题解答
以下问题摘自开发人员社区中最常报告的问题和阻止程序,这些问题是关于 Rosetta 与 Internet 计算机的集成。
如何运行 Rosetta(罗塞塔节点) 节点的实例?
完成此操作的一种简单方法是使用 dfinity/rosetta-api
Docker 映像。节点初始化并同步所有块后,您可以通过调用节点上的 Rosetta API 来执行查询和提交事务。节点侦听8080
端口。
如何将 Rosetta 节点连接到主网?
使用标志--mainnet
和--not-whitelisted
如何知道节点是否赶上测试网?
搜索Starting Rosetta API server
启动日志。会有一个日志条目说You are all caught up to block XX
. 此消息确认您已赶上所有块。
如何持久化同步块数据?
将/data
目录挂载到别处。
Rosetta 节点是否版本化?
还没有。在发布之前,当我们推送dfinity/rosetta-api:latest
图像时,通常是我们会事先在我们的沟通渠道中宣布的重大更新。
我们很快就会实现镜像的每晚构建,CI 将确保它在推送之前正常工作。除此之外latest
,这些图像也将被标记为构建日期,因此为了更多的可重复性,可以使用特定日期标记的图像而不是latest
。我们将在夜间构建可用时宣布。
如何连接到主网而不是测试网?
开始dfinity/rosetta-api
用--help
,你可以看到,可以通过一些额外的CLI参数。其中有--canister-id
和--ic-url
可用于配置账本目的地。目前,他们默认使用测试网络。
注:主网尚未上线;将在公示日期前一段时间上线,我们会将更新后的镜像推送到主网上,以确保您可以提前在主网上进行测试。
特定于 ICP 的 Rosetta API 详细信息
如何生成和验证帐户?
- 生成 ED25519 密钥对。
- 密钥用于签署交易。
- 公钥用于生成自我验证的主体 ID。有关更多信息,请参阅:https : //sdk.dfinity.org/docs/interface-spec/index.html#_principals。
- 主体 ID 被散列以生成帐户地址。
如何使用公钥生成其账户地址?
- 使用十六进制编码的 32 字节公钥调用端点。
[/construction/derive](https://www.rosetta-api.org/docs/ConstructionApi.html#constructionderive)
- 调用
pub_key_to_address
JavaScript SDK 中的函数。
如何验证账户地址的校验和?
- 十六进制解码后,前 4 个字节是地址其余部分的大端 CRC32 校验和。
- 调用JavaScript SDK。如果校验和不匹配,它将返回并出错。
[address_from_hex](https://github.com/dfinity/rosetta-client#working-with-account-addresses)
- 此处 是地址验证逻辑的 Java 实现。
什么是signature_type
和curve_type
用于ED25519?
signature_type
是"ed25519"
curve_type
是"edwards25519"
什么类型的交易可以出现在一个区块中,它们是什么意思?
- 从端点查询的每个块都包含一个事务。请注意,Rosetta API 调用不支持某些操作,例如。
[/block](https://www.rosetta-api.org/docs/BlockApi.html#block)``burn
- 转移
- 操作 0:输入
"TRANSACTION"
,从源账户中减去转账金额。 - 操作一:输入
"TRANSACTION"
,向目的账户添加相同的转账金额。 - 操作2:输入
"FEE"
,从源账户中减去费用。
- 操作 0:输入
- 不要依赖上面的顺序,您可以在
/construction/payloads
调用中重新排列它们,并且在解析块中的交易时,您应该检查交易类型和金额符号。 - 薄荷
- 操作 0:键入
"MINT"
,将铸造的金额添加到目标帐户。
- 操作 0:键入
- 烧伤
- 操作 0:输入
"BURN"
,从源账户中减去燃烧量。
- 操作 0:输入
"status"
总是"COMPLETED"
,失败的交易不会出现在轮询的区块中
需要什么费用?我可以自定义费用吗?
- 通过调用,你可以得到。
[/construction/metadata](https://www.rosetta-api.org/docs/ConstructionApi.html#constructionmetadata)``suggested_fee
- 目前,
suggested_fee
是一个常数,并且转账中指定的费用必须等于它。 - 费用不适用于 Mint 或 Burn 操作。
我如何知道提交的交易是否命中链?
- Rosetta 服务器会在
/construction/submit
调用后等待一小段时间,如果交易命中链,则会返回。 - 如果账本出现错误,错误信息将在
/construction/submit
结果中可用。 /construction/submit
调用成功返回的可能性仍然存在,但距离到达链还有一段时间。您可以轮询最新区块并搜索交易哈希。我们还实现了端点的一个子集,它允许在给定哈希值的情况下搜索交易。[/search/transactions](https://www.rosetta-api.org/docs/SearchApi.html#searchtransactions)
- 5 分钟是最坏的超时情况。
- 不要使用
mempool
API,我们的实现是一个空存根。
我可能会从 Rosetta API 调用中得到哪些类型的错误?
- 成功的调用总是有
200
响应状态代码。 - 失败的调用总是有
500
响应状态代码,JSON 负载包含更多信息。可以在/network/options
调用结果中看到可能的 Rosetta 错误代码及其文本描述。
我如何发送 Mint 或 Burn 交易?
- Mint 是一种特权操作;我们目前不支持通过 Rosetta API 调用进行刻录。
如果多次提交同一个签名交易会发生什么?
账本拒绝重复的交易。只有第一笔交易会进入链,对于重复提交,/construction/submit
调用将失败。
如何在不调用 Rosetta API 的情况下签署交易?
JavaScript SDK 包含离线签名逻辑的实现。这与内部实现细节紧密相关,因此我们强烈建议您尽可能致电/construction/combine
签署交易。
如何配置入口时间段?
在/construction/payloads
调用中,您可以添加一个或所有ingress_start
/ingress_end
字段来指定入口时间段。它们是 Unix 纪元以来的纳秒,并且必须在接下来的 24 小时内。这可以生成和签署交易,但将实际提交延迟到以后。
如何反序列化已签名的交易?
uction/submit`调用将失败。
如何在不调用 Rosetta API 的情况下签署交易?
JavaScript SDK 包含离线签名逻辑的实现。这与内部实现细节紧密相关,因此我们强烈建议您尽可能致电/construction/combine
签署交易。
如何配置入口时间段?
在/construction/payloads
调用中,您可以添加一个或所有ingress_start
/ingress_end
字段来指定入口时间段。它们是 Unix 纪元以来的纳秒,并且必须在接下来的 24 小时内。这可以生成和签署交易,但将实际提交延迟到以后。
如何反序列化已签名的交易?
JavaScript SDK 支持 反序列化signed_transaction
十六进制字符串并恢复有关传输的一些信息。如果您想执行健全性检查,这可能很有用。
这篇关于Dfinity(ICP)身份认证和账本快速入门-3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!