Libra 是 facebook 推出的一种数字货币,和实际的法币挂钩,在我看来是‘真实’的货币,应该可以算是 M0。最近几个月尝试给 Libra 项目写一个 ruby 的客户端,最终形成了两个开源项目'casoer-ruby'和'libra_client_ruby':
A Ruby implementation of the LCS(Libra Canonical Serialization)
LCS(Libra Canonical Serialization) 是 Libra 中采用的规范序列化协议。它可确保内存里的数据结构在序列化的时候保证字节一致性。它适用于双方想要有效比较他们独立维护的数据结构。在共识协议中,独立验证者需要就他们独立计算的状态达成一致。共识双方比较的是序列化数据的加密散列。要实现这一点,在计算时,相同数据结构的序列化必须相同。而独立验证器可能由不同的语言编写,有不同的实现代码,但是都遵循同一个规范。
Cient APIs for the Libra network
Libra 网络采用的是 protobuf+grpc 的接口协议, 'libra_client_ruby'主要是对该协议的封装。安装方式很简单,标准的 gem 命令:
gem install libra_client
要访问 Libra 网络,参考下面的代码:
require 'libra_client'
client = Libra::Client.new(:testnet)
state = client.get_account_state("000000000000000000000000000000000000000000000000000000000a550c18")
state.balance #the balance of the account
state.sequence_number #the sequence_number of the account
在写这个库的过程中,碰到了一个难题。Ruby 目前不支持 SHA3 系列散列算法,包括 SHA3_224, SHA3_256, SHA3_384 and SHA3_512。但是 Libra 中使用的 Hash 算法是 SHA3_256。 我尝试自己实现了 Openssl 中 SHA3 系列函数的 Ruby 移植,但是pull request没有通过,最后放弃了。
由于 python 和 ruby 语法类似,且支持 SHA3_256,所以我尝试用 python 重写了一遍上面的两个库。而且 python 的版本支持完整的客户端功能,比如交易和钱包。
A Python implementation of the LCS(Libra Canonical Serialization)
Python Language APIs for the Libra network
等 ruby 支持了 SHA3, 也许考虑升级一些 ruby 的客户端。