Skip to main content

Command Palette

Search for a command to run...

EIP4337(三):Argent的实现思路 EIP4337(四):Contract wallet技术背景和产品概念

Published
1 min read

EIP4337(三):Argent的实现思路

本文非Vitalik的medium文章分析了,是从EIP4337出发,分析下可行的contract wallet 方案,要知道,layer2还没有较为出彩的contract wallet呢。

对于大部门Web3用户来说,小狐狸的类似操作界面,在没有出现飞跃式体验提升的前提下,更换使用习惯,是惯性成本非常高的。因此,基于小狐狸的Chrome插件模式,是一个较为稳妥的选择。

Argent是在layer2的zksync+zksnark实现了4337抽象钱包的一个项目:https://github.com/argentlabs/argent-x

从文档可知,https://docs.argent.xyz/wallet-connect-and-argent,使用EIP1217替换了传统的EOA的EIP712签名,这也带来了传统DApp兼容问题,因为过往的签名部分,是遵守EIP712的。

我们来看下插件实现的核心架构:

![截屏2022-07-04 上午10.56.18](/Users/jason/Dev/Documents/knowledgeBase/library/截屏2022-07-04 上午10.56.18.png)

完整的smart contract wallet四部分部分组成:

1.对EIP4337协议的实现,不同链,可能有不同的tricks。

2.适配DApp的wrapper,用来链接钱包,输出常规的provider等接口服务。

3.一个类似Metamask的Chrome plugin,包括relay服务(可定制,复杂)。

4.一个用来示范如何连接使用wrapper的DApp demo。

5.paymaster,工作量,可以后置(GSN基础上改造)

Open Nest startup!

基于历史黑客松合作的默契和信任,我们再出发,做一些有益的尝试!

https://github.com/proofofsoulprotocol/smart-contract-wallet-4337

History:

https://gitcoin.co/grants/6231/proof-of-soul-soulbound-token-issuanceattestation

EIP4337(四):Contract wallet技术背景和产品概念

UTXO和Account

Account是传统IT世界的概念,尤其在电商和财务系统的抽象模型中会用到,一般Account代表了账户体系,包括Balance,order book念,初始可能是零或者充值余额,之后是通过每次交易实时扣减,记录到独立的余额字段。当然,和账户关联的支付交易、购买交易,会通过账户的唯一Key,例如AccountID,以及联合主键或者外键进行索引和查询,从而提供账户服务。银行的账户服务,背后的核心逻辑,基本也是这些:存款(充值)、转账、自动扣减支付、自动收款、利息结息等等的。

而UTXO是Unspent Transaction output,直译是未花费交易输出,是比特币为了精简其架构设计,匹配Block,区块的架构而采用的一种设计。核心是没有明确余额而是靠计算。我们来看下一个比特币区块的数据结构:

{
  "hash":"00000000000000000018b0a6ae560fa33c469b6528bc9e0fb0c669319a186c33",
  "confirmations":1009,
  "strippedsize":956228,
  "size":1112639,
  "weight":3981323,
  "height":514095,
  "version":536870912,
  "versionHex":"20000000",
  "merkleroot":"5f8f8e053fd4c0c3175c10ac5189c15e6ba218909319850936fe54934dcbfeac",
  "tx":[
    // ...
  ],
  "time":1521380124,
  "mediantime":1521377506,
  "nonce":3001236454,
  "bits":"17514a49",
  "difficulty":3462542391191.563,
  "chainwork":"0000000000000000000000000000000000000000014d2b41a340e60b72292430",
  "previousblockhash":"000000000000000000481ab128418847dc25db4dafec464baa5a33e66490990b",
  "nextblockhash":"0000000000000000000c74966205813839ad1c6d55d75f95c9c5f821db9c3510"
}

可以看到,三个hash:hash、previousblockhash、nextblockhash以及merkleroot,是本数据块的核心自动,挂载的tx交易数据是从属关系。hash是保持整体区块之间的链接关系和唯一性的保障,merkleroot是当前区块的所有交易的树形结构的root,确保交易不被篡改。

而以太坊区块也是类似的机制:

{
   "jsonrpc":"2.0",
   "result":{
      "author":"0x00d8ae40d9a06d0e7a2877b62e32eb959afbe16d",
      "difficulty":"0x785042b0",
      "extraData":"0x414952412f7630",
      "gasLimit":"0x47b784",
      "gasUsed":"0x44218a",
      "hash":"0x4de91e4af8d135e061d50ddd6d0d6f4119cd0f7062ebe8ff2d79c5af0e8344b9",
      "logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
      "miner":"0x00d8ae40d9a06d0e7a2877b62e32eb959afbe16d",
      "mixHash":"0xb8155224974967443d8b83e484402fb6e1e18ff69a8fc5acdda32f2bcc6dd443",
      "nonce":"0xad14fb6803147c7c",
      "number":"0x2000f1",
      "parentHash":"0x31919e2bf29306778f50bbc376bd490a7d056ddfd5b1f615752e79f32c7f1a38",
      "receiptsRoot":"0xa2a7af5e3b9e1bbb6252ba82a09302321b8f0eea7ec8e3bb977401e4f473e672",
      "sealFields":[
         "0xa0b8155224974967443d8b83e484402fb6e1e18ff69a8fc5acdda32f2bcc6dd443",
         "0x88ad14fb6803147c7c"
      ],
      "sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
      "size":"0x276",
      "stateRoot":"0x87e7e54cf229003014f453d64f0344e2ba4fc7ee3b95c7dd2642cca389fa1efe",
      "timestamp":"0x5a10968a",
      "totalDifficulty":"0x1804de0c47ffe1",
      "transactions":[...],
      "transactionsRoot":"0xc2091b032961ca23cf8323ea827e8956fe6dda9e68d75bcfaa8b910035397e35",
      "uncles":[]
   },
   "id":1
}

同样有hash、parentHash、mixHash以及transactionsRoot,是和比特币类似的目的,保持区块链接和唯一性(不可篡改),以及当前区块的交易不可篡改的树形结构。

UTXO就是建立在上面的区块结构的Txs,对于某个地址的而言,它的余额由UTXO模型来提供,并非传统的Account模型,有一个绝对唯一的余额数字,而是所有Unspent Transaction output 在对一个交易进行输入,满足:inputs = price + change + fee,类似于你把身上所有10块、20块、100块等归属于你的UTXO,作为输入给Tx,Tx会扣除交易value(例如转账金额等,别人的UTXO)和矿工fee,剩下的余额change(你的新的UTXO)。

从这个角度出发,就用到了签名机制。

{
   "addr":"14uhqGYDEhqwfdoP59QdLWdt4ha5CHttwQ",
   "n":1,
   "script":"76a9142ae017a5bd24a3f935897085253e503fbfd66f4e88ac",
   "spent":false,
   "tx_index":335926477,
   "type":0,
   "value":21680000
}
   "txid":"5be7a9e47f56c98e5297a44df52da0475f448ece98bb51489103cdf70653092f",
   "hash":"5be7a9e47f56c98e5297a44df52da0475f448ece98bb51489103cdf70653092f",
   "version":1,
   "size":224,
   "vsize":224,
   "locktime":0,
   "vin": [...],
   "vout": [...],
   "hex":"0100000001a90b4101e6cbb75e1ff885b6358264627581e9f96db9ae609acec98d72422067000000006b483045022100c42c89eb2b10aeefe27caea63f562837b20290f0a095bda39bec37f2651af56b02204ee4260e81e31947d9297e7e9e027a231f5a7ae5e21015aabfdbdb9c6bbcc76e0121025e6e9ba5111117d49cfca477b9a0a5fba1dfcd18ef91724bc963f709c52128c4ffffffff02a037a0000000000017a91477df4f8c95e3d35a414d7946362460d3844c2c3187e6f6030b000000001976a914aba7915d5964406e8a02c3202f1f8a4a63e95c1388ac00000000",
   "blockhash":"0000000000000000000c23ca00756364067ce5e815deb5982969df476bfc0b5c",
   "confirmations":5,
   "time":1521981077,
   "blocktime":1521981077
}
{
   "vin":[
      {
         "txid":"672042728dc9ce9a60aeb96df9e9817562648235b685f81f5eb7cbe601410ba9",
         "vout":0,
         "scriptSig":{
            "asm":"3045022100c42c89eb2b10aeefe27caea63f562837b20290f0a095bda39bec37f2651af56b02204ee4260e81e31947d9297e7e9e027a231f5a7ae5e21015aabfdbdb9c6bbcc76e[ALL] 025e6e9ba5111117d49cfca477b9a0a5fba1dfcd18ef91724bc963f709c52128c4",
            "hex":"483045022100c42c89eb2b10aeefe27caea63f562837b20290f0a095bda39bec37f2651af56b02204ee4260e81e31947d9297e7e9e027a231f5a7ae5e21015aabfdbdb9c6bbcc76e0121025e6e9ba5111117d49cfca477b9a0a5fba1dfcd18ef91724bc963f709c52128c4"
         },
         "sequence":4294967295
      }
   ]
}

请参考最后一个的scriptSig,因为每笔交易,如同签名描述,都会有多个UTXO作为输入,输入的就是UTXO+签名。

一句话概述:传统系统面临的问题是高并发,因为都要去修改那个Account的唯一余额,对数据库来说,就是一次互斥锁定,而一个表在物理上的锁定是有限的,带来了并发的问题,当然,也引入了队列等等技术手段来解决。而UTXO是一张张纸币一样的余额,归属于某个地址所有,可以并行的处理UTXO而不会带来并发问题,当然也有缺点,例如双花的可能。

以太坊使用的Account账户模型,核心字段:nonce, ether_balance, contact_code, storage,这一类账户有两种:无代码的被私钥控制的Account,以及有代码的合约Account,都可以拥有余额。合约账户一般拥有的是ERC20、ERC721等类型的合约账户,也就是大家所熟知的发行Token和NFT。

因为不需要使用UTXO的输入输出模型,以太坊交易很简单:

{
   "blockHash":"0xb4a992ff99a487db8421f516be998920f06dfe5d355d88e3b7f22b7422e6340d",
   "blockNumber":"0x24f85c",
   "chainId":null,
   "condition":null,
   "creates":null,
   "from":"0x8b56adcf332ff80a1f1bf433975dcb28b730d110",
   "to":"0xe94b04a0fed112f3664e45adb2b8915693dd5ff3",
   "value":"0x10d43fb8311ca800",
   "gas":"0x2062a",
   "gasPrice":"0x560aab7c5",
   "hash":"0xfea448d11cfa863c8b3c38d3b65649e66c1957f9ac16638e3a0edff45a6b3d84",
   "input":"0x0f2c9329000000000000000000000000fbb1b73c4f0bda4f67dca266ce6ef42f520fbb98000000000000000000000000e592b0d8baa2cb677034389b76a71b0d1823e0d1",
   "nonce":"0x3fe",
   "publicKey":"0x765b0f012e49f6a4cc5c917fb176984b24814bdaf5f9464db1a7f9ffcc730cb678f69e49f78aa9de8249cce138bbc25cf8842374d8d09089dff7f1ef6906f4fb",
   "r":"0x4275d35821dec971f6d58c2adae077ffcdfa3ec74af542a2d29ab4e5239d8b25",
   "raw":"0xf8b48203fe850560aab7c58302062a94e94b04a0fed112f3664e45adb2b8915693dd5ff38810d43fb8311ca800b8440f2c9329000000000000000000000000fbb1b73c4f0bda4f67dca266ce6ef42f520fbb98000000000000000000000000e592b0d8baa2cb677034389b76a71b0d1823e0d11ca04275d35821dec971f6d58c2adae077ffcdfa3ec74af542a2d29ab4e5239d8b25a036221b525c758c45e60f964eec698ae33208dfa74bea7f77dff002ceec418b0a",
   "s":"0x36221b525c758c45e60f964eec698ae33208dfa74bea7f77dff002ceec418b0a",
   "standardV":"0x1",
   "transactionIndex":"0x8",
   "v":"0x1c"
}

from、to,以及单独出来的gas和gas price,交易核心字段:nonce, from, to, value, input,和UTXO的类似。


以上如果感兴趣,可以自行搜索相关概念学习。

参考资料:https://draveness.me/utxo-account-models/(写了一大半才发现这个文章不错,借鉴了交易数据)

More from this blog

让你的私钥随时更换,可以四处旅行

是的基于社交恢复和社区运行的TEE KMS,普通个体的私钥可以依赖多层安全机制:passkey+Email+社区KMS(硬件安全)+AA多签(可适配多种签名机制,增加抗量子签名模块)。听起来非常棒!是人类数字未来中需要的东西。下面是我的一个研究项目,进行中,有经验的大牛可以指点一下(嵌入式和硬件钱包开发、TEE、抗量子等等)。 STM32MP157F-DK2 Development Project STM32MP157F-DK2 开发项目 🇬🇧 Jump to English Vers...

Jan 25, 20263 min read

人性之光-以自由之名

以自由之名 v0.1.5 有点怪怪的标题,原谅理工男的简单和直接。 先分享一点感触和认知:某个角度看,人性是想象力、创造力和情感,是人类独有的特质。 人性是区别于AI和机器人,以及其他生命和造物的独有内核。人性是一种对自由的追求:发挥你的想象力、创造力,拥有自己的情感,是人存在的一种方式,这种方式,称为自由。 作为普通个体,想在人类社会拥有自由,除去国家和法律赋予的基础保障和基本权利之外,哈耶克有个观点是时间、空间和选择的范围,是自由的基础保障;而福柯则反向给出了规训的方式:时间空间和力量(并非...

Jan 25, 20261 min read

How to play with AI vibe coding?

我们要和 AI 沟通,要总结几个经验,供大家参考(血泪教学,迭代无数次): 三个重点 重设计、三层文档体系、渐进式开发。 第一点 最重要就是设计一定要占据你开发时间的一半以上,包括研究,包括和 AI 的交互讨论,包括提取一些专题,然后跟其他的 AI 交流生成深度的报告,包括自己阅读相关的报告和分析,以及一些范例的 repository。 第二点 要完整的文档体系,不管哪一种,都要跟随文档体系来去不断地迭代你的和 AI 交互的过程;我现在使用的是,嗯,三层的文档管理体系。第一层呢是backlog...

Aug 17, 20252 min read

It is Fun for me.

jFlow: from research to production 创新之路:最有趣的探索之路。 创新之路 Road of Exploration Research Input=Idea:描述你的 idea,进行严谨的论证过程,逻辑结构类似于缩小版本的 SCI 论文。通过分析论证,得出结论,是真正有价值创新。 output=Solution:定义你的产品,包括产品定位、目标用户、核心功能、商业模式,让团队、社区、早期投资者、用户、合作伙伴等,都快速了解你的产品的价值所在。 Devel...

Aug 12, 20251 min read

我的AI小助手:RAG 本地测试记录(updating...)

预期: 数据: 本地个人计划和隐私、正常论文相关的科研、业界跟踪和研究分析,三大类都存储在本地,不要流出个人电脑。 初步的7B模型(本人MiniMac的上限)进行大体分析。 可以使用外部deepseek和grok,claude等外部API,但沟通内容是隔离和脱敏的,最简单就是7B分析的结论,进行隐私脱敏(自行设定脱敏规则)和单独目录存储(独立知识库),这个动作是离线断网进行。 然后针对沟通外部的独立知识库,可以充分利用外部大模型能力。 个人计划是使用雷电连接mac book和mac m...

Mar 15, 20251 min read

jLab

69 posts

It is my Lab for curiosity!

eip4337, smart contract wallet