Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
alenevaa
7 лет назад

EOS нацелен на производительность в миллионы TPS

EOS интегрирует технологию Web Assembly для выполнения смарт-контрактов.

Сегодня Дэн Лаример опубликовал пост Web Assembly on EOS - 50,000 Transfers Per Second.
Команде разработчиков удалось достигнуть тестовой производительность в 50 000 TPS (транзакций в секунду) на один поток с использованием Web Assembly.
Для сравнения, сеть Bitcoin может обрабатывать 7 TPS. (Не тысяч, нет. Просто семь!)
А сеть VISA способна пропускать через себя более 24000 транзакций в секунду, по данным самой VISA.
Но цель разработчиков – миллионы TPS. Что может быть достигнуто за счет параллельности и горизонтальной масштабируемости. Так для современной архитектуры серверов, использующих 128 ядер, один компьютер может быть в состоянии достичь 6M TPS. Конечно, есть некоторые факторы, которые будут ограничивать производительность. Но, с надлежащим образом распараллеленными приложениями, - миллионы TPS достижимы.
Что позволит вывести платформу EOS на использование глобальных сценариев для бизнеса. Кстати, официальную тестовую сеть хотят представить уже этим летом.

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


Первоначальным выбором языка программирования для смарт-контрактов был скриптовый язык Wren. Несколько недель назад удалось запустить тест с пустым контрактом. Тест показал производительность около 1000 операций в секунду; это слишком медленно для нашей целевой производительности.
В результате команда разработчиков EOS отказалась от языка программирования Wren в пользу Web Assembly. Сегодня мы хотели бы обновить информацию о прогрессе и первоначальных результатах, которых мы достигли.

Общие сведения о Web Assembly

Web Assembly является новым отраслевым стандартом при поддержке Microsoft, Google и Apple. Целью настоящего стандарта является выполнение ненадежного кода c высокой производительностью в вашем браузере. Web Assembly изменяет правила игры, позволяя создавать веб-приложения с высокой производительностью, такие как редактирование видео и изображений и игры.
Web Assembly обеспечивает универсальную компиляцию, что позволяет разрабатывать приложения на любом языке программирования. В настоящее время существуют компиляторы для C, C++ и Rust. Даже ведется работа для компилирования Solidity (*язык смарт контрактов Ethereum) в Web Assembly.

Интеграция с EOS

Несколько недель назад мы написали смарт контракт гипотетической валюты на Wren. Сегодня мы покажем реальную рабочую реализацию написанную на "C" и компилируемую в Web Assembly (WASM). Затем мы использовали транзакции EOS для создания учетной записи (@simplecoin) и загрузки WASM кода в тестовый блокчейн.
На этой стадии бурного развития, всё еще находится в движении, и есть некоторые шероховатости, которые будут сглаживаться до выхода нашей официальной тест-сети общего пользования этим летом.

Тем не менее, вот пример того, как контракт выглядит в C сегодня:

typedef struct  {
  AccountName from;
  AccountName to;
  uint64_t    amount;
  String*     memo;
} Transfer;
 
void Transfer_unpack( DataStream* ds, Transfer* transfer )
{
   AccountName_unpack( ds, &transfer->from );
   AccountName_unpack( ds, &transfer->to   );
   uint64_unpack( ds, &transfer->amount );
   String_unpack( ds, &transfer->memo );
}
 
typedef struct {
  uint64_t    balance;
} Balance;
 
/** Constructor called once when code is first uploaded */
void onInit() {
  static Balance initial;
  static AccountName simplecoin;
  AccountName_initCString( &simplecoin, "simplecoin", 10 );
  initial.balance = 1000*1000;
  
  store( &simplecoin, sizeof(AccountName), &initial, sizeof(Balance));
}
 
/** Message handler when Transfer message is delivered to @simplecoin */ 
void onApply_Transfer_simplecoin() {
   static char buffer[100];
   int read   = readMessage( buffer, 100  ); /** load message content */
   static Transfer message;
   static DataStream ds;
   DataStream_init( &ds, buffer, read );
   Transfer_unpack( &ds, &message );  /* unpack it */
 
   static Balance from_balance;
   static Balance to_balance;
   to_balance.balance = 0;
   
   read = load( &message.from, sizeof(message.from), 
                &from_balance.balance, sizeof(from_balance.balance) );
   
   assert( read == sizeof(Balance), "no existing balance" );
   assert( from_balance.balance >= message.amount, "insufficient funds" );
   
   load( &message.to, sizeof(message.to), 
         &to_balance.balance, sizeof(to_balance.balance) );
   
   to_balance.balance   += message.amount;
   from_balance.balance -= message.amount;
 
   if( from_balance.balance )
      store( &message.from, sizeof(AccountName), 
             &from_balance.balance, sizeof(from_balance.balance) );
   else
      remove( &message.from, sizeof(AccountName) );
 
   store( &message.to, sizeof(message.to), 
          &to_balance.balance, sizeof(to_balance.balance) );
}

Этот код был скомпилирован с использованием интерфейса WasmFiddle для генерации WebAssembly (WASM). Он использует несколько простых вызовов API, такие как readMessage, load и store для выборки и хранения информации в блокчейне.
Данный контракт создаст 1 млн монет и распределит их на счет @simplecoin. Затем контракт позволит @simplecoin передать эти монеты на другие счета, которые в свою очередь могут передавать их другим.

Первоначальные тесты

Я создал тест, который будет загружать этот контракт, а затем создаст отдельные операции для перевода средств от @simplecoin к @init1 1000 раз.

     auto start = fc::time_point::now();
     for( uint32_t i = 0; i < 1000; ++i )
     {
        eos::chain::SignedTransaction trx;
        trx.emplaceMessage("simplecoin", "simplecoin", 
                           vector<AccountName>{"init1"}, "Transfer",
                           types::Transfer{"simplecoin", "init1", 1+i, "memo"} );
        trx.expiration = db.head_block_time() + 100;
        trx.set_reference_block(db.head_block_id());
        db.push_transaction(trx);
     }
     auto end = fc::time_point::now();
     idump((  1000*1000000.0 / (end-start).count() ) );

Конечный результат дал около 50 000 переводов в секунду в среднем в течение многих различных запусков. Имейте в виду, что эти первые результаты и есть много вещей, которые могут повлиять на производительность в лучшую и в худшую стороны. Пока слишком рано делать выводы об окончательной производительности, но 50000 последовательных действий в секунду гораздо ближе к области, в которой мы хотим быть – Facebook, Visa и так далее.

Эта производительность была измерена на 2014 iMac с 4GHz Intel Core i7 CPU.

Сравнение с Wren

Причина, по которой Wren был медленнее, заключалась в том, что каждый раз приходилось компилировать код, и не было простого способа кэшировать скомпилированные результаты. Оказывается, скорость Wren сильно зависит от запуска программы в течение длительного периода времени по сравнению с ее начальной стоимостью запуска. Это противоположность тому, что мы хотим для платформы смартконтрактов, которая запускает много быстрых программ.

Библиотека WebAssembly, которую мы используем, компилирует Web Assembly (WASM) в собственные инструкции x86, используя библиотеку компилятора LLVM. Это позволяет WASM работать со скоростью до 80% от оригинальной скорости, что намного быстрее, чем любой интерпретируемый язык, и, конечно, быстрее, чем если оптимизация компиляции Just-in-Time (JIT) выполняется для каждого отдельного запуска.

Путь вперед

Теперь, когда мы доказали концепцию контрактов на основе WebAssembly и подтвердили, что их однопоточная производительность уже лидирует в отрасли, мы продолжим сбрасывать API, которые мы публикуем для Web Assembly, и рассмотрим возможность добавления поддержки языков и инструментов более высокого уровня, чтобы сделать разработку проще, чем писать на C.

Наши первоначальные тестовые сети будут сосредоточены на стабильности кода и API и будут выполнять контракты в рамках одного потока. Однако, дизайн архитектуры программного обеспечения EOS.IO позволит нам переключиться на многопоточное выполнение без необходимости хардфорка блокчейна. Как видно из наших первоначальных эталонных тестов, даже однопоточная реализация EOS по-прежнему является лидером в отрасли с большим запасом для современных приложений.

Будьте в курсе

Подпишитесь на нашу рассылку на https://eos.io, чтобы быть в курсе последних событий и предстоящей продажи токенов EOS.


от себя добавлю, – подписывайтесь на @alenevaa, чтобы также быть в курсе последних событий!

0
13.206 GOLOS
Комментарии (12)
Сортировать по:
Сначала старые