EOS开发者日志 2017 6 30

原文链接:https://steemit.com/eos/@dan/eos-developer-s-log-stardate-20176-30

这周,block.one的区块链c++开发团队已经招了4位新成员,而且还在面试更多的人。新招的人也已经开始贡献代码了。

移除已注册消息schema

由于已经转移到了WebAssembly (WASM),我们必须重新估量之前的一些设计,因为这些设计是基于使用wren进行的。由于wasm是语言独立的,每个应用都要提供不同的wasm,来解析发送到应用的消息。这意味着abi(应用二进制接口)要由wasm解析来定义,而且不是我们之前内置的注册消息的类型和格式。

由于区块链无法强制执行消息schema,每个合约都必须独立地进行解析和验证输入进来的二进制数据,所以我们决定把区块链定义的消息schema移除掉。这使得应用开发者拥有了更多的权力。

修改账号名称结构

这个星期的最大的修改就是把账号名称从256位字符串改成60位整数,使得更符号人们的阅读习惯。这个改变把账号名称限制在12个小写字母加几个数字的长度内。 twitter账号的平均长度也就12个字符。

这个修改主要是基于带宽,内存和性能的考量。从应用逻辑的角度来看,一个账号名称是一个独一无二的标识符,贯穿于整个应用的使用。旧的abi会把这些账号名称序列化为前缀长度字符串,还包括一个计算加强的解包过程。

把账号名称结构转换为宽度固定的整数,我们在性能上获得了不少提升,但是开发者可能会不太喜欢,因为这加大了开发的复杂性。为了解决这个问题,我们把这个整数打印为base32格式的,使得账号更符合人们的阅读习惯。

使用名称服务合约来注册的话,还可以支持更长的名称。

经过这次修改,一次典型的消息发送将会缩小75%,这使得当你处理大批量的消息发送的时候,性能会有极大提升。

从wasm解析浮点数

我们更新了wasm的处理过程,可以检测到浮点数操作,然后拒绝浮点数操作,因为浮点数会导致一些不确定的行为发生。

对wasm 运行时进行沙箱操作

在把检查点(checkpoint)注入到wasm方面,我们取得了极大的进展。这使得我们可以对运行时进行检查,当执行时间太长的时候中止任务。这是运行去信任代码的重要组成部分。

新的c++Simplecoin

在之前的一篇文章中,我用c写了一个poc(概念证明proof-of-concept)的货币智能合约,实现了每秒5万次的交易量。之前我说我们可以把语法整理一下,今天,我十分高兴地向大家展示一下用c++来实现,用wasm编译执行的simplecoin。通过使用一个紧凑的generating并把交易push到区块链的循环,在单线程中从一个账号转账到另一个账号的性能达到了8万 tps。

在实际情况中,性能可能会有上下的浮动,这取决于展开的架构,所以现在就下判断还为时尚早。我们的测试都是在一台4Ghz Intel Core i7 的 2014 iMac 下进行的:

struct Transfer {
  uint64_t    from;
  uint64_t    to;
  uint64_t    amount;
  char        memo[];
};
 
static_assert( sizeof(Transfer) == 3*sizeof(uint64_t), "unexpected padding" );
 
struct Balance {  uint64_t    balance; };
 
void on_init() {
  static Balance initial = { 1000*1000 };
  static AccountName simplecoin;
  simplecoin = name_to_int64( "simplecoin" );
 
  store( simplecoin, initial ); 
}
 
void apply_simplecoin_transfer() {
   static Transfer message;
   static Balance from_balance;
   static Balance to_balance;
   to_balance.balance = 0;
 
   readMessage( message  );
   load( message.from, from_balance );
   load( message.to, to_balance );
 
   assert( from_balance.balance >= message.amount, "insufficient funds" );
   
   from_balance.balance -= message.amount;
   to_balance.balance   += message.amount;
   
   if( from_balance.balance )
      store( message.from, from_balance );
   else
      remove( message.from );
 
   store( message.to, to_balance );
}

现在的代码不仅更整洁,更易读,生成的wasm代码也更短更少了。这既能节约时间又能节约空间,而这些都是因为把账号名称和abi做了修改。在这例子中,abi从数据库中使用了一个零解析的拷贝,把它用到了c++结构中。而且所有的账号名称都是固定长度的。

你可以在这个连接中查看这些代码:代码链接

结论

EOS的开发团队正在成长,技术也在进步,即使是在单线程中运行依然能达到较高的性能。请保持关注,获得最新消息。