认识下以太坊Clef—独立交易签名器

一、初识

以太坊go-ethereum在1.8.4版本中就开始引入了Clef,并在1.9.0版本中进行了较大的升级,其主要目的是以一种更安全、独立的方式替代以太坊节点的账号管理模块。

1、Clef是什么

官方文档对Clef的描述是:

Clef最终目标是代替Geth的节点账号管理,可用来对交易进行签名。Clef可以使DApp不必依赖Geth的帐户管理,当DApp需要对数据(或交易)进行签名时,可以将数据发送给Clef,在经过授权同意后,Clef将把签名返回给DApp。

从官网的描述中,并没有看出Clef的独特之处,甚至是存在的必要。账号管理在Geth的JSON-RPC API中提供的personal命名空间下的方法就挺全面的。交易签名功能在web3中也有提供。那么为什么要独立出一个Clef模块呢?

2、为什么要有Clef

Clef本质上是一个独立的交易签名器。Clef 背后的思想是将帐户管理与Geth客户端其它功能分开。Clef通过 IPC 或 HTTP 暴露了一个轻量API,可以被Dapp用作签名工具。

Clef最大的特点是提供了:

  • 请求确认,实现一方请求一方确认;
  • 规则引擎,实现自动化请求确认。

二、探索

1、Clef启用

初始化
启用Clef服务需要先进行初始化,初始化时需要输入一个密码,这个密码是用来加密master种子的。初始化命令:

clef init

启动服务
初始化后就可以启动服务了,启动时我这里指定了keystore目录、chainid、开启了HTTP-RPC服务,端口使用模块8550

clef --keystore ./keystore/ --chainid 4 --rpc

请求测试
启动成功后可以重新打开一个shell,运行查看账号列表的命令,进行简单测试,命令为:

echo '{"id": 1, "jsonrpc": "2.0", "method": "account_list"}' | nc -U ~/.clef/clef.ipc

在clef服务的shell窗口中,此时可以看到是否授权查看,输入y后即授权通过。如下图所示。

image.png

更多命令可查看官网进行使用。

2、规则引擎

Clef的规则引擎是一个很强大的东西,可以通过设置规则,让某些请求自动批准执行。

比如我们上边的查看账号列表的命令,需要Clef管理员手动确认,我们通过配置如下规则(一段js代码),可以实现免授权。

function ApproveListing() {
    return "Approve"
}

规则文件计算hash

>  sha256sum rules.js
8d089001fbb55eb8d9661b04be36ce3285ffa940e5cdf248d0071620cf02ebcd  rules.js

证明规则文件
证明规则文件的目的是防止有人对规则文件进行修改,这里将规则文件的hash使用attest命令进行证明。

> clef attest 8d089001fbb55eb8d9661b04be36ce3285ffa940e5cdf248d0071620cf02ebcd

使用规则文件启动clef

clef --keystore ./keystore/ --chainid 4 --rpc --rules rules.js

此时,我们在运行获取账号列表命令,不需要批准就可以获得结果。

更复杂的规则可参考官网文档:https://github.com/ethereum/go-ethereum/blob/master/signer/rules/rules.go

3、外部API

客户端可以通过外部API与Clef服务进行交互,Clef支持的外部API有:

  • account_new 创建账号
  • account_list 列表账号列表
  • account_signTransaction 交易签名
  • account_signData 签名数据
  • account_signTypedData 对符合EIP712的结构化数据进行签名
  • account_ecRecover 解析已签名数据对应的账号地址
  • account_import 账号导入
  • account_export 账号导出

可以看到外部API和Geth中的账号管理的personal模块提供的方法类似。

4、UI API

除了外部API,Clef也提供了UI API,通过--stdio-ui命令可以开启一个本机的基于控制台的标准输入输出UI。

通过集成UI API的接口,可以对签名器进行可视化。目前已有的可视化签名器有:

5、与Geth整合

在Geth v1.9.0内置了通过--signer <API endpoint>将本地或远程Clef服务用作帐户管理。

$ geth --rinkeby --signer=~/.clef/clef.ipc console

> eth.accounts
["0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3", "0x086278a6c067775f71d6b2bb1856db6e28c30418"]

> personal.listWallets
[{
    accounts: [{
        address: "0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3",
        url: "extapi://$HOME/.clef/clef.ipc"
    }, {
        address: "0x086278a6c067775f71d6b2bb1856db6e28c30418",
        url: "extapi://$HOME/.clef/clef.ipc"
    }],
    status: "ok [version=6.0.0]",
    url: "extapi://$HOME/.clef/clef.ipc"
}]

> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[0]})

在发起查看账号列表时,需要我们在Clef服务中进行确认。

三、后话

虽然Clef已经发展了2年多,但一直没有真正应用起来,更没有实现其替代Geth节点的账号管理模块的目标。究其原因,我认为有三点:

  1. 应用场景受限。在Dapp应用中,一般使用MetaMask或其他钱包,用户使用自己的以太坊账号进行交易签名,而不会用到节点中的账号。
  2. 使用成本高。在一些特定场景(如溯源)会使用一个服务账号发起交易,这时候就可以使用Clef进行签名,但前提是需要业务方维护一个Clef服务,无疑是增加了业务成本。
  3. 有可替代方案。对与节点的账号管理与消息签名都有其他的方案,Clef并不是唯一的。

四、参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351