Jinghui Liao

A computer security PhD student who prefers blockchain and 6am sunlight and misses his family.

neo 的rust sdk

February 24, 2021

Property: Blog, Neo

Rust

2014年的时候有一个新的编程语言发布了,这个编程语言号称可以兼顾内存安全和高性能。他是一种可靠的高级编程语言,可以像Python这种语言一样用简洁的代码实现逻辑,但却可以以接近C/C++语言的速度运行。 它就是RUST语言。

Rust自发布以来就一直受到广大开发者的青睐,这样说大概还是太抽象,具体来说:

Rust已经连续五年(2016,2017,2018,2019,2020)在Stack Overflow开发者调查的“最受喜爱编程语言”评选项目中折取桂冠。

而在区块链领域,Rust则更是一股泥石流,势不可挡。比如 facebook的Libra,火币的Nervos,还有目前大热的波卡Polkadot等等。其实Rust和区块链几乎是天作之合,目前区块链面临的几大问题里:一是性能,几乎所有的区块链项目都在不停的迭代,想方设法去提升项目的交易处理速度,而Rust则是可以在兼顾开发效率的同时保证程序的执行效率,并行效率;二是安全性,安全问题兹事体大,可以说是整个区块链项目的生死线。不知道大家还记不记得当年EOS主网刚刚上线就被爆出安全漏洞。而合约里的整型溢出问题更是层出不穷,比如教育概念的EDU,直接因为一个溢出漏洞被撸到归零。

Neo

Neo本身是基于C#语言的,而C#这个语言虽然用来开发很舒服,但是其执行效率跟C/C++是没办法相比,毕竟C#执行起来相比于C/C++中间多了一层虚拟机。在neo2.0的时代,平均每15秒出一个区块,而且每个区块里需要打包的交易量不大,因此C#带来的限制还并不明显,但是在可预见的未来,neo将会不停的迭代,不停的优化去提升交易吞吐,随着neo技术团队突破掉所有的性能瓶颈做到最大的性能提升,那么C#终有一天会成为neo继续发展的掣肘。而同样的道理也是新晋区块链公链项目直接选择更高效的语言的重要原因之一。

SDK

由于我本人除了研究区块链,也研究可信执行环境。于是我在2020年疫情隔离期间其实是计划做出一个可以在Intel的安全处理器里执行的neo的SDK出来,这就需要我有一个基于C++的SDK。由于缺少调研,我就直接照着neo的官方core照猫画虎去写C++的版本,结果工作量忒大不说,刚把虚拟机写出来,我又实在因为同期的另一个科研项目对C++恨之入骨【C++可以说是一门非常简单的语言,特别好入门,但是C++又是一门很难的语言,开发效率极低。】进而失去了继续往下写的兴趣。

但是这段写C++SDK的经历也成了我研究Rust的SDK的一个触发点。前文提到,Rust作为一个非常有前景的编程语言,有着非常好的内存安全特性,既高效又安全当然也受到研究系统安全的人青睐。所以我在2015年的时候就对Rust有所耳闻,之后更是多次尝试学习。不幸的是,Rust虽然是一个开发效率很高的执行效率很高的语言,但是学习的曲线实在是太陡,之前几乎每次尝试学习都被劝退,每每学习,打开书是Rust,合上书是Last。

Rust又是如此重要。于是我决定我应该找一个项目来去做,不再用先学习再使用的方法,而是直接用项目里的一个个需求倒逼自己去学习。而Rust的neo-sdk则自然而然成了首选。

项目

开发Rust我用的是PyCharm+Rust插件,也用VSCode+Rust插件,毕竟都不是Rust专属的编译器,两个插件搭配起来才能实现一个完整的编译器工作。项目命名为neo-rs,参考别的项目命名习惯。

为了更快的实现最基础的任务,让SDK有可以跑起来的功能,我在最开始的时候使用了大量的第三方密码库,但是在功能验证成功之后就需要开发自己的密码学库,而不再以添加依赖的方式导入。这样做的原因是为了让整个项目的核心密码库变得可控,保证这部分代码不是由包管理器从网络获取。主要的困难的地方是不同的密码库也会依赖于不同的别的项目,甚至相同项目的不同版本。因此就需要在剥离依赖的同时也要在不同的版本之间做权衡,有时候甚至需要直接动手从头开始写以使其符合项目需求。但是由于rust的语言特性,几乎任何项目都有一大堆的依赖,完全梳理并剥离依赖工作量实在巨大,但是索性后面的任务过程中也会不断更新升级这个密码学库。目前已经导入的库有 aes,base58, ecdsa, hex, ripemd160, sha2。

目前项目已经完成的工作是私钥,公钥,地址,WIF的生成以及转换,以及对Nep2协议完整的支持。基本实现了钱包的功能。

运行效果:

% ./neo neo

Public Key:      0x03f9e9a50af13ccec64feedb45d558815ba6d3a3e8c3a727be7f97bb9eeca80f52
Private Key:     0x1d9d6b11b9570e50a8511de539be9d125dda022b7d65452acc03de3aa3e87d6c
WIF:             KxDH6p2nsKiYo5rvk8pvDSS2dPC2UBLoYeQu2Mq9ZnVPm1YfauSh
Address:         AHV5J1bVXAvM3eVDrCXx34U1QQnNKeKX1F

后续工作,后续会继续支持Nep6协议,完善钱包的导入导出,增加对SGX的支持,增加网络模块,增加合约交易等等。

项目地址:

Liaojinghui/neo-rs

Share This Post