译者 | 李睿
审校 | 重楼
51CTO读者成长计划社群招募,咨询小助手(微信号:CTOjishuzhan)
对于开发Web3应用程序的开发者来说,通常知道让用户登录Web3很困难。即使承诺用户真正拥有自己的数据,进行近乎免费的全球支付,并使用无审查的系统,创建和使用数字钱包的过程还是非常困难。
幸运的是,还有更好的方法。帐户抽象(Account Abstraction)承诺简化流程,使用户登录更加无缝和简单。流量(Flow)是一个去中心化的、公共的、第一层区块链,旨在为用户构建Web3体验而设计,它使用帐户抽象将混合托管模型与无数字钱包登录相结合,从而创建了一个像传统应用程序一样简单和直接的登录。
以下深入了解一下混合托管和无钱包登录是如何协同工作的,例如在架构、代码,以及可以期待的进展等方面。
一、为什么登录Web3如此困难
数字钱包带来了Web3的所有好处,包括保证没有人可以控制你的资产。没有中间人,例如银行从用户的钱中抽取一定比例的费用,也没有第三方规定用户能做什么。然而,因为大多数钱包都是“自我托管”的(只有用户自己可以访问),用户需要管理自己的密钥。如果出错,不会得到其他人的帮助和支持。
这意味着用户必须安全地保存密钥。不要将它们以明文形式存储在自己的电脑上,它们可能会被黑客窃取。也不要把密钥写在别人能看到的地方。Web3没有重置密码,如果丢失它们,可能会失去一切。因此可以看到Web3登录问题所在。
除了面临自我托管的挑战之外,用户还需要了解代币和支付。例如,如何支付交易费用?需要什么代币?如何从法定货币转向代币?一旦有了代币,将如何转移它们?如果在发送代币的时候出错,那么它们可能永远消失了。因此,可以再次了解这一切有多困难。
考虑到所有这些障碍,因此很容易理解为什么许多用户没有完成登录Web3应用程序的第一步。
二、托管钱包出色的用户体验,但缺乏所有权
开发人员试图用托管数字钱包来解决这个问题。这些钱包为用户管理密钥,有很多好处。
注册很容易。用户可以像使用传统服务一样使用电子邮件和密码,其余的由数字钱包提供商负责。如果用户丢失了登录凭证,其密钥仍然可以在提供商的服务器上访问,用户也可以简单地请求重置密码。由于钱包软件运行在他们的服务器上,供应商甚至可以支付交易费用。用户不需要理解代币、资金和转账。
但正如Web3所说:“不是你的密钥,就不是你的钱!”虽然托管数字钱包解决了许多登录问题,但钱包提供商最终拥有密钥。而现在回到了想要摆脱的问题:一个中心化的实体可以阻止用户使用自己的代币,可以随心所欲地关闭用户的账户,或者取走用户的资金。
如果你能两全其美,那不是很好吗?
三、拯救账户抽象
帐户抽象解决了区块链网络的一个基本问题:外部拥有的帐户和合同帐户之间的区别。
外部拥有的帐户(EOA)是由用户使用私钥控制的帐户,这些是在上面谈到的传统的Web3钱包。外部拥有的帐户(EOA)有一个公共地址,并通过区块链发起交易(例如发送代币)。
合约账户(也只是一个智能合约)是一个部署在链上并由网络节点执行的程序。合同账户不会启动交易。与其相反,它们用自己的动作响应交易。它们没有私钥,由自己的代码控制。这种类型的账户可以说是拥有应用程序托管。
帐户抽象将应用程序托管和自我托管结合到一个新的用户体验(UX)中,为用户提供两者的好处:控制他们的钱包,同时抽象钱包(区块链)。
在流量上,帐户抽象是使用混合托管的无钱包登录的基础。
四、混合托管让你两全其美
无钱包登录允许开发人员为用户创造近乎无缝的登录体验。
混合托管模型使用帐户抽象来允许帐户委托,其中子帐户通过Capability将控制权委托给父帐户,在本质上允许一个帐户控制另一个帐户。
现在,自我托管帐户可以是父帐户,为应用程序帐户授予权限,而应用程序帐户现在是子帐户。有了这样的设置,应用程序帐户可以协同工作,应用程序可以这样工作:
应用程序为用户创建钱包。这里没有登录的障碍——没有密钥管理,没有签名交易,也不了解区块链。用户可以使用应用程序购买和出售资产,而无需了解或关心技术细节。用户的应用程序甚至可以补贴交易费用,或者让他们用美元等法定货币为账户提供资金。这一切对用户来说都是不可见的。
一旦用户带着自己的钱包管理账户回来,其应用程序可以授权访问用户的账户。一旦链接,用户就拥有了混合托管权力——他们的钱包管理着他们的主账户(现在是“父账户”),这个主账户维护着对应用程序创建的账户(现在是“子账户”)的访问。
由于用户的主账户现在可以访问应用程序创建的账户,他们可以将应用程序资产带到钱包管理的账户所在的任何地方。他们可以在市场上交易应用资产,或者与朋友分享。然而,与此同时,由于应用程序也可以访问帐户,它仍然可以为代表他们的行为提供无缝的用户体验。
使用这种混合托管模型,用户可以立即体验应用程序,障碍最小,并且没有风险。在此之后,如果他们愿意,可以自己控制自我托管账户,享受它带来的所有真正的所有权和自我主权。
五、混合保管和账户抽象的技术细节
1.创建账户
这一切是如何运作的呢?
在以太坊和许多其他区块链网络上,EOA是从公钥创建的。该密钥被散列,该散列的前160位成为该密钥控制的帐户的地址。这使得帐户创建独立于网络,但不可撤销地将帐户与该密钥绑定在一起。
流量使用一个特定的链上函数来创建帐户地址。然后,用户可以向流量帐户添加任意数量的密钥,并根据每个密钥的保管人添加和删除访问权限。这意味着需要一个交易来创建一个新地址。所以用户不能离线创建账户,但这也使流量帐户的所有权更加灵活。
用户可以在GitHub上看到一个完整的帐户创建示例,先看看这里的关键部分:
JavaScript
1 userPrivateKey := examples.RandomPrivateKey()
2 userPublicKey := flow.NewAccountKey().
3 FromPrivateKey(userPrivateKey).
4 SetHashAlgo(crypto.SHA3_256).
5 SetWeight(flow.AccountKeyWeightThreshold)
6
7 serviceAccountAddress, serviceAccountKey, serviceSigner :=
8 examples.ServiceAccount(flowClient)
9
10 createAccountTx, _ := templates.CreateAccount(
11 []*flow.AccountKey{userPublicKey},
12 nil,
13 serviceAccountAddress
14 )
15
16 createAccountTx.SetProposalKey(
17 serviceAccountAddress,
18 serviceAccountKey.Index,
19 serviceAccountKey.SequenceNumber
20 )
21
22 createAccountTx.SetReferenceBlockID(
23 examples.GetReferenceBlockId(flowClient)
24 )
25
26 createAccountTx.SetPayer(serviceAccountAddress)
27
28_ = createAccountTx.SignEnvelope(
29 serviceAccountAddress,
30 serviceAccountKey.Index,
31 serviceSigner
32 )
33_ = flowClient.SendTransaction(ctx, *createAccountTx)
首先,用户创建一个密钥对。这是很基本的事项。
因为在流量上,用户通过发送帐户创建交易来创建帐户,所以需要一个现有帐户来发送这一交易。这是ServiceAccount的工作。
createAccountTx接收用户的公钥,以便稍后控制新帐户,但是ServiceAccount(为交易签名并付款)处理其余的工作。在用户的应用程序中,将拥有这个服务帐户,这样就可以代表用户签署帐户创建交易,也为帐户创建提供资金。
2.混合托管
回到混合托管模式。应用程序可以为用户创建应用程序帐户,并将它们链接到其应用程序控制的公钥。然后,应用程序可以处理用户的交易和资产,甚至赞助他们的交易费用,就像任何托管账户一样。
稍后,当用户决定深入Web3生态系统并获得自己的钱包时,可以创建并保存指向应用程序托管帐户的AuthAccount Capability的链接,并将控制权委托给用户的钱包管理帐户。
用户可以在无钱包登录示例中看到这样的示例,其中应用程序执行多重签名交易,将用户的帐户链接到无钱包的登录,dapp托管的帐户到签名用户的钱包管理帐户。
六、结语
需要强调的是,在应用程序创建的帐户上授权访问是通过帐户上的链接Capability完成的,然后将其提供给用户。对于区块链帐户来说,这种帐户委托机制是全新的,它之所以成为可能,是因为多年来流量原生的帐户抽象。这种语言API账户链接功能对于流量上的账户来说是一个巨大的优势,此外还有许多其他功能——m-of-n多重签名、账户密钥更新等等,这些功能现在才开始在其他链上实现,它们都是新生的、非本地的账户抽象实现。
帐户抽象是一个强大的特性。在流量上,它支持混合托管模型,允许用户在注册时享受托管帐户的好处,同时允许他们随时将帐户纳入自我托管。这是一种全新的显著改进的用户体验,有望为Web3带来数百万用户。
原文链接:https://dzone.com/articles/solving-web3-onboarding-with-account-abstraction-a