📒 EOS - Журнал разработчика. Звездная дата 20176.30 (@dan)
На этой неделе команда c++ блокчейн разработчиков block.one приняла на работу 4-х новых членов и проинтервьюировала еще нескольких. Новобранцы уже начали вносить свой вклад в код.
Удаление зарегистрированных схем сообщений
С переходом на WebAssembly (WASM) нам пришлось пересмотреть некоторые из наших ранних дизайнерских решений, исходя из предположения об использовании Wren. Поскольку WASM не зависит от языков, каждое приложение должно предоставлять различный WASM для анализа сообщений, переданных приложению. Это означает, что ABI (двоичный интерфейс приложения) технически определен синтаксическим анализом WASM, а не нашими предварительно встроенными зарегистрированными типами сообщений и форматов.
Так как блокчейн не способен обеспечить исполнение схем сообщений, и каждому контракту пришлось бы независимо анализировать и проверять двоичные входные данные, мы предпочли удалить определенные блокчейном схемы сообщений. Это дает больше возможностей разработчикам приложений.
Изменение структуры Имени Аккаунта
Одним из самых больших изменений в коде на этой неделе было изменение имен аккаунтов с 256 битных строк на 60 битные числа, что конвертируются в удобочитаемые имена через кодирование base32. Это ограничивает имена аккаунтов 12 строчными буквами и несколькими цифрами. Среднее имя аккаунта в Twitter имеет длину всего в 12 символов.
Это изменение было сделано в первую очередь из-за потребляемой пропускной способности, памяти и вопросов производительности. С точки зрения логики приложений имя аккаунта - это просто уникальный идентификатор, а они используются повсеместно. Старый ABI упорядочивал эти имена аккаунтов как длинно-префиксные строки и требовал бы интенсивных вычислений в процессе распаковки.
При переходе на целочисленное представление фиксированной ширины аккаунтов мы добились производительности, но для разработчиков всё стало менее дружелюбно. Чтобы решить эту проблему, мы просто печатаем целые числа как base32, что дает удобочитаемые имена.
Более длинные имена всё равно будут поддерживаться при регистрации их с контрактом на обслуживание имени.
Типичное сообщение-транзакция после введения этого изменения занимает на 75% меньше, что дает очень большую разницу, когда вы обрабатываете десятки тысяч таковых в секунду.
Фильтрация плавающей точки в WASM
Мы обновили WASM обработку для выявления и отбраковки кода, использующего операции с плавающей точкой, которые могут генерировать недетерминированное поведение.
Сэндбоксинг рабочей среды WASM
Мы добились значительного прогресса во вводе чекпоинтов в WASM, что позволит нам проверять время выполнения и прерывать процесс, если прошло слишком много времени. Это критическая составляющая работы ненадежного кода.
Новый C++ Simplecoin (80 000 TPS)
В одном из моих предыдущих обновлений я показал доказательство концепции валютного смарт-контракта, написанного на С, и достижение 50К транзакций в секунду. Я упомянул, что думал, что мы можем почистить синтаксис, и сегодня счастлив показать новую реализацию simplecoin на C++, который компилируется на WASM и затем выполняется. Используя сжатый цикл генерации и добавления транзакций в блокчейн мы добились 80 000 TPS, переводя средства с одного аккаунта на другой в одном потоке.
Производительность в реальных условиях может быть выше или ниже, что зависит от меняющейся архитектуры; пока слишком рано об этом говорить. Все измерения производились на 4Ghz Intel Core i7 на iMac 2014 года.
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 использует копию не требующую парсинга из базы данных в С++ структуре, и все имена аккаунтов имеют фиксированную длину.
Вы можете экспериментировать с этим кодом на WasmFiddle, перейдя по ссылке.
Заключение
Команда разработчиков EOS растет, и технология развивается и показывает все признаки весьма высокопроизводительной платформы, даже при работе на одном потоке. Следите за обновлениями!
Свежие новости в Телеграм: t.me/EOS_RU
Оригинал поста: ЗДЕСЬ