开源区块链钱包Cashbox技术实现(二)_腾讯视频
1、目前Cashbox 链相关功能实现是通过调用动态库来实现,什么是动态库,为什么我们要使用动态库?
关于动态库,这个概念在C/C++的开发中比较常见,我们可以简单的理解为一个包含底层基础功能的集合,供上层应用直接调用,不用关心底层的具体实现。在终端设备应用开发中是比较常见的技术选择。结合Cashbox这款应用的特殊性,使⽤ Flutter + 动态库这种技术实现⽅案,使得我们只需要做简单的接⼝适配就能够在Android、IOS、PC平台实现钱包管理功能,这样的选择降低了开发难度,同时也提⾼了开发的效率。
2、在Cashbox里面使用的编程语言是最近大热的rust,在选择编程语言的时候为什么会考虑使用Rust呢?
Rust是⼀门具有安全性、⾼性能,现代化特点的系统级编程语⾔,使⽤Rust开发的系统具有可靠的稳定性。就拿在Cashbox开发的动态库开发来说,与经常使⽤C/C++来对⽐,具有很明显的优势:
1)数据安全,是选择使用rust最重要的一个原因,按照rust使用规则编写,编译通过的代码在运⾏阶段不存在段错误,空指针、缓冲区溢出、数据竞争问题等,确保了程序的稳定性,可靠性,同时还有接近C/C++性能表现。
2)开发效率,rust作为⼀门现代化的系统级编程语⾔,具有类似Java等⾯向对象的特征。在熟悉了rust语言特性之后,能够明显的感受到Rust语⾔表达式具有很强的表现能⼒,良好的代码组织能够很⾼效的实现想要的效果;
3)跨平台编译,具有统一、简单的编译方式,只需要准备好需要编译的⽬标平台依赖库,使⽤Cargo相关命令,指定希望编译标平台参数,就能编译出满⾜⽬标平台的⽂件;
4)依赖管理,通过Cargo.toml文件能够很⽅便的实现程序的依赖项以及版本管理;
关于Rust的特性还有很多,对于Rust还不了解的同学,可以去rust官方网站查看相关内容介绍。
3、现在Cashbox实现了哪些功能?
在⽀持链⽅⾯,当前仅提供以太坊平台( 主链 和 Ropsten )相关功能,⽀持的功能如下所⽰
1)助记词⽣成,⽣成满⾜Bip39格式的助记词,通过该助记词⽣成对应链上的地址,该地址满⾜BIP44协议 的要求;
2)多钱包管理,允许⽤户同时创建多个钱包,钱包类型可以是测试钱包和正式钱包,其中每个钱包下允 许⽤户关联不同类型的链。在钱包管理中,提供⽤户私钥使⽤确认码修改、助记词导出、以及针对钱 包的增删改操作;
3)代币管理,针对以太坊平台存在各种ERC20代币,⽤户在不同的ERC20合约下可能拥有balance,允许⽤户根据⾃⼰的实际情况关联相应的代币,同时提供针对代币的增删改操作;
4)交易构造,根据调⽤端传递的参数,能够构造满⾜链交易格式的签名数据,实现钱包的离线签名功能,签名后的结果调⽤端可以直接发送到以太坊⽹络中进⾏交易的验证;
5)转账交易解码,针对在转ETH或者ERC20 Token过程中填写的备注信息,提供解码功能让⽤户填写的信息能够在APP界⾯上正常显示;
6)信息签名,允许⽤户使⽤⾃⼰的私钥,对任何需要签名的场景进⾏签名;
需要说明的一点:动态库在使⽤阶段是没有任何⽹络相关操作,确保⽤户保存的助记词、相关密钥的安全。
4、对于不熟悉区块链的开发者,可能不是很明白什么是Bitcoin SPV,简单介绍一下Bitcoin SPV?
Bitcoin SPV指的是在bitcoin网络上进行简单支付验证。当前主流区块链用户账户数据保存,主要分为UTXO和账户模型。由于UTXO的特点造成了在bitcoin平台进行余额管理、交易构造的复杂性。在区块链的世界中,“去中⼼化”是我们比较关心的一个技术点。整个区块链的相关概念都是建⽴在去中⼼化的基础上。以bitcoin平台为例,链的所有节点构成了⼀个完整的P2P⽹络,在网络中每个节点(peer)都是对等。⼀个完整的bitcoin节点,它是由钱包,矿⼯,完整的区块数据和⽹络路由这四部分组成的。虽然不同的⽹络节点是对等的,但是他们承担的意义是不⼀样的。传统的bitcoin节点,因为要验证完整的数据,所以要存储⼤量的区块数据。截⽌⽬前,⼀份完整的bitcoin区块数据已经超过300G。由于受限于网络状况、存储成本、设备计算性能等的限制,要在所有的设备上同步完整的区块数据是不现实的,⽐如我们常⽤的智能⼿机就不可能存储数百G的数据。SPV技术的出现就是为了解决上述问题。SPV只需要下载区块头,只需要下载几百M数据即可。SPV技术的使⽤,使得在⼿机上使用完全去中心化的bitcoin钱包成为可能。这种运⾏SPV节点的应⽤,我们称之为轻钱包。
Cashbox的去中⼼化钱包就是建⽴在上⾯完整的SPV概念之上的钱包。我们在实现的过程中,也研究过其他开源技术的钱包,存在⼀个普遍的问题不够去中⼼化,或者不符合SPV的概念。因为现有实现的钱包,存在UTXO验证的难点,所以⼤多数钱包是有⾃⼰的后端的。传统钱包需要连接服务商的后端,后端则运⾏完整⽐特币节点来获取目标地址的UTXO数据。⽽我们的⽐特币钱包,则是完全基于之前提到的SPV概念,⽆需搭建⾃⼰的后端,利⽤原⽣的⽐特币⽹络协议,钱包端仅需存储2、3百兆的SPV数据头。根据数据头中包含的信息,利⽤⽐特币的⽹络协议,直接连接⽹络中的节点获取需要的数据,完全不需要完整的后端⽀持。
Cashbox的 SPV钱包,⼀旦运⾏,所有的数据完全存储在⽤户的⼿机上。我们不需要后端⽀持,所以⽆需和我们的后端数据交互,⽤户完全不⽤担⼼⾃⼰的隐私泄露。真正符合区块链世界中的去中⼼化概念。是我们在区块链上应⽤的探索和对区块链世界去中⼼化的探索。
5、Substrate是什么以及使用Substrate能够做什么?
Substrate 是⼀个区块链开发框架,包含所有链都应该具备区块链系统的基础部分实现,⽐如:共识系统、 p2p连接管理、节点发现、交易⼴播、存储系统、交易池管理、RPC接⼝。
直接当节点使⽤,通过配置包含默认runtime的创世块json格式⽂件,就可以运⾏属于你⾃⼰的区块链 节点;这种⽅式提供了最低的⾃由度,只允许你改变位于创世块⽂件中runtime模块可配置的参数,⽐ 如:balances, staking, block-period, fees, governance ;
使⽤Substrate frame,这种⽅式为你提供了极⼤的⾃由度,来编写⾃⼰的区块链逻辑,允许你更改数据 类型,从模块库中选择通⽤模块,还可以添加⾃定义的模块。由于它是通过链上逻辑直接控制的,因 此可以在不触及区块⽣成逻辑的情况下进⾏很多更改。如果是这种情况,则可以使⽤现有的 Substrate ⼆进制⽂件进⾏区块⽣成和同步。如果需要修改区块⽣成逻辑,则必须构建⼀个新的⼆进 制⽂件,包含新的区块⽣成逻辑,然后交由验证⼈使⽤。
可以忽略整个FRAME,使⽤最终编译结果为WebAssembly的任何语⾔来重新设计和实现整个Runtime 逻辑。假如编译⽣成的WebAssembly⽂件能够与Substrate的区块认证逻辑兼容,则可以通过这个 WebAssembly⽂件构造新的创世块,并可以在基于rust编写的substrate客户端运⾏。如果不兼容,那么需要更改客户端的区块⽣成逻辑,甚⾄可能会更改区块头和区块序列化格式。
就开发⼯作⽽⾔,这是迄今为⽌使⽤ Substrate 最为困难的⽅法,同时也为你提供了最⾼的⾃由度进⾏创新。当前⽐较热门的跨链平台波卡(PolkaWorld)就是使⽤Substrate框架之上进⾏开发的。
GitHub开源链接
区块链数据协议层:https://github.com/scryinfo/dp
组件Dot:https://github.com/scryinfo/dot
基础库:https://github.com/scryinfo/scryg
Cashbox: https://github.com/scryinfo/cashbox
city_client: https://github.com/scryinfo/city_client
city_server: https://github.com/scryinfo/city_server
下载 Cashbox: (也可点击阅读原文下载)
https://cashbox.scry.info/cashbox/api/apk/downloadlatest
网友评论