Команда SpankChain на прошлой неделе усердно работала над завершением деталей уже начавшегося Глобального события продажи токенов! Мы в SpankChain очень ориентированы на сообщество и хотим держать всех в курсе нашего прогресса, поэтому вот последние обновления разработки с предыдущей недели!

Глобальная распродажа токенов SpankChain уже началась!

Аукцион SpankChain уже запущен и активно принимает ставки. На канале SpankChain на YouTube, а также на нашей странице аукциона есть несколько обучающих видеороликов, которые помогут пользователям в процессе торгов и выбора их рыночной капитализации. Команда работала круглосуточно, чтобы подготовить продажу токенов для сообщества! После исследования множества различных моделей аукционов команда SpankChain пришла к выводу, что эта текущая структура на сегодняшний день является самым справедливым средством проведения продажи токенов. Одна из наших основных целей при проведении аукциона заключалась в том, чтобы сделать участие простым и понятным для всех. Мы надеемся, что в будущем это может послужить безопасной и справедливой моделью для продажи токенов.

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

Модель аукциона для будущих проектов

Чтобы создать уникальную модель, которую мы предусмотрели для нашей продажи, и учитывая, что (на момент написания) не было прецедента для такой модели аукциона, нам нужно было убедиться, что процесс отладки будет простым. Как правило, гибридные цепные системы очень сложно отлаживать! Чтобы обеспечить успешное развертывание, команда разработчиков SpankChain разделилась на группы проектов: интерфейсные, серверные и смарт-контракты.

Наши разработчики имеют тенденцию быстро двигаться и развиваться параллельно, поэтому с самого начала было ясно, что было бы обременительно проводить тесты, проводя аукционы по одному, и еще более обременительно координировать. Мы нашли решение, создав несколько контрактов, представляющих различные состояния аукциона, которые можно было легко распознать по именам ENS, таким как spankpurchasing.test, spankprocesssing.test и т. Д.

Для всех, кому интересно, вы можете увидеть их на Rinkeby в течение следующих нескольких дней, пока не истечет срок действия доменного имени .test. Это привело нас к идее использования адреса контракта или имени ENS в качестве параметра строки запроса.

Когда мы посмотрели на наши ноутбуки, мы поняли, что создали первую систему (удар) AaaS (аукцион как услуга).

Это только начало. Мы изучаем способы сделать это общедоступным для будущих проектов, поэтому, пожалуйста, свяжитесь с нами, если у вас есть идеи (или вам нравится наша модель аукциона и вы хотите ее использовать). Мы надеемся, что это ценно, и мы можем оглянуться назад и сказать, что это был «один маленький шаг для нашей команды разработчиков, один гигантский скачок вперед для экосистемы».

Синхронные сетевые операции в JavaScript

На самом деле асинхронное программирование сложно, особенно в JavaScript. Вот «одна странная уловка», которую мы обнаружили, чтобы упростить управление web3. Ниже мы расскажем, как мы превратили основные библиотеки JavaScript из асинхронного кода в синхронный.

К счастью, node-XMLHttpRequest - библиотека, используемая Web3 для выполнения HTTP-запросов от Node - за нами. Он точно реализует спецификацию XMLHttpRequest, включая - что особенно важно - аргумент async = false.

Это упрощает использование кода, который раньше представлял собой беспорядок обратных вызовов:

web3.eth.getBlock(69, (block, err) => {
 if (err) throw new Error(err);
 block.transactions.forEach(tx => {
  web3.eth.getTransactionReceipt(tx.hash, (receipt, err) => {
   if (err) throw new Error(err);
   console.log(‘receipt:’, receipt);
  })
 })
})

И переписать просто, чисто и линейно:

let block = web3.eth.getBlock(69)
block.transactions.forEach(tx => {
 web3.eth.getTransactionReceipt(tx.hash).forEach(receipt => {
  console.log(‘receipt:’, receipt);
 })
})

"Ждать!" Вы можете воскликнуть: «JavaScript асинхронен! Как это может работать? »

Мы задали тот же вопрос, когда заметили странное поведение одного из наших процессов Node: загрузка процессора резко возрастала до 100%, пока он синхронизировал состояние цепочки блоков… процесс, который, как мы думали, был полностью привязан к сети.

В ходе дальнейшего расследования мы обнаружили чудесный способ взлома глубоко в нутри node-XMLHttpRequest:

  var syncFile = “.node-xmlhttprequest-sync-” + process.pid;
  fs.writeFileSync(syncFile, “”, “utf8”);
var downloadScript = `
  var http = require(‘http’);
  …;
  response.on(‘end’, () => fs.unlinkSync(‘${syncFile}’));
 `;
spawn(process.argv[0], [“-e”, downloadScript])
while (fs.existsSync(syncFile)) {
  // Wait until the sync file has been removed
}

Да, вы читаете это правильно: синхронные HTTP-запросы реализуются путем создания подпроцесса для выполнения загрузки, в то время как основной процесс вращается, ожидая, пока файл синхронизации не будет удален подпроцессом (в этот момент он считывает результат из другой файл, написанный подпроцессом).

Это стало настоящей проблемой для команды SpankChain, когда мы перешли от тестирования в Testnet, где в блоках было всего несколько транзакций, к Mainnet, где в блоках часто было более 100 транзакций, а наш процесс синхронизации все больше и больше отставал.

Чтобы избежать переписывания всего нашего существующего кода с помощью обратных вызовов, мы создали небольшую оболочку для обертывания вызовов web3 в обещание, которое мы могли бы `await` для синхронного моделирования:

let cb2promise = (objAndFunc, …args) => {
  let [objName, methodName] = objAndFuncName.split(‘.’);
  return new Promise((res, rej) => {
    web3[objName][methodName](…args, (err, result) => {
    err? rej(err) : res(result);
   })
  })
};

Итак, наш код становится:

let block = await web3call(‘eth.getBlock’, 69);
block.transactions.forEach(tx => {
  let receipts = await web3Call(‘eth.getTransactionReceipt’,      tx.hash);
  receipts.forEach(receipt => {
    console.log(‘receipt:’, receipt);
  })
})

И мы можем продолжать работать в асинхронном режиме с минимальными изменениями кода и без намека на «суп» обратного вызова.

PS: для полноты, это очень похоже на функциональность, предлагаемую Bluebird Promise.promisify.

Спасибо за то, что следите за обновлениями SpankChain Dev, команда очень рада возможности поделиться этим путешествием с нашим сообществом, и мы с нетерпением ждем возможности поделиться новостью об успешном завершенном ICO со всеми вами! Чтобы принять участие в глобальной продаже токенов SpankChain и приобрести токены SPANK, перейдите по ссылке здесь на страницу аукциона SpankChain!

Подключиться к SpankChain

Чтобы узнать больше о SpankChain, посетите наш веб-сайт, подпишитесь на нас в Twitter и присоединитесь к нашему растущему сообществу Discord.