EOS - Журнал Разработчиков 20176.3


Первод статьи


На этой неделе команда C++ разработчиков block.one блокчена пополнилась на 4 человека, и еще несколько в стадии набора. Новые люди уже начали вносить изменения в код проекта.

Удаление схем сообщений по-умолчанию

С движением в сторону WebAssembly (WASM) мы переоцениваем некоторые наши предыдущие архитектурные решения, основанные на использование Wren. Так как WASM не зависит от языка, каждое приложение сможет предоставить свой специфичный WASM для разбора сообщений попадающих в приложение. Это значит что ABI (application binary interface, Бинарный Интерфейс Приложения) технически определен правилами разбора WASM, а не нашими ранее встроенными зарегистрированными форматами и типами сообщений.

Мы решили удалить схемы сообщений по-умолчанию, так как блокчейн не может предоставить единую схему сообщений, и поэтому каждый контракт должен будет сам обрабатывать и проверять входящие бинарные данные.

Изменение структуры имени учетной записи

Основное изменение в коде на этой неделе стало замена имен учетных записей с 256 битных строк на 60 битные целые чисела. Числа кодируются в удобочитаемые имена при помощи base32 кодировки. Это ограничивает имена учетных записей 12 буквами (в нижнем регистре) и несколькими номерами. Напомним: средняя длина имени Twitter аккаунта составляет всего 12 символов.

Это измение мы сделали с главной мыслью: о пропускной способности, памяти и производительности. Имя учетной записи со стороны логики приложения - это просто уникальный идентификатор, который используются повсеместно. Старый ABI будет сериализовать имя учетной записи в виде строки, начинающейся с префикса длины (account names as length-prefixed strings), что потребует интенсивных вычислений при процессе распаковки.

Мы улучшили производительность перейдя к фиксированной ширине представления целых чисел в учетных записях. Но такое представление чисел оказалось неудобным при разработке. Чтобы решить эту проблему, мы просто начали печатать целые числа в base32 кодировке, что дало нам человекочитаемые имена.

Более длинные имена могут быть поддержаны путем регистрации их с использованием сервисов контрактов имен.

После этого изменения типовое передаваемое сообщение оказалос на 75% меньше, что очень важно при обработке 10 000 сообщений в секунду.

Фильтрация операций с плавающей точкой для WASM

Мы обновили процессинг WASM для обнаружения и отклонения кода, использующего операции с плавающей точкой, такие операции могут приводить к недетерминированному поведению.

Песочница для исполнения WASM

Мы достигли значительного прогресса во внедрении контрольных точек (checkpoints) в WASM, это позволяет нам во время исполнения кода прервать его, если код исполнялся слишком долго.

Новая реализация C++ Simplecoin (80 000 Транзакций/Сек)

В одном из моих предыдущих сообщений я показал тестовый (proof-of-concept) валютный умный контракт, написанный на языке C, и достигающий 50 000 Транзакций/Сек. Там же я упомянул, о том, что мы можем пригладить синтаксис, и сегодня я счастлив показать вам новую реализацию Simplecon-а на языке C++. Контракт компилируется на WASM и затем выполняется. Зациклив программу на генерацию и публикацию транзакций в блокчейн, мы получили 80 000 Транзакций/Сек, передавая средства с одного аккаунта на другой в одном потоке.

Все еще рано говорить о точной производительности, в реальном мире она может быть выше или ниже, так как архитектура постоянно эволюционирует. Все измерения мы проводили на 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 использует низкоуровневое преобразование (zero-parsing copy) из базы данных в структуру C++, а все имена учетных записей имеют фиксированную длину.

Вы можете поэкспериментировать с этим кодом на WasmFiddle по этой ссылке.

Вывод

Команда разработчиков EOS растет, а технология EOS имеет все основания считаться высопроизводительной платформой, даже будучи запущенной в одном потоке. Следите за обновлениями!


Comments 1