如何开发⼀款移动端 Libra 钱包

Android Wallet Poc 预览

如何开发⼀款移动端 Libra 钱包_第1张图片

如何开发⼀款移动端 Libra 钱包_第2张图片

 

开发⼀个钱包所需要的基本能⼒

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

编译结果示例:

如何开发⼀款移动端 Libra 钱包_第3张图片

交易结构

交易结构伪代码展示,与 LCS 序列化顺序展示

如何开发⼀款移动端 Libra 钱包_第4张图片如何开发⼀款移动端 Libra 钱包_第5张图片

如何开发⼀款移动端 Libra 钱包_第6张图片

如何开发⼀款移动端 Libra 钱包_第7张图片

组装交易注

(每个语⾔都不同,请⾃⾏摸索)

 

1. 构建 Address TransactionArgument 对象

如何开发⼀款移动端 Libra 钱包_第8张图片

2. 构建 Amount TransactionArgument 对象

如何开发⼀款移动端 Libra 钱包_第9张图片

3. 构建 Program 对象

如何开发⼀款移动端 Libra 钱包_第10张图片

4. 构建 RawTransaction 对象

如何开发⼀款移动端 Libra 钱包_第11张图片

签名交易

1. 使⽤ LCS 序列化 RawTransaction,得到 txn。 

2. 对 RawTransaction@@$$LIBRA$$@@ 字符串进⾏ SHA3-256 得到盐。

3. 将 盐 和 txn 拼接进⾏ SHA3-256 得到 shaTxn。

4. 然后使⽤ ED25519 和私钥对 shaTxn 签名。

 

组合签名交易 SignedTransaction

如何开发⼀款移动端 Libra 钱包_第12张图片

将 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 编解码,具体请参照⽂章开头。

如何开发⼀款移动端 Libra 钱包_第13张图片

Android Wallet Poc 下载链接

https://fir.im/ghup

如何开发⼀款移动端 Libra 钱包_第14张图片

社区贡献

下⾯是我们开发团队给Libra提交的代码,已被Libra开发团队接纳到Libra代码中:

如何开发⼀款移动端 Libra 钱包_第15张图片

 

【BitTribeLab】BitTribe Lab是一个全球创新实验室(节点)网络,以建设去中心化未来信息基础设施和去中心化金融(Defi)新世界为愿景,邀请思想家、科幻小说爱好者、技术极客、开源软件开发者等等加盟。 

 欢迎添加BitTribeLab【微信号:BitTribeLab123】,回复”技术“,进入BitTribeLab技术开发者社区/交流群,一起探讨技术、交流思想,共同推进区块链技术的发展及应用。

你可能感兴趣的:(如何开发⼀款移动端 Libra 钱包)