【李先生带你玩 CITA】CITA 的账户与数字签名

相信大家都有去银行开设帐户的体验,感觉开设账户挺麻烦的,从而认为这是一件很严肃的事。

区块链世界里也有账户,下面大家可以先体验一下 CITA 的账户,然后我再和大家简单分享一下 CITA 账户背后的数字签名。

生成 CITA 账户

使用 cita-cli 生成一个区块链账户:

cita-cli key create
{
  "address": "0x34cf5832c76df8c772526f99454a7cdba8821a3e",
  "private": "0xae300ea6153027ffda80efb741b88cedc24dbee5e324b5268fbf3833e2c03418",
  "public": "0x476f296900e180571f07270f5a4810ad42c565fd2d4eb16ffe0869ff5a201bd5d3c2f68834e7e19a096b5ae1cb91b1c63695c9c68b650390a2bad73e44c20398"
}

至此,你已经在 CITA 上开户完成,你需要保管好你的私钥 (private),而 address 就是你的账户地址。

啊!这么简单!!这账户到底有没有用?

那接下来我们就在 CITA 的测试链 (https://testnet.citahub.com) 上体验一下这个账户的使用。

体验 CITA 账户

  1. 使用 cita-cli 连接 CITA 测试链
$ cita> switch --url https://testnet.citahub.com
[       url        ]: https://testnet.citahub.com
[       pwd        ]: /root/rivtower/code/github/digital-sign
[      color       ]: true
[      debug       ]: false
[       json       ]: true
[    encryption    ]: secp256k1
[ completion_style ]: List
[    edit_style    ]: Emacs
[   save_private   ]: false
  1. 尝试查看账户的 Token 余额
cita> rpc getBalance --address 0x34cf5832c76df8c772526f99454a7cdba8821a3e
{
  "id": 1,
  "jsonrpc": "2.0",
  "result": "0x0"
}

可以发现,测试链已经认识了这个帐户,并告诉你账户的 Token 为 0 。

  1. 到 CITA 测试链 水龙头 去为账户领取一定的 Token

按提示输入地址领取便可。

  1. 确认 Token 到账

再次使用 cita-cli 查看账户 Token 余额.

$ cita> rpc getBalance --address 0x34cf5832c76df8c772526f99454a7cdba8821a3e
{
  "id": 1,
  "jsonrpc": "2.0",
  "result": "0x21e19e0c9bab24"
}

可以看到余额已经发生了变化。账户有了余额,那你到底能不能 动它 呢?接下来就用你的账户私钥 动动看

  1. 将本账户下的 Token 转账一部分到另一个账户
  • 生成新账户
cita> key create
{
  "address": "0xb0a5f0f2c5d88e83b91d31086cde2ded4f2ff829",
  "private": "0x36b77e8ef0fde2a1ed7521403b9cc42a38fedf64f72abe559ea7bdd524db5634",
  "public": "0x6eb4e533ecb7b00bad8d023dce040332e923091d70858066805d6fdb3e2b4d51a355c646e92709b2087fbc394732585e23051b9af936848bb8669534fdc50ea8"
}
  • 转账 50 到 账户0xae300ea6153027ffda80efb741b88cedc24dbee5e324b5268fbf3833e2c03418
cita> transfer --address 0xb0a5f0f2c5d88e83b91d31086cde2ded4f2ff829 --private-key 0xae300ea6153027ffda80efb741b88cedc24dbee5e324b5268fbf3833e2c03418 --value
50
{
  "id": 4,
  "jsonrpc": "2.0",
  "result": {
    "hash": "0x3bb643abbb90b43040e59a3d8b620baafb9f98b1042e7cb946c34c6854eccd87",
    "status": "OK"
  }
}
  • 查看目标账户 Token 余额
cita> rpc getBalance --address 0xb0a5f0f2c5d88e83b91d31086cde2ded4f2ff829
{
  "id": 1,
  "jsonrpc": "2.0",
  "result": "0x32"
}

可以看到账户0xae300ea6153027ffda80efb741b88cedc24dbee5e324b5268fbf3833e2c03418 已经收到了 50 的余额。

CITA 账户背后的技术 - 数字签名

在上面的转账过程,CITA 是怎么通过私钥 (private )来动用你的数字资产的呢?其奥妙就在 数字签名 。当你发出 转账交易 时,cita-cli 会用你的私钥对交易进行数据签名,然后把交易与签名一起发送到测试链上。

测试链可以在不需要知道你的私钥情况下,使用你发的交易信息及数据签名恢复出你的账户地址。这是非对称加密算法与哈希算法提供的技术能力,大家可以注意到,CITA 每次新版本发布 的时候,都会发三个版本。其实就是其采用的非对称加密算法与哈希算法的不同,它们的账户系统也就不同。

为了让大家能直观感受一下 数字签名 , 我写了个简单的 demo , 有对技术感兴趣可以自行阅读其中的代码。也可以使用我做好的 docker 镜像来试用。

  • 使用你的私钥签名一段数据 abcdefg
$ docker run leeyr/digital-sign sign --data "abcdefg" --private-key "0xae300ea6153027ffda80efb741b88cedc24dbee5e324b5268fbf3833e2c03418"
Signature is : c05e106d5b1598ae6ef50ed17b1ae9b100d17e8e1ba4b2b45bf5627b836dc18c1b86e7d7937a42fbee532f1fb903c1f17ac49b826c135f6bfded05a6cac12ece00

你将获取一段签名数据。

  • 使用签名数据恢复你的账户
$ docker run leeyr/digital-sign recover --data "abcdefg" --sign "c05e106d5b1598ae6ef50ed17b1ae9b100d17e8e1ba4b2b45bf5627b836dc18c1b86e7d7937a42fbee532f1fb903c1f17ac49b826c135f6bfded05a6cac12ece00"
Address: 0x34cf5832c76df8c772526f99454a7cdba8821a3e
Public key: 0x476f296900e180571f07270f5a4810ad42c565fd2d4eb16ffe0869ff5a201bd5d3c2f68834e7e19a096b5ae1cb91b1c63695c9c68b650390a2bad73e44c20398

你可以发现,这里恢复出来的地址与你的账户是完全一致的。

上一篇 : 链数据的高可用杀手
下一篇 : 聊聊 CITA 的配置

2赞

这篇文章里的demo代码对我太有用. 我现在就是没看懂签名的方法, 导致写入操作都要使用cita-cli来完成, 而不能像读操作那样直接调JSON RPC.

是不是使用 SDK 更能帮到你?

对. 但是官方没有Python的SDK. 我自己实现了将智能合约映射到python对象, 已经用起来了. 只不过签名部分还没搞懂, 所以暂时先借助cli, 不签名的部分我都调的json rpc. 也能凑合着

恩,官方的确没有 pythone 的 SDK, 如果你希望使用 python.
你看一下 CITA repo 下的这些 code 对你有没有帮助,CITA 有很多集成测试使用的是这份 code:

欢迎提交PR,实现Python的SDK :grinning: 成为CITA的核心开发。

好的. 我整理一下发出来.

整理好了吗,能不能发出来了?
正想用Python SDK来使用CITA的存证功能

rust sdk里案例能详细点吗?