Android Wallet Poc 预览
开发⼀个钱包所需要的基本能⼒
1. ⽀持 SHA3-256 的哈希算法。
2. 安全的随机数。
3. ED25519 的⽣成公钥和签名能⼒。
4. LCS 编码解码能⼒。
LCS 官⽅规范:https://github.com/libra/libra/blob/master/common/canonical_serialization/README.md
5. 相关编程语⾔的 Protobuf 编译能⼒,gRPC 的调⽤能⼒。
⽣成公私钥、地址
⽣成私钥
可以使⽤安全随机数随机出⼀个 512 位的随机数即可作为私钥使⽤。
(这⾥我们不考虑使⽤助记词⽣成私钥的问题)
⽣成公钥
通过 ED25519 椭圆曲线使⽤私钥⽣成公钥。⽣成地址对公钥进⾏ SHA3-256 得到地址。再转换为 HexString 就是我们⽇常⽤的地址。
⽣成组合交易
2019.9.20 测试链重点更新内容
准备⼯作
1. 获取最新的所有 ProtoBuf ⽂件
交易相关 proto ⽂件
(https://github.com/libra/libra/tree/testnet/types/src/proto)
mempool proto ⽂件
(https://github.com/libra/libra/tree/testnet/mempool/src/proto)
mempool shared proto ⽂件
(https://github.com/libra/libra/tree/testnet/mempool/src/proto/shared)
gRPC 相关 proto ⽂件
(https://github.com/libra/libra/tree/testnet/admission_control/admission_control_proto/src/proto)
2. 将 ProtoBuf 根据相关编程语⾔进⾏编译。详情参考 Protobuf 使⽤⽂档
3. 使⽤ gPRC 发送交易。gRPC 接⼊⽂档
4. 编译 Libra 节点,
使⽤ libra/target/debug/compiler 去编译peer_to_peer_transfer.mvir ⽂件,
得到结果内容是⼀个 JSON 字符串。编译流程详情参照ir_to_bytecode
编译结果示例:
交易结构
交易结构伪代码展示,与 LCS 序列化顺序展示
组装交易注
(每个语⾔都不同,请⾃⾏摸索)
1. 构建 Address TransactionArgument 对象
2. 构建 Amount TransactionArgument 对象
3. 构建 Program 对象
4. 构建 RawTransaction 对象
签名交易
1. 使⽤ LCS 序列化 RawTransaction,得到 txn。
2. 对 RawTransaction@@$$LIBRA$$@@ 字符串进⾏ SHA3-256 得到盐。
3. 将 盐 和 txn 拼接进⾏ SHA3-256 得到 shaTxn。
4. 然后使⽤ ED25519 和私钥对 shaTxn 签名。
组合签名交易 SignedTransaction
将 SignedTransaction 使⽤ LCS 序列化得到 signedTx
通过 gPRC 发送交易
1. ⾃⾏了解 gRPC 相关的使⽤。
2. 组合 SignedTransaction 对象(⾮⾃⼰写的,⽽是 ProtoBuf ⾥⾯的),将 signedTx 设置到SignedTxn。
3. 组合 SubmitTransactionRequest 对象,将上⾯构建的 SignedTransaction 对象设置到SignedTxn 中。得到 SubmitTransactionRequest。
4. ⾃⾏查看 AdmissionControl ⽂件编译出来的结果。
使⽤ AdmissionControl 中submitTransaction()
gRPC ⽅法发送 SubmitTransactionRequest 交易。
查询余额以及 SequenceNumber
使⽤ AdmissionControl 中
updateToLatestLedger() gRPC ⽅法查询账户信息。
1. 组成 GetWithProof.GetAccountStateRequest 对象,设置查询地址 Address 得到
GetAccountStateRequest。
2. 组合 RequestItem 对象将
GetAccountStateRequest 添加到 GetAccountStateRequest 组成RequestItem。
3. 将组成的 RequestItem
添加到 UpdateToLatestLedgerRequest 得到
updateToLatestLedgerRequest。
4. 使⽤ AdmissionControl
中 updateToLatestLedger()
发送 updateToLatestLedgerRequest。
5. 将 gGRPC 结果进⾏解码,获取 余额以及 SequenceNumber
解码 UpdateToLatestLedgerResponse
1. 从中获取 responseItem 获取
GetAccountStateResponse
的 accountStateWithProof 的 blob。
2. 然后使⽤ LCS 解码 blob。
3. 通过 LCS 解析数组,然后循环解析数组 Item。
4. Item 可以读取出两个 Bytes,第⼀个为 key,第⼆个为 value。
5. 解析 value。读取⽅法请实现 LCS 编解码,具体请参照⽂章开头。
Android Wallet Poc 下载链接
https://fir.im/ghup
社区贡献
下⾯是我们开发团队给Libra提交的代码,已被Libra开发团队接纳到Libra代码中:
【BitTribeLab】BitTribe Lab是一个全球创新实验室(节点)网络,以建设去中心化未来信息基础设施和去中心化金融(Defi)新世界为愿景,邀请思想家、科幻小说爱好者、技术极客、开源软件开发者等等加盟。
欢迎添加BitTribeLab【微信号:BitTribeLab123】,回复”技术“,进入BitTribeLab技术开发者社区/交流群,一起探讨技术、交流思想,共同推进区块链技术的发展及应用。