<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Alpacachina</title><generator>teletype.in</generator><description><![CDATA[Alpacachina]]></description><image><url>https://img3.teletype.in/files/a4/22/a422c536-558b-43e0-81f6-97d5374e3aa9.png</url><title>Alpacachina</title><link>https://teletype.in/@borisaguero</link></image><link>https://teletype.in/@borisaguero?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/borisaguero?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/borisaguero?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Wed, 13 May 2026 20:14:05 GMT</pubDate><lastBuildDate>Wed, 13 May 2026 20:14:05 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@borisaguero/FZB0oBaSy01</guid><link>https://teletype.in/@borisaguero/FZB0oBaSy01?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero</link><comments>https://teletype.in/@borisaguero/FZB0oBaSy01?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero#comments</comments><dc:creator>borisaguero</dc:creator><title>Cetus Alpha на SUI Testnet</title><pubDate>Mon, 28 Nov 2022 14:10:23 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/34/5e/345e70a1-1317-4ab3-85e4-66f72fbb4626.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/a4/db/a4dbec60-b975-4f80-8941-7bdb894be3e8.png"></img>Активностей немного, все займет 3 минуты. Надеюсь, это даст дополнительные баллы для получения дропа от SUI.

P.S. Один из тасков в крю и возможность получить OG  — сделать статью или видео о тестнете:) Поэтому я и пишу это, хотя действия там легчайшие. 

Делаем свапы]]></description><content:encoded><![CDATA[
  <p id="2vQN">Активностей немного, все займет 3 минуты. Надеюсь, это даст дополнительные баллы для получения дропа от SUI.<br /><br /><em>P.S. Один из тасков в крю и возможность получить OG  — сделать статью или видео о тестнете:) Поэтому я и пишу это, хотя действия там легчайшие. <br /><br /></em><strong>Делаем свапы</strong></p>
  <p id="sRFD">Переходим на <a href="https://app.cetus.zone" target="_blank">сайт тестнета, </a>меняем кошелек на SUI и коннектим его.</p>
  <figure id="YVJQ" class="m_column">
    <img src="https://img3.teletype.in/files/a4/db/a4dbec60-b975-4f80-8941-7bdb894be3e8.png" width="2880" />
  </figure>
  <p id="wpF4">Не забываем переключиться в кошельке SUI на Testnet.</p>
  <figure id="ssQP" class="m_column">
    <img src="https://img2.teletype.in/files/9d/bc/9dbce9db-5652-4e0b-a5a5-b9601cc4e76d.png" width="714" />
  </figure>
  <p id="LhAq">Далеем запрашиваем тестовые токены для свапов. Не забывайте заклеймить тестовые SUI внутри самого кошелька для этих транзакций. Если внутренний кран не работает, пробуйте <a href="https://faucet.wavewallet.app/" target="_blank">этот.</a></p>
  <figure id="4bqc" class="m_column">
    <img src="https://img2.teletype.in/files/dc/e1/dce1d566-7376-41e1-8b6d-66e4ec9faf28.png" width="2880" />
  </figure>
  <p id="5JBE">Далее гоняем туда-сюда монеты в нескольких парах и сохраняем ID транзакции свапов для гугл-формы.</p>
  <figure id="XPxV" class="m_column">
    <img src="https://img2.teletype.in/files/5c/a8/5ca8cceb-406f-4df7-87cc-54122d9575fd.png" width="2880" />
  </figure>
  <p id="nV1u">Все транзакции можно глянуть в <a href="https://explorer.sui.io/" target="_blank">эксплорере суи. </a>Там вводим свой адрес SUI и копируем айди.</p>
  <figure id="HSMc" class="m_column">
    <img src="https://img2.teletype.in/files/10/d2/10d25cb7-122a-4779-b705-19b41fb04743.png" width="2880" />
  </figure>
  <h3 id="gRnU"><strong>Заливаем ликвидность</strong></h3>
  <p id="pein">Идем в пулы и выбираем доступный.</p>
  <figure id="o3MA" class="m_column">
    <img src="https://img2.teletype.in/files/d8/3f/d83f1bec-d615-4c64-8045-310e8fcffecb.png" width="2880" />
  </figure>
  <figure id="Uts3" class="m_column">
    <img src="https://img4.teletype.in/files/b7/07/b707727c-318c-4cec-9144-79c444685eec.png" width="2880" />
  </figure>
  <p id="TgLR">Выбираем монеты, кол-во и жмем добавить ликвидность.</p>
  <figure id="mJMO" class="m_column">
    <img src="https://img4.teletype.in/files/ba/66/ba66eb64-8c12-406d-92ea-363ca09d6b23.png" width="2880" />
  </figure>
  <p id="g3NQ">Подтверждаем транзу и сохраняем айди для формы. Также нужно заскринить добавленную ликвидность.<br /></p>
  <figure id="Dxcx" class="m_column">
    <img src="https://img2.teletype.in/files/58/61/5861e5f8-4055-4f65-9ae1-2d80bc0caee2.png" width="1050" />
  </figure>
  <p id="P8O5">Теперь нужно изъять ликвидность из своего пула.</p>
  <figure id="u2zs" class="m_column">
    <img src="https://img4.teletype.in/files/39/98/39986509-2f5a-4578-8bd3-4c0b01e80f6e.png" width="2880" />
  </figure>
  <p id="5Xn9">В открывшейся вкладке выбираем процент изъятия (я взял 50%) и жмем Remove. Подтверждаем транзакцию.</p>
  <p id="fX2E"></p>
  <p id="hKUc">Теперь идем к ним в <a href="https://discord.gg/cetusprotocol" target="_blank">дискорд</a> в раздел feedback и оставляем ревью, как вы с кайфом выполняли задания тестнета. Также отправляем скрины и транзакции в эту <a href="https://docs.google.com/forms/d/e/1FAIpQLSdCX2Eq2Ok2pR4rxnmZowGg0dC1sYFCO25DCLMl7TA3UXS_Zw/viewform" target="_blank">форму</a>.</p>
  <p id="JkVt"><em>P.S.S. Рекомендуют оставлять данные дискорда Kethali#3401  и <a href="https://twitter.com/SharkyGems_NFT" target="_blank">твиттера.</a></em></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@borisaguero/blK1HOIoH1R</guid><link>https://teletype.in/@borisaguero/blK1HOIoH1R?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero</link><comments>https://teletype.in/@borisaguero/blK1HOIoH1R?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero#comments</comments><dc:creator>borisaguero</dc:creator><title>Hardhat or Truffle: какой инструмент наиболее подходящий для начинающих</title><pubDate>Mon, 18 Jul 2022 09:56:42 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/e6/a4/e6a43eaf-94d7-42ee-ab95-84742e0f89fc.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/max/1400/1*mXpNv7TBW2AQvwwF5wrIVA.png"></img>Если вы только начинаете свою карьеру в мире блокчейна и задаетесь вопросом, что выбрать: Hardhat или Truffle, то вы попали по адресу! В этой статье мы рассмотрели оба этих фреймворка и далее провели небольшое сравнение.]]></description><content:encoded><![CDATA[
  <p id="mY1d">Если вы только начинаете свою карьеру в мире блокчейна и задаетесь вопросом, что выбрать: Hardhat или Truffle, то вы попали по адресу! В этой статье мы рассмотрели оба этих фреймворка и далее провели небольшое сравнение.</p>
  <h2 id="FHmM">Hardhat Tools</h2>
  <figure id="KdZQ" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*mXpNv7TBW2AQvwwF5wrIVA.png" width="1400" />
  </figure>
  <p id="XMxa">Hardhat - это среда разработки Ethereum для разработчиков, которая позволяет выполнять частые задачи.</p>
  <p id="Ex7Z">Помимо простого развертывания контрактов и запуска тестов, Hardhat предоставляет еще несколько функций, которые делают его более мощным и уникальным.</p>
  <p id="mjsH">Давайте рассмотрим эти возможности по порядку.</p>
  <h3 id="csfu">Hardhat Network</h3>
  <p id="ZDbN">Hardhat поставляется в комплекте с Hardhat Network — локальной нодой сети Ethereum для разработки, который предоставляет множество функций, таких как автоматические сообщения об ошибках, форкинг сети и режимы майнинга.</p>
  <p id="lbcu">Поэтому если вы используете Hardhat, вы уже по умолчанию используете Hardhat Network. Она добывает блок с каждой полученной транзакцией, по порядку и без задержек.</p>
  <h3 id="Omi0"><strong>Plugins</strong></h3>
  <p id="IzN8">Плагины — это расширения, которые могут быть загружены в программу для улучшения ее функциональности.</p>
  <p id="G6Zz">В разработке Hardhat используется 30+ плагинов, поэтому они считаются основой Hardhat.</p>
  <p id="1xK1">Ниже перечислили некоторые из популярных плагинов с указанием их функциональных возможностей:</p>
  <ul id="RzIW">
    <li id="eRzD"><strong><a href="https://hardhat.org/plugins/nomiclabs-hardhat-ethers.html" target="_blank">nomiclabs/hardhat-ethers</a>:</strong> Позволяет разработчикам внедрять ethers.js в Hardhat Runtime Environment<em>.</em></li>
    <li id="ETsp"><strong><a href="https://hardhat.org/plugins/nomiclabs-hardhat-waffle.html" target="_blank">nomiclabs/hardhat-waffle</a>:</strong>  Позволяет добавить провайдер, совместимый с Waffle, Hardhat Runtime Environment<em>.</em></li>
    <li id="hWDj"><strong><a href="https://hardhat.org/plugins/nomiclabs-hardhat-etherscan.html" target="_blank">nomiclabs/hardhat-etherscan</a>:</strong> Автоматически проверяет контракты на Etherscan.</li>
    <li id="pYMg"><strong><a href="https://www.npmjs.com/package/hardhat-gas-reporter" target="_blank">hardhat-gas-reporter</a>:</strong> Gas reporter помогает подтвердить использование газа на единичный тест и среднее использование газа на метод.</li>
  </ul>
  <h3 id="b1e0">Тестирование</h3>
  <p id="fkPA">Hardhat обеспечивает очень простую процедуру тестирования, предоставляя разработчикам возможность писать автоматизированные тесты при создании смарт-контрактов.</p>
  <p id="T9cs">Hardhat предоставляет отличную <a href="https://hardhat.org/tutorial/testing-contracts" target="_blank">документацию</a> для понимания методов тестирования с помощью Hardhat.</p>
  <p id="cdna"></p>
  <h2 id="f662">Truffle Tools</h2>
  <p id="lNwO">Как и Hardhat, Truffle — это среда разработки, относящаяся к блокчейну Эфируима.</p>
  <p id="480d">Truffle очень популярный фреймворк и за ним стоит большое комьюнити разработчиков.</p>
  <p id="9505">Для разработки dapps девсы используют <em>Truffle Suite</em>.<br /><br /><em>Truffle Suite — это экосистема Web 3 разработки,  состоящая из 3х разных инструментов:</em> <strong>Truffle, Ganache,</strong> и <strong>Drizzle:</strong></p>
  <ul id="VwUD">
    <li id="bqYq"><strong>Truffle</strong> — это среда разработки, использующая EVM для разработки смарт-контрактов.</li>
    <li id="d748"><strong>Ganache</strong> — это инструмент, используемый для создания собственного локального блокчейна Ethereum, который можно использовать для развертывания и тестирования смарт-контрактов.<br />Кроме того, Ganache позволяет разработчикам избежать ненужных платежей за газ в процессе разработки.</li>
    <li id="Kjjf"><strong>Drizzle</strong> — это набор библиотек для фронтенда, основой которого является магазин Redux.Благодаря этому разработка фронтенда становится намного проще.</li>
  </ul>
  <p id="xSLw">Truffle предлагает несколько различных функций, таких как:</p>
  <p id="DAFk"><strong>Управление смарт-контрактами<br /></strong>Truffle помогает управлять артефактами смарт-контрактов, чтобы вы могли сосредоточиться на других частях процесса разработки и тратить меньше времени на организацию файлов.</p>
  <p id="vRiW"><strong>Миграция и развертывание с помощью скриптов</strong></p>
  <p id="yS5G">С помощью Truffle вы можете писать скрипты развертывания, которые позволяют учитывать тот факт, что ваши Dapps будут меняться со временем.</p>
  <p id="3ezs"><strong>Мощная интерактивная консоль</strong></p>
  <p id="kxl8">Truffle предоставляет 2 различные консоли, чтобы выбрать лучший инструмент для ваших нужд.</p>
  <p id="9K0H"><strong>(A) Truffle Console: </strong>Базовая интерактивная консоль, подключаемая к любому клиенту Ethereum. Чтобы запустить консоль, используйте команду <code>truffle console</code>. Когда вы загрузите консоль, вы сразу же увидите следующее приглашение:</p>
  <figure id="ID69" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*6ot16qoFzE7fRdGvDaR3cQ.png" width="1042" />
  </figure>
  <p id="ea7c">Консоль Truffle позволит вам подключиться к контрактам, развернутым на клиенте EVM, и взаимодействовать с ними способом, аналогичным тому, который вы используете с помощью javascript.</p>
  <p id="1JHg"><strong>(B) Truffle Develop:</strong> Интерактивная консоль, которая также запускает блокчейн разработки. Она служит той же цели, что и <code>hardhat node</code>.</p>
  <p id="yNjO">Вы можете легко запустить Truffle Develop, используя команду<code>truffle develop.</code></p>
  <figure id="444I" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*FOUvZP1AkjSrapMcHsvBfA.png" width="1400" />
  </figure>
  <h3 id="Y56O">Truffle Dashboard</h3>
  <p id="Tknb">Недавно компания Truffle представила Truffle Dashboard, обеспечивающую более простой способ использования существующего кошелька Metamask для развертывания и транзакций. Вы также можете использовать Truffle Dashboard внутри любых проектов Hardhat. Truffle предоставил отличную <a href="https://trufflesuite.com/docs/truffle/getting-started/using-the-truffle-dashboard/" target="_blank">документацию</a>, чтобы следовать за ним и использовать Truffle Dashboard в своем проекте.<br /></p>
  <h2 id="56BZ"><strong>Какой инструмент наиболее полезный?</strong></h2>
  <p id="BOro"><strong>Исправление багов<br /></strong>Solidity трудно отлаживать. Вы просто получаете сообщение об ошибке, когда что-то ломается, и чаще всего найти, что именно пошло не так, очень трудно.</p>
  <p id="357I">К счастью, Hardhat ввел в Solidity так называемую функцию <a href="https://hardhat.org/tutorial/debugging-with-hardhat-network.html#solidity-console-log" target="_blank">console.log.</a></p>
  <p id="0Ypn">Таким образом, вы можете просто импортировать плагин консоли и использовать его внутри своих функций.</p>
  <p id="wZ3Q">Вот как это выглядит:</p>
  <figure id="TgXj" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*ERNYSUHoT_V6LCMCpQ3VNQ.png" width="1230" />
  </figure>
  <p id="IYy5">Добавьте<code>console.log</code> внутрь функции</p>
  <figure id="Vtis" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*f42e9EzFav9cBCKyaO2yNA.png" width="1400" />
  </figure>
  <p id="wpwC">Лог будет отображаться при запуске тестов:</p>
  <figure id="0Y1I" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*Paw8soXed-eayjpHQHZxjw.png" width="1400" />
  </figure>
  <p id="JIvt">EVM, созданный hardhat, специально поддерживает эту функцию и, следовательно, является родным для Hardhat Node. Эта возможность сама по себе является большим плюсом для Hardhat.</p>
  <p id="YBTo">С другой стороны, Truffle совершенствует свой дебаг-инструмент и имеет некоторые плагины для него, но Hardhat считается более простым и мощным инструментом, используемым для исправления багов.</p>
  <h3 id="48c8">Библиотеки (Ethersjs and Web3)</h3>
  <p id="WlJb">Hardhat использует ethersjs по умолчанию, но может быть легко апнут для использования <a href="https://hardhat.org/hardhat-runner/plugins/nomiclabs-hardhat-web3#hardhat-web3" target="_blank">Web3</a>. В то время как Truffle использует Web3 в качестве плагина по умолчанию для разработки.</p>
  <p id="7rfJ">Вы также можете использовать Etherjs в Truffle, но это считается более сложным и трудно реализуемым.</p>
  <p id="wBQU">Хотя ethers-js и web3-js похожи, большинство разработчиков используют ethers-js по умолчанию. </p>
  <h3 id="bDew">Local Ethereum Network Node</h3>
  <p id="DM1G">Hardhat comes inbuilt with <a href="https://www.notion.so/local-Ethereum-network-node-7f385e90d47f4911aee1fcc90aee32d5" target="_blank">Hardhat Node</a>. However, it does not have a GUI for developers to see account info in real-time.</p>
  <p id="Wj5H">Truffle, on the other hand, uses <a href="https://trufflesuite.com/ganache/" target="_blank">Ganache</a> which has to be set up separately. However, it comes with both a CLI and a GUI version allowing flexibility for the developer.</p>
  <p id="1swd">If you prefer the GUI you should choose Ganache.</p>
  <h2 id="fd26">Развертывание</h2>
  <p id="GTVQ">Для развертывания контракта Hardhat использует базовые скрипты Js, поэтому с ним легче начать работу.</p>
  <p id="p7hs">В то время как Truffle использует <a href="https://trufflesuite.com/docs/truffle/getting-started/running-migrations/#running-migrations" target="_blank"><em>migration-based</em></a>  процедуру развертывания, которые сами по себе являются js-файлами, но имеют последовательный порядок выполнения, что немного сложнее для новичка, но может быть полезно в долгосрочной перспективе, учитывая, что ваши потребности в развертывании могут измениться в будущем.</p>
  <p id="i4Pg">Но за простоту начала работы с развертыванием hardhat определенно берет приз.</p>
  <h3 id="UP0G">Тестирование</h3>
  <p id="5CmF">Для выполнения различных тестов и Truffle, и Hardhat используют библиотеку  Chai и Mocha в качестве фреймворка для тестирования, но hardhat также включает <a href="https://getwaffle.io/" target="_blank">waffle</a>. Они оба сильны, когда дело доходит до тестирования.</p>
  <h3 id="d255">Статистика</h3>
  <p id="inLe">До появления Hardhat самым популярным фреймворком для тестирования смарт-контрактов был Web3.</p>
  <p id="iDGS">Сейчас можно увидеть, что тенденция меняется со временем, и Hardhat приобрел большую популярность по сравнению с Truffle.</p>
  <p id="5Wid">Согласно статистике NPMJS, Truffle имеет почти 30 тыс. еженедельных загрузок. В то время как у Hardhat около 86 тыс. еженедельных загрузок, что вдвое больше, чем у Truffle.</p>
  <figure id="8m1G" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*TeoxPMnvQuQGJ-h-YfMQJw.png" width="1400" />
  </figure>
  <h3 id="xFhI"><strong>Помощь комьюнити</strong></h3>
  <p id="DISy">Сообщество Truffle на <a href="https://github.com/orgs/trufflesuite/discussions" target="_blank">Github</a> довольно активно и полезно, в то время как комьюнити Hardhat взаимодействует на сервере Discord. Следует отметить, что  Truffle поддерживается компанией <a href="https://consensys.net/" target="_blank">Consensys</a>, поэтому вы можете рассчитывать на &quot;службу поддержки&quot;. Hardhat также разрабатывается и управляется организацией <a href="https://nomic.foundation/" target="_blank">Nomic Foundation</a> и имеет удивительную и не менее хорошую систему поддержки через свой сервер Discord.</p>
  <h2 id="I2tc">Заключение</h2>
  <p id="is5k">Очень трудно сказать, что лучше. Выбор между Truffle и Hardhat сводится к собственным предпочтениям и юзкейсам, поскольку оба они являются мощными инструментами.</p>
  <p id="psL9">Если вы совсем новичок в обоих фреймворках, то вам определенно стоит изучить оба и решить, что вам больше подходит.</p>
  <p id="O64L">Тем не менее, мы надеемся, что эта статья дала вам представление о различиях между ними и помогла определиться с выбором.</p>
  <p id="4FSt"><em>Не забудьте подписаться на наш канал для разработчиков и хакатонщиков — <a href="https://t.me/definitionmedia" target="_blank">Definition</a>. Если вы еще не сделали этого:)</em></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@borisaguero/vexzh9jrvOG</guid><link>https://teletype.in/@borisaguero/vexzh9jrvOG?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero</link><comments>https://teletype.in/@borisaguero/vexzh9jrvOG?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero#comments</comments><dc:creator>borisaguero</dc:creator><title>Hardhat or Truffle: what framework is more suitable for beginners</title><pubDate>Mon, 18 Jul 2022 09:54:34 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/e6/a4/e6a43eaf-94d7-42ee-ab95-84742e0f89fc.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/max/1400/1*mXpNv7TBW2AQvwwF5wrIVA.png"></img>If you just starting out your career in the blockchain world and wondering which one to choose: Hardhat or Truffle, then you’re at the right place! In the below paragraphs, we have discussed both these frameworks and have proceeded further to do a small comparison of sorts.]]></description><content:encoded><![CDATA[
  <p id="iiRG">If you just starting out your career in the blockchain world and wondering which one to choose: Hardhat or Truffle, then you’re at the right place! In the below paragraphs, we have discussed both these frameworks and have proceeded further to do a small comparison of sorts.</p>
  <h1 id="53e8">Hardhat Tool</h1>
  <figure id="48wV" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*mXpNv7TBW2AQvwwF5wrIVA.png" width="1400" />
  </figure>
  <p id="5b99">Hardhat is an <em>Ethereum development environment</em> for developers that allows performing frequent tasks.</p>
  <p id="ff15">Other than just deploying and running tests, Hardhat also provides some more features that make it more powerful and unique.</p>
  <p id="90a7">Let’s consider these features one by one.</p>
  <h3 id="06c7"><strong>Hardhat Network</strong></h3>
  <p id="2911">Hardhat comes built-in with <strong>Hardhat Network</strong>, a local Ethereum network node designed for development providing multiple features like automated error messages, mainnet forking and mining modes.</p>
  <p id="c6dd">So if you’re using Hardhat, then by default you’re already using Hardhat Network. It mines a block with each transaction that it receives, in order and with no delay.</p>
  <h3 id="4a75"><strong>Plugins</strong></h3>
  <p id="838f"><em>Plugins,</em> in simpler words, are extensions that can be loaded on a program to improve its functionality.</p>
  <p id="6b9b">There are <strong>30+ plugins</strong> used in development with Hardhat which is why it is considered the <em>backbone of Hardhat.</em></p>
  <p id="164c">We have listed some of the popular plugins below with their functionalities:</p>
  <ul id="rJKx">
    <li id="b1e0"><strong><a href="https://hardhat.org/plugins/nomiclabs-hardhat-ethers.html" target="_blank">nomiclabs/hardhat-ethers</a>:</strong> It allows developers to inject ethers.js into the Hardhat Runtime Environment<em>.</em></li>
    <li id="6f7b"><strong><a href="https://hardhat.org/plugins/nomiclabs-hardhat-waffle.html" target="_blank">nomiclabs/hardhat-waffle</a>:</strong> It allows you to add a Waffle-compatible provider to the Hardhat Runtime Environment.</li>
    <li id="ef1f"><strong><a href="https://hardhat.org/plugins/nomiclabs-hardhat-etherscan.html" target="_blank">nomiclabs/hardhat-etherscan</a>:</strong> It automatically verifies contracts on Etherscan</li>
    <li id="4b1b"><strong><a href="https://www.npmjs.com/package/hardhat-gas-reporter" target="_blank">hardhat-gas-reporter</a>:</strong> Gas reporter helps to acknowledge the gas usage per unit test and average gas usage per method.</li>
  </ul>
  <h3 id="88cc"><strong>Testing</strong></h3>
  <p id="8378">Hardhat provides a very simple procedure for testing smart contracts, providing developers to write automated tests when building smart contracts.</p>
  <p id="4d0d">Hardhat provides great <a href="https://hardhat.org/tutorial/testing-contracts.html" target="_blank">documentation</a> for understanding testing methods with Hardhat.</p>
  <p id="UQ2c"></p>
  <h2 id="9479">Truffle Tools</h2>
  <p id="480d">Like Hardhat, Truffle is also a development environment dedicated to Ethereum blockchain.</p>
  <p id="9505">Truffle is a highly popular development framework and provides a large community behind the tool.</p>
  <p id="959f">For decentralized applications development, the developer uses <em>Truffle Suite</em>.</p>
  <p id="fc71">The Truffle Suite is an <strong>ecosystem</strong> for Web3 development that consists of three different tools: <strong>Truffle, Ganache,</strong> and <strong>Drizzle:</strong></p>
  <ul id="qpSO">
    <li id="30ad"><strong>Truffle</strong> is a development environment that uses the EVM for smart contract development.</li>
    <li id="78c2"><strong>Ganache</strong> is a tool used to set up your own local Ethereum blockchain that you can use to deploy and test your smart contracts.</li>
  </ul>
  <p id="71bf">Other than that, Ganache enables developers to avoid paying unnecessary gas fees during the developing process.</p>
  <ul id="qT9E">
    <li id="5bf2"><strong>Drizzle</strong> is a collection of frontend libraries with a Redux store as its basis.</li>
  </ul>
  <p id="b8ba">With this, the frontend development becomes a lot easier.</p>
  <p id="f0ae">Truffle offers several different features like:</p>
  <h3 id="0500"><strong>Smart Contract Management</strong></h3>
  <p id="c512">Truffle helps you manage the artifacts of the smart contracts so that you can focus on the other parts of the development process and spend less time on the file organization.</p>
  <h3 id="e13c"><strong>Scriptable Migration and Deployment</strong></h3>
  <p id="03b0">With Truffle, you can write deployment scripts that allow you to account for the fact that your Dapps will change over time.</p>
  <h3 id="ea7c"><strong>Powerful Interactive Console</strong></h3>
  <p id="006c">Truffle provides 2 different consoles to choose the best tool for your needs.</p>
  <p id="b3fc"><strong>(A) Truffle Console: </strong>A basic interactive console connecting to any Ethereum client. To launch the console, use the <code>truffle console</code> command. When you load the console, you&#x27;ll immediately see the following prompt:</p>
  <figure id="P8YM" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*6ot16qoFzE7fRdGvDaR3cQ.png" width="1042" />
  </figure>
  <p id="xR9q">Truffle console will let you connect with the contracts deployed on the EVM client and interact with the contracts in a manner similar to the one that you would use through javascript.</p>
  <p id="dbbc"><strong>(B) Truffle Develop:</strong> An interactive console that also spawns a development blockchain. It serves the same purpose as the <code>hardhat node</code></p>
  <p id="423e">You can simply launch the Truffle Develop by using the <code>truffle develop</code> command</p>
  <figure id="fmgb" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*FOUvZP1AkjSrapMcHsvBfA.png" width="1400" />
  </figure>
  <h3 id="4e2d">Truffle Dashboard</h3>
  <p id="d01a">Recently, Truffle has introduced <em>Truffle Dashboard,</em> providing an easier way to use your existing Metamask wallet for your deployments and transactions. Using Truffle Dashboard is not only easy but is a plug and play. You can use the Truffle Dashboard inside any Hardhat projects also. Truffle has provided great <a href="https://trufflesuite.com/docs/truffle/getting-started/using-the-truffle-dashboard/" target="_blank">documentation</a> to follow along and use Truffle Dashboard in your project.</p>
  <h2 id="0419">Which one is more powerful?</h2>
  <p id="7512">Let&#x27;s compare some of Hardhat/Truffle features and get a final answer to our question.</p>
  <h3 id="1818">Debugging</h3>
  <p id="2ed8">Solidity is hard to debug. You just get an error message when something breaks and more often than not, it is painful to debug what exactly went wrong.</p>
  <p id="eebd">Thankfully, <strong>Hardhat</strong> introduced something known as the <a href="https://hardhat.org/tutorial/debugging-with-hardhat-network.html#solidity-console-log" target="_blank">console.log</a> feature for Solidity.</p>
  <p id="3590">So you can simply import the console plugin and can use it inside your functions.</p>
  <p id="ce8d">This is what it looks like:</p>
  <figure id="neoD" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*ERNYSUHoT_V6LCMCpQ3VNQ.png" width="1230" />
  </figure>
  <p id="TJtz">Add some <code>console.log</code> inside the function</p>
  <figure id="PHrS" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*f42e9EzFav9cBCKyaO2yNA.png" width="1400" />
  </figure>
  <p id="d6a2">The logging output will show when you run your tests:</p>
  <figure id="3eNG" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*Paw8soXed-eayjpHQHZxjw.png" width="1400" />
  </figure>
  <p id="9bb0">The EVM created by hardhat specifically supports this feature and hence is native to Hardhat Node. This feature alone is a heavy pro for Hardhat.</p>
  <p id="b41a">On the other hand, Truffle has been improving its <a href="https://trufflesuite.com/docs/truffle/getting-started/using-the-truffle-debugger/#using-the-truffle-debugger" target="_blank">debugger</a> and it also has some plugins for it but Hardhat is considered a more easier and powerful tool used for debugging.</p>
  <h3 id="48c8">Libraries (Ethers and Web3)</h3>
  <p id="c7a6">Hardhat uses ethersjs by default but can be easily modified to use <a href="https://hardhat.org/plugins/nomiclabs-hardhat-web3.html#hardhat-web3" target="_blank">Web3</a>. Whereas, Truffle uses Web3 as default plugin for development.</p>
  <p id="64f8">You can also use Etherjs with Truffle but it is considered to be trickier and hard to implement.</p>
  <p id="6804">While ethers-js and web3-js are similar, there is a very high uptick in the number of developers using ethers-js as default. </p>
  <h3 id="1ef8">Local Ethereum Network Node</h3>
  <p id="SxLN">Hardhat поставляется со встроенной <a href="https://www.notion.so/local-Ethereum-network-node-7f385e90d47f4911aee1fcc90aee32d5" target="_blank">нодой Hardhat.</a> Однако у него нет графического интерфейса для разработчиков, позволяющего просматривать информацию об аккаунте в режиме реального времени.</p>
  <p id="Yd6K">Truffle, с другой стороны, использует <a href="https://trufflesuite.com/ganache/" target="_blank">Ganache</a>, который необходимо настраивать отдельно. Однако он поставляется как с CLI, так и с GUI-версией, что обеспечивает гибкость для разработчика.</p>
  <p id="mhYQ">Если вы предпочитаете графический интерфейс, вам следует выбрать Ganache.</p>
  <h3 id="fd26">Deployment</h3>
  <p id="4a4b">For deploying a contract, Hardhat uses basic javascript scripts to <a href="https://hardhat.org/guides/deploying.html#deploying-your-contracts" target="_blank">deploy</a>, so it’s easier to get started with it and is relatively simple to use.</p>
  <p id="5c2b">Whereas, Truffle uses a <a href="https://trufflesuite.com/docs/truffle/getting-started/running-migrations/#running-migrations" target="_blank"><em>migration-based</em></a> deployment procedure (<em>which are js files themselves, but have a sequential order of execution)</em> which is a bit more complicated for a beginner, but can be helpful in the long term keeping in mind that your deployment needs might change in the future.</p>
  <p id="fb6e">But for ease of getting started with deployment, hardhat definitely takes the prize.</p>
  <h3 id="2821">Testing</h3>
  <p id="c357">To perform various tests, both Truffle and Hardhat use the Chai assertion library and Mocha as their testing framework but hardhat also includes <a href="https://getwaffle.io/" target="_blank">waffle</a>. They’re both strong when it comes to testing.</p>
  <h3 id="d255">Statistics</h3>
  <p id="ad97">Before Hardhat was launched, Web3 was the most popular framework for testing out smart contracts.</p>
  <p id="7116">Now you can see that the trend changes over time, and Hardhat has gained more popularity as compared Truffle.</p>
  <p id="1a19">According to the NPMJS Statistics, Truffle has almost 30k weekly downloads. Whereas, Hardhat has around 86k weekly downloads, which is twice as compared Truffle’s.</p>
  <figure id="5fA0" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*TeoxPMnvQuQGJ-h-YfMQJw.png" width="1400" />
  </figure>
  <h3 id="f7da">Availability of Support / Helping Hand</h3>
  <p id="a02e">Truffle’s <a href="https://github.com/orgs/trufflesuite/discussions" target="_blank">Github</a> community is quite active and helpful, whereas Hardhat provides a <a href="https://discord.com/invite/TETZs2KK4k" target="_blank">Discord server</a> for their community support. It must be noted that the entire Truffle offering is supported by <a href="https://consensys.net/" target="_blank">Consensys</a> and hence you can expect a “support helpdesk” treatment. Hardhat too is developed and managed through an organization: the <a href="https://nomic.foundation/" target="_blank">Nomic Foundation </a>and has an amazing and equally good support system through its discord server.</p>
  <h2 id="a788">Conclusion</h2>
  <p id="3b0e">It is really hard to say which is the best. The choice of Truffle vs Hardhat comes down to one’s own preferences and use cases, as they both are two powerful tools.</p>
  <p id="8fb8">If you’re absolutely new to both frameworks, then you should definitely explore both of them and decide which one is the best for you.</p>
  <p id="7715">However, we hope this article was able to give you an insight into the differences between them and was able to help you to find which one to use.</p>
  <p id="XbZV"><em>Don&#x27;t forget to subscribe to our channel for hackathon developers — <a href="https://t.me/definitionmedia" target="_blank">Definition</a>. If you haven&#x27;t already done so:)</em></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@borisaguero/8hh3y93k8Y4</guid><link>https://teletype.in/@borisaguero/8hh3y93k8Y4?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero</link><comments>https://teletype.in/@borisaguero/8hh3y93k8Y4?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero#comments</comments><dc:creator>borisaguero</dc:creator><title>Structure of a Solidity Contract</title><pubDate>Fri, 15 Jul 2022 15:11:59 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/85/62/8562015b-e955-4ebe-b993-3b6f4fa2bd70.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/max/1400/1*44q8hFmsXZHMANUVM0Sumw.jpeg"></img>In this article, we are keeping it easy and are just exploring different components of a contract. The same article in russian.]]></description><content:encoded><![CDATA[
  <h2 id="86b2">Overview</h2>
  <ul id="Jx8i">
    <li id="4301">Contracts in solidity are similar to the concept of classes in Object-Oriented Languages, they can be inherited and can inherit other contracts as well.</li>
    <li id="5f7f">We can have declarations of state variables, functions, events, errors, etc.</li>
    <li id="3096">There are some special types of contracts also such as libraries and interfaces, which we will talk about later.</li>
    <li id="5449">Contracts on their own are a large topic and we will dive deep into it in upcoming parts.</li>
  </ul>
  <p id="daa2">In this article, we are keeping it easy and are just exploring different components of a contract. <a href="https://teletype.in/@borisaguero/heP6HO-U66X" target="_blank">The same article in russian.</a></p>
  <figure id="B8Sl" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*44q8hFmsXZHMANUVM0Sumw.jpeg" width="1400" />
  </figure>
  <h1 id="62ec">State Variables</h1>
  <p id="bdba">State variables are variables whose value is permanently stored in the storage. Below is an example of a state variable.</p>
  <pre id="tEvT" data-lang="arduino">uint storedData;</pre>
  <ul id="5nnm">
    <li id="f287">State variables can be set to <code>public</code>, <code>internal</code>, <code>private</code>.</li>
    <li id="48b1">When a state variable is declared <code>public</code>, the compiler will automatically generate a <code>getter</code> function for that variable.</li>
    <li id="ee9a">If we try to access a public variable from inside the same contract using the<code>this</code> keyword then it will invoke the getter function. If we try to access the state variable without this keyword then we get the value directly from the storage.</li>
    <li id="d61c">Declaring a variable <code>internal</code> works similar to <code>protected</code> access modifier in c/cpp. External contracts won&#x27;t be able to access this variable but the derived contracts can access them.</li>
    <li id="9428">If we mark a variable <code>private</code> then external contracts and derived contracts won&#x27;t be able to access it.</li>
  </ul>
  <h3 id="b4c4">Note</h3>
  <p id="5eb4">Making something private or internal only prevents other contracts from reading or modifying the information, but it will still be visible to the whole world outside of the blockchain.</p>
  <h1 id="4844">Functions</h1>
  <p id="17d8">They are reusable and executable units of code that can be called again and again. Functions can be defined both inside and outside of a contract. Below is an example of a function</p>
  <pre id="03la" data-lang="arduino">function helper(uint x) pure returns (uint)</pre>
  <p id="c756">Let us understand what the above code snippet means:</p>
  <ul id="Hok4">
    <li id="4f45">The word <code>function</code> is a keyword that is used to declare a function.</li>
    <li id="25bd"><code>helper</code> is the name of the function, by which it will be invoked later at some point.</li>
    <li id="6122">inside brackets, <code>uint x</code> means that it takes a parameter of type <code>uint</code>.</li>
    <li id="6027">word <code>pure</code> is also a keyword, which means that this function is not modifying or reading the variable of any state variable.</li>
    <li id="ad62">&#x60;returns (uint) means that this function is returning a value of type uint.</li>
    <li id="53e6">Function calls can happen internally or externally depending upon the visibility of the function.</li>
  </ul>
  <h1 id="87d1">Function Modifiers</h1>
  <p id="d370">Modifiers can be used to change the behavior of a function in a declarative way. For example, you can use a modifier to automatically check a condition prior to executing a function.</p>
  <p id="2cab">Modifiers are derivable properties of a contract only if they are marked <code>virtual.</code>Modifiers are overridable but NOT overloadable. Below is an example of a function modifier.</p>
  <pre id="SVvg" data-lang="arduino">contract Mutex {
 bool locked;
 modifier noReentrancy() {
 require(
 !locked,
 &quot;Reentrant call.&quot;
 );
 locked = true;
 _;
 locked = false;
 }</pre>
  <pre id="84sj"> /// This function is protected by a mutex, which means that
 /// reentrant calls from within &#x60;msg.sender.call&#x60; cannot call &#x60;f&#x60; again.
 /// The &#x60;return 7&#x60; statement assigns 7 to the return value but still
 /// executes the statement &#x60;locked = false&#x60; in the modifier.
 function f() public noReentrancy returns (uint) {
 (bool success,) = msg.sender.call(&quot;&quot;);
 require(success);
 return 7;
 }
}</pre>
  <p id="0967"><strong>Let’s understand what’s going on here.</strong></p>
  <ul id="STmR">
    <li id="25f6">It is a regular contract named Mutex, which contains one Boolean variable, one modifier, and one function.</li>
  </ul>
  <p id="30f2">Let us understand the modifier <code>noReetrancy</code>.</p>
  <ul id="8j1u">
    <li id="e498">This modifier is taking care that no one re-enters and it is applied to the function <code>f()</code>.</li>
    <li id="2fe8">The _ means that the function body will be executed after this and there can be multiple _ in a function, each of them will be replaced with the function body.</li>
    <li id="6afb">After the function is returned the value will be returned but the control flow will continue, i.e, locked will be marked false afterward.</li>
    <li id="c161">Thus when the function will return 7 then the value locked will be re-initialized to false.</li>
    <li id="d248">Multiple modifiers can be applied to a function and they will be evaluated in the order presented.</li>
  </ul>
  <h1 id="01af">Events</h1>
  <p id="0445">Events give abstractions on top of EVM’s logging functionality. Application (usually frontend apps) can subscribe to different events and can listen and act accordingly when an event is fired. Let’s see an example of an event.</p>
  <pre id="SRk7" data-lang="arduino">event HighestBidIncreased(address bidder, uint amount); // Event function bid() public payable { // ... 
emit HighestBidIncreased(msg.sender, msg.value); // Triggering event }</pre>
  <h1 id="3125">Errors</h1>
  <p id="d10f">The error helps to pre-define the name of the error and its data that can occur later in the code. They are used with revert statements. In comparison to <code>string descriptions</code> errors are much cheaper and allow us to encode additional data. Now it is time to see an example of an error</p>
  <pre id="ZTWn" data-lang="arduino">error NotEnoughFunds(uint requested, uint available); 
if (balance &lt; amount) revert NotEnoughFunds(amount, balance);</pre>
  <ul id="X11f">
    <li id="ebde">If we take a closer look at the example, we can see that we have defined an <code>error</code> which will be used when the requested amount is greater than the amount available.</li>
    <li id="41b3">We can see that when we check the condition of insufficient balance we revert instantly with NotEnoughFunds error with current amount and balance as data of error.</li>
  </ul>
  <h1 id="5d14">Struct Types</h1>
  <p id="64d3">If you are familiar with c/cpp you might be already familiar with the concept of structs. Struct is a custom/user-defined data type, that can group different variables. An example of <code>struct</code> type is given below.</p>
  <pre id="K9HT" data-lang="arduino">struct Voter { // Struct 
uint weight; 
bool voted; 
address delegate; 
uint vote; 
}</pre>
  <h1 id="663f">Enums Types</h1>
  <p id="f691">Enums are used to define custom data types but with a finite set of possible values. Its representation is very similar to that in C programming language. Let us understand this with an example.</p>
  <pre id="lxYF" data-lang="arduino">enum State { Created, Locked, Inactive }</pre>
  <ul id="MJtZ">
    <li id="74aa">Enums can be used for state management also.</li>
    <li id="6c18">Like in the above example we can see that <code>State</code> enum can have only three values/states <code>Created</code>, <code>Locked</code> and <code>Inactive</code>.</li>
    <li id="5570">We can react accordingly depending upon the <code>State</code>.</li>
    <li id="576a">You may be already familiar with the approach of state management with enum classes if you are familiar with <code>Kotlin</code> programming language.</li>
  </ul>
  <p id="v60s"><em><a href="https://gist.github.com/JatinVashisht1/8dc8e1691c8a64b7b99684e278321bda" target="_blank">Originally published at GitHub.</a></em></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@borisaguero/heP6HO-U66X</guid><link>https://teletype.in/@borisaguero/heP6HO-U66X?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero</link><comments>https://teletype.in/@borisaguero/heP6HO-U66X?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero#comments</comments><dc:creator>borisaguero</dc:creator><title>Структура смарт-контрактов на Solidity</title><pubDate>Fri, 15 Jul 2022 15:09:26 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/85/62/8562015b-e955-4ebe-b993-3b6f4fa2bd70.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/max/1400/1*44q8hFmsXZHMANUVM0Sumw.jpeg"></img>
В этой статье мы не будем усложнять и просто изучим различные компоненты контракта.]]></description><content:encoded><![CDATA[
  <h2 id="qA4H">Тезисно</h2>
  <ul id="XvcB">
    <li id="5YzJ">Контракты в solidity похожи на концепцию классов в объектно-ориентированных языках, они могут наследоваться и могут наследовать другие контракты.</li>
    <li id="gz9b">Мы можем иметь объявления переменных состояния, функций, событий, ошибок и т.д.</li>
    <li id="5Xtc">Существуют также некоторые специальные типы контрактов, такие как библиотеки и интерфейсы, о которых мы поговорим позже.</li>
    <li id="61Vj">Контракты сами по себе являются большой темой, и мы углубимся в нее в следующих частях.</li>
  </ul>
  <p id="nN3n"><br />В этой статье мы не будем усложнять и просто изучим различные компоненты контракта.</p>
  <figure id="IIKH" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*44q8hFmsXZHMANUVM0Sumw.jpeg" width="1400" />
  </figure>
  <h2 id="xmC0">Переменные состояния</h2>
  <p id="VqFE">Переменные состояния — это переменные, значение которых постоянно хранится в памяти. Ниже приведен пример такой переменной</p>
  <pre id="E4Od" data-lang="arduino">uint storedData;</pre>
  <ul id="CJY1">
    <li id="Qg71">Переменные состояния могут быть объявлены как <code>public</code>, <code>internal</code>, <code>private</code>.</li>
    <li id="eaAL">Когда переменная состояния объявляется публичной, компилятор автоматически генерирует функцию <em>getter</em> для этой переменной.</li>
    <li id="SgPq">Если мы попытаемся получить доступ к публичной переменной изнутри того же контракта, используя ключевое слово thethis, то будет вызвана функция <code>getter.</code>Если мы попытаемся обратиться к переменной состояния без кейворда this, то получим значение напрямую из хранилища.</li>
    <li id="7VI3">Объявление переменной <code>internal</code> работает аналогично <code>protected </code>модификатору доступа в c/cpp. Внешние контракты не смогут получить доступ к этой переменной, но производные контракты смогут получить к ней доступ.</li>
    <li id="vjtS">Если мы пометим переменную как <code>private</code>, то внешние контракты и производные контракты не смогут получить к ней доступ.<br /></li>
  </ul>
  <h3 id="b4c4">Примечание</h3>
  <p id="5eb4">Придание чему-либо приватного или внутреннего характера предотвращает только чтение или изменение инфы другими контрактами, но она все равно будет видна всем за пределами блокчейна.</p>
  <h2 id="3Soi">Функции</h2>
  <p id="CEMK">Они представляют собой многократно используемые и исполняемые части кода, которые можно вызывать снова и снова. Функции могут быть определены как внутри, так и вне контракта. Ниже приведен пример функции</p>
  <pre id="bZnj" data-lang="arduino">function helper(uint x) pure returns (uint)</pre>
  <p id="DVwH">Давайте разберемся, что означает приведенный выше фрагмент кода.</p>
  <ul id="kUuY">
    <li id="1FVW">Слово function - это ключевое слово, которое используется для объявления функции.</li>
    <li id="U0sF">helper — это имя функции, под которым она будет вызываться в дальнейшем.</li>
    <li id="qRSZ">в скобках uint x означает, что функция принимает параметр типа uint.</li>
    <li id="uVK5">слово pure также является кейвордом, что означает, что эта функция не изменяет и не читает переменную какого-либо состояния.</li>
    <li id="Z51t">&#x60;returns (uint) означает, что эта функция возвращает значение типа uint.</li>
    <li id="oAQ1">вызовы функций могут происходить внутри или снаружи, в зависимости от видимости функции.</li>
  </ul>
  <h2 id="QW7S">Модификаторы функций</h2>
  <p id="WzSR">Модификаторы можно использовать для изменения поведения функции с описанным результатом. Например, вы можете использовать модификатор для автоматической проверки условия перед выполнением функции.</p>
  <p id="VGba">Модификаторы являются производными свойствами контракта, только если они помечены как <code>virtual</code>. Модификаторы можно переопределять, но НЕ перегружать. Ниже приведен пример модификатора функции.</p>
  <pre id="NO7D" data-lang="arduino">contract Mutex {
 bool locked;
 modifier noReentrancy() {
 require(
 !locked,
 &quot;Reentrant call.&quot;
 );
 locked = true;
 _;
 locked = false;
 }</pre>
  <pre id="UxnI"> /// This function is protected by a mutex, which means that
 /// reentrant calls from within &#x60;msg.sender.call&#x60; cannot call &#x60;f&#x60; again.
 /// The &#x60;return 7&#x60; statement assigns 7 to the return value but still
 /// executes the statement &#x60;locked = false&#x60; in the modifier.
 function f() public noReentrancy returns (uint) {
 (bool success,) = msg.sender.call(&quot;&quot;);
 require(success);
 return 7;
 }
}</pre>
  <p id="FDQu">Давайте разберемся, о чем эта часть кода.</p>
  <ul id="1aaJ">
    <li id="SqN2">Это обычный контракт с именем Mutex, который содержит одну булевую переменную, один модификатор и одну функцию.</li>
  </ul>
  <p id="Ne5P">Давайте разберемся с модификатором <code>noReetrancy</code></p>
  <ul id="DnMr">
    <li id="PX9a">Этот модификатор следит за тем, чтобы использовал повторные входы, и применяется к функции<code>f()</code>.</li>
    <li id="JyAV">Символ _ означает, что после него будет выполнено тело функции, причем в функции может быть _, каждая из которых будет заменена телом функции.</li>
    <li id="2g92">После возврата функции значение будет возвращено, но флоу управления продолжится, т.е. после этого locked будет помечено как false.</li>
    <li id="4z2H">Таким образом, когда функция вернет 7, значение locked будет повторно инициализировано в false.</li>
    <li id="4Py5">К функции можно применить несколько модификаторов, и они будут оцениваться в указанном порядке.</li>
  </ul>
  <h1 id="D5O8">Ивенты</h1>
  <p id="dLed">Ивенты представляют собой абстракции поверх функциональности протоколирования EVM. Приложения (обычно фронтенд) могут подписываться на различные ивенты, слушать и действовать соответствующим образом при наступлении определенного события. Рассмотрим пример.</p>
  <pre id="EC4A" data-lang="arduino">event HighestBidIncreased(address bidder, uint amount); // Event function bid() public payable { // ... 
emit HighestBidIncreased(msg.sender, msg.value); // Triggering event }
</pre>
  <h2 id="GoFp"><strong>Ошибки</strong></h2>
  <p id="ARsQ">Класс error помогает заранее определить имя ошибки и ее данные, которые могут возникнуть позже в коде. Они используются с операторами возврата. По сравнению со <code>string descriptions</code>ошибки намного дешевле и позволяют кодировать дополнительную дату. Рассмотрим пример.</p>
  <pre id="fyaW" data-lang="arduino">error NotEnoughFunds(uint requested, uint available); 
if (balance &lt; amount) revert NotEnoughFunds(amount, balance);</pre>
  <ul id="7tX6">
    <li id="QRko">Если мы внимательно посмотрим на пример, то увидим, что мы определили <code>error</code>, которая будет использоваться, когда запрашиваемая сумма превышает доступную.</li>
    <li id="hare">При проверке условия недостаточного баланса мы мгновенно возвращаемся к ошибке NotEnoughFunds с текущей суммой и балансом в качестве данных ошибки.</li>
  </ul>
  <h2 id="LPDC">Типы структур</h2>
  <p id="4k7U">Если вы знакомы с c/cpp, то, возможно, вам уже знакома концепция структур. Структура — это кастомный тип данных, который может группировать различные переменные. Пример типа <code>struct</code> приведен ниже.</p>
  <pre id="alT9" data-lang="arduino">struct Voter { // Struct 
uint weight; 
bool voted; 
address delegate; 
uint vote; 
}</pre>
  <h2 id="vWdx">Типы перечисления</h2>
  <p id="IbnV">Enums используются для определения пользовательских типов данных, но с конечным набором возможных значений. Их представление схоже с программирование на C. Давайте увидим это на примере.</p>
  <pre id="VbvB" data-lang="arduino">enum State { Created, Locked, Inactive }</pre>
  <ul id="021C">
    <li id="OHza">Перечисления можно использовать и для управления состояниями.</li>
    <li id="HcyS">Как в примере выше, мы видим, что перечисление <code>State</code> может иметь только три значения/состояния <code>Created</code>, <code>Locked</code> и <code>Inactive</code>.</li>
    <li id="sMy2">Мы можем реагировать соответствующим образом в зависимости от <code>State</code>.</li>
    <li id="Rpnp">Возможно, вы уже знакомы с подходом к управлению состояниями с помощью классов перечислений, если вы знакомы с языком программирования <code>Kotlin</code>.</li>
  </ul>
  <p id="XweT"><a href="https://gist.github.com/JatinVashisht1/8dc8e1691c8a64b7b99684e278321bda" target="_blank">Оригинал статьи на GitHub.</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@borisaguero/Wsl-UQ707Kn</guid><link>https://teletype.in/@borisaguero/Wsl-UQ707Kn?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero</link><comments>https://teletype.in/@borisaguero/Wsl-UQ707Kn?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero#comments</comments><dc:creator>borisaguero</dc:creator><title>Роадмэп для фулстек разработчика блокчейна. Часть 2</title><pubDate>Thu, 14 Jul 2022 12:34:51 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/1d/28/1d2895a0-d2aa-47f0-a7c2-525f05e474b3.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/max/1400/1*drIA9QMJLQWE_M4Vhf2LsA.png"></img>В предыдущей статье  разобрали основные языки и инструменты. Сейчас перейдем к библиотекам и фреймворкам. На всякий случай продублируем полный роадмэп картинкой.]]></description><content:encoded><![CDATA[
  <p id="s83h">В <a href="https://teletype.in/@borisaguero/TJH8D1Wrsyd" target="_blank">предыдущей статье  </a>разобрали основные языки и инструменты. Сейчас перейдем к библиотекам и фреймворкам. На всякий случай продублируем полный роадмэп картинкой.</p>
  <figure id="B8lF" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*drIA9QMJLQWE_M4Vhf2LsA.png" width="1400" />
  </figure>
  <h2 id="01c4"><strong>ReactJs </strong></h2>
  <p id="e9f3">Библиотека JS для создания пользовательских интерфейсов.</p>
  <p id="RO38">ReactJs позволяет создавать инкапсулированные компоненты, которые позже компонуются для создания комплексных пользовательских интерфейсов.</p>
  <p id="Hi1T">Поскольку логика компонентов написана на JavaScript, а не в шаблонах, вы можете легко передавать дату через ваше приложение и держать состояние вне DOM.</p>
  <p id="2e89">React также может выполнять рендеринг на сервере с помощью Node и работать с мобильными приложениями с помощью <a href="https://reactnative.dev/" target="_blank">React Native</a>.</p>
  <figure id="McL8" class="m_column">
    <iframe src="https://www.youtube.com/embed/bMknfKXIFA8?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <p id="9fc8"><a href="https://reactjs.org/." target="_blank">Документация ReactJs.</a></p>
  <h2 id="5231"><strong>NodeJs </strong></h2>
  <p id="EWmT">Справочная документация API предоставляет подробную информацию о функции или объекте в Node.js. Эта документация указывает, какие аргументы принимает метод, какое значение он возвращает и какие ошибки могут быть связаны с этим методом. Она также указывает, какие методы доступны для различных версий Node.js.</p>
  <p id="4ctD">Эта документация описывает встроенные модули, предоставляемые Node.js. Она не cоберает модули от комьюнити.</p>
  <p id="9768">Документация<a href="https://nodejs.org/en/docs/" target="_blank"> NodeJs.</a></p>
  <figure id="oEmX" class="m_column">
    <iframe src="https://www.youtube.com/embed/TlB_eWDSMt4?autoplay=0&loop=0&mute=0"></iframe>
    <figcaption>Old but gold :)</figcaption>
  </figure>
  <h1 id="7dd2"><strong>Web3js </strong></h1>
  <p id="5FQi">Это набор библиотек, позволяющих взаимодействовать с локальными или удаленными нодами Ethereum с помощью HTTP, IPC или WebSocket.</p>
  <p id="hExn">Приведенная ниже документация поможет вам <a href="https://web3js.readthedocs.io/en/v1.5.2/getting-started.html#adding-web3" target="_blank">установить и запустить web3.js</a>, а также предоставит справочную документацию по API с примерами.</p>
  <p id="WUyI"><a href="https://web3js.readthedocs.io/en/v1.5.2/" target="_blank">Документация Web3Js.</a></p>
  <figure id="ziN8" class="m_column">
    <iframe src="https://www.youtube.com/embed/t3wM5903ty0?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <h3 id="0b01">И еще пару туториалов от индусов и не только:)</h3>
  <figure id="YZE6" class="m_column" data-caption-align="center">
    <iframe src="https://www.youtube.com/embed/kDo_MdyNJzI?autoplay=0&loop=0&mute=0"></iframe>
    <figcaption>web3js tutorial</figcaption>
  </figure>
  <figure id="PZ3e" class="m_column">
    <iframe src="https://www.youtube.com/embed/6aF6p2VUORE?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <figure id="E2rT" class="m_column">
    <iframe src="https://www.youtube.com/embed/u3PtGMRmGA0?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <figure id="Qczu" class="m_column">
    <iframe src="https://www.youtube.com/embed/coQ5dg8wM2o?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <figure id="J31o" class="m_column">
    <iframe src="https://www.youtube.com/embed/hKuInl4SxZ8?autoplay=0&loop=0&mute=0"></iframe>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@borisaguero/TJH8D1Wrsyd</guid><link>https://teletype.in/@borisaguero/TJH8D1Wrsyd?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero</link><comments>https://teletype.in/@borisaguero/TJH8D1Wrsyd?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero#comments</comments><dc:creator>borisaguero</dc:creator><title>Роадмэп для фулстек разработчика блокчейна</title><pubDate>Thu, 14 Jul 2022 11:35:11 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/a3/d1/a3d1b86f-c546-425e-a11d-97b6547a2613.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/max/1400/1*drIA9QMJLQWE_M4Vhf2LsA.png"></img>Держите картинку.
]]></description><content:encoded><![CDATA[
  <p id="vUvj">Держите картинку.<br /></p>
  <figure id="WeJX" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*drIA9QMJLQWE_M4Vhf2LsA.png" width="1400" />
  </figure>
  <p id="Udy0">На этом закончим статью. Надеемся, все было понятно.</p>
  <p id="xCsD">Ладно, раскроем этапы чуточку подробнее. В этой статье разберем первую часть роадмэпа: языки и инструменты.</p>
  <p id="kUKx"></p>
  <h2 id="kRgA">Языки для изучения</h2>
  <ol id="VsAA">
    <li id="fb36">Solidity</li>
    <li id="ae5b">Javascript</li>
  </ol>
  <h3 id="AlAw"><strong><em>Solidity</em></strong></h3>
  <p id="uolm">Solidity — это хай-левл объектно-ориентированный язык для создания смарт-контрактов. На создания этого языка повлияли C++, Python и JavaScript. Солидити разработан для виртуальной машины Ethereum (EVM). Более подробную информацию о том, какие языки послужили источником для Solidity, можно найти в разделе «<a href="https://docs.soliditylang.org/en/v0.8.11/language-influences.html" target="_blank">Влияние языков</a>».</p>
  <p id="LtvG">Solidity статически типизирован, поддерживает наследование, библиотеки и сложные типы среди прочих фишек.</p>
  <p id="Bh4V">С помощью Solidity можно создавать контракты для голосования, краудфандинга, блайнд аукционы и мульти-сигнатурные кошельки.</p>
  <p id="QIzL">При развертывании контрактов следует использовать последнюю выпущенную версию Solidity. Обычно только последняя версия получает <a href="https://github.com/ethereum/solidity/security/policy#supported-versions" target="_blank">исправления безопасности</a>. Кроме того, регулярно вносятся изменения, приводящие как к багам:) так и к новому функционалу.</p>
  <p id="c086">Видео туториал по солидити можно глянуть ниже.</p>
  <figure id="z4IJ" class="m_column">
    <iframe src="https://www.youtube.com/embed/ipwxYa-F1uY?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <figure id="lb24" class="m_column">
    <iframe src="https://www.youtube.com/embed/NqGe942J4Y0?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <p id="Spie"><a href="https://docs.soliditylang.org/en/v0.8.11/." target="_blank">Библиотека документов по Solidity.</a></p>
  <h3 id="fRxZ"><strong>Javascript</strong></h3>
  <p id="ZBuj">Вместе с Javascript вы должны знать о front-end разработке, т.е. HTML, CSS, Bootstrap, React, Typescript.</p>
  <p id="gqGv">Для изучения этого языка также есть множество <a href="https://www.w3schools.com/js/DEFAULT.asp" target="_blank">бесплатных курсов,</a> в том числе и на YouTube.</p>
  <figure id="wzvd" class="m_column">
    <iframe src="https://www.youtube.com/embed/8g_CbydoWBo?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <h2 id="Wovf">Инструменты, которые нужно освоить</h2>
  <h3 id="o5AL">Remix</h3>
  <p id="lH4l">Мастхэв познакомиться с <a href="https://remix.ethereum.org/#optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.7+commit.e28d00a7.js" target="_blank">Remix</a>. Это приложение с открытым исходным кодом. Оно ускоряет разработку и имеет богатый набор плагинов с интуитивно понятным графическим интерфейсом. Ремикс используется на всем пути разработки контрактов, а также выступает в качестве игровой площадки для изучения и преподавания Ethereum.</p>
  <p id="I7LE"><strong>Truffle</strong></p>
  <p id="OMdT">Среда тестирования для блокчейнов с использованием EVM. Служит для  облегчения жизни девса. С Truffle вы получаете:</p>
  <ul id="mkSp">
    <li id="4pmx">Встроенную компиляцию смарт-контрактов, связывание, развертывание и бинарный менеджмент.</li>
    <li id="aSqy">Автоматизированное тестирование контрактов для быстрой разработки.</li>
    <li id="xRog">Расширяемая сценариями структура развертывания и миграции.</li>
    <li id="w154">Управление сетью для развертывания в любом количестве публичных и частных сетей.</li>
    <li id="3tRk">Управление пакетами с помощью EthPM и NPM с использованием стандарта <a href="https://github.com/ethereum/EIPs/issues/190" target="_blank">ERC190</a>.</li>
    <li id="QnvE">Интерактивная консоль для прямого связи с контрактом.</li>
    <li id="IrbO">Настраиваемый пайплайн с поддержкой тесной интеграции.</li>
    <li id="PdvB">Внешний скрипт-бегунок, выполняющий скрипты в среде Truffle.<br /></li>
  </ul>
  <p id="dacb">Документы по Truffle <a href="https://trufflesuite.com/docs/truffle/" target="_blank">здесь</a>.</p>
  <p id="e9b3">А на видео ниже индус обучит вас Truffle за полтора часа.</p>
  <figure id="nN45" class="m_column">
    <iframe src="https://www.youtube.com/embed/Zo4dYRw9WSE?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <p id="pLV7"><strong>UPD</strong></p>
  <p id="qXNX">В <a href="https://t.me/definitionhack" target="_blank">чате</a> порекомендовали <a href="https://hardhat.org/" target="_blank">HardHat</a> вместо Truffle. Он более гибкий и на нем можно решать более широкий круг задач. Хотя на начальном этапе нет разницы.</p>
  <p id="mPjk"></p>
  <p id="LLnB"><strong>MetaMask</strong></p>
  <p id="UkM5">Это безопасный зашифрованный кошелек для покупки/продажи/обмена/хранения крипты. Доступен как расширение для браузера и мобильное приложение.</p>
  <p id="XmW0"><a href="https://metamask.io/" target="_blank">MetaMask</a> предоставляет собой самый простой и в то же время безопасный способ подключения к приложениям на основе блокчейна. Вы всегда контролируете ситуацию при взаимодействии с новым децентрализованным интернетом.</p>
  <p id="LWx4">MetaMask генерирует пароли и ключи на вашем устройстве, поэтому только вы имеете доступ к своим учетным записям и данным. </p>
  <figure id="vUT3" class="m_column">
    <iframe src="https://www.youtube.com/embed/MfkqgXNPiHg?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <h3 id="6lCU"><strong>Ganache</strong></h3>
  <p id="Jr75">Персональный блокчейн для разработки Ethereum, который можно использовать для развертывания контрактов, разработки приложений и тестирования апок. Есть декстопная версия и в виде командной строки <em>(ранее известной как TestRPC)</em>. Ganache доступен для Windows, Mac и Linux.</p>
  <p id="4aOo"><a href="https://trufflesuite.com/ganache/" target="_blank">Ganache</a> — это блокчейн для быстрой разработки распределенных приложений Ethereum и Corda. Вы можете использовать Ganache на протяжении всего цикла разработки; это позволит вам разрабатывать, развертывать и тестировать ваши приложения в безопасной и детерминированной среде.</p>
  <p id="Dfs4">Ganache поставляется в двух вариантах: UI и CLI. Ganache UI - это декстопное приложение, поддерживающее технологии Ethereum и Corda. Инструмент командной строки, <a href="https://github.com/trufflesuite/ganache-cli-archive" target="_blank">ganache-cli</a> , доступен для разработки Ethereum. <br /><br /><a href="https://github.com/trufflesuite/ganache-cli-archive/blob/master/README.md" target="_blank">Документы для разработки с помощью командной строки.</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@borisaguero/KfcRlI-K6pG</guid><link>https://teletype.in/@borisaguero/KfcRlI-K6pG?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero</link><comments>https://teletype.in/@borisaguero/KfcRlI-K6pG?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero#comments</comments><dc:creator>borisaguero</dc:creator><title>Что такое метатранзакции и как их создать</title><pubDate>Tue, 12 Jul 2022 11:01:44 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/cb/19/cb19d69f-bb52-44f2-aba2-300361724bb0.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/max/1014/1*zBAt5p7I6uHeDPCorJtKWQ.png"></img>Идея проста: третья сторона (Relayer) отправляет транзакции пользователя и оплачивает стоимость газа.]]></description><content:encoded><![CDATA[
  <p id="LxP1">Идея проста: третья сторона (Relayer) отправляет транзакции пользователя и оплачивает стоимость газа.</p>
  <p id="8KbO">Схема выглядит так:<br />1️⃣Юзер: подписывает метатранзакцию (то есть сообщение, содержащее информацию о транзакции, которую он хотел бы выполнить).<br />2️⃣Релаер: веб-сервер с кошельком, который подписывает действительную транзакцию и отправляет ее в блокчейн.<br />3️⃣Форвард: контракт, отвечающий за проверку подписи метатранзакции, которая перенаправляет запрос контракту-получателю.<br />4️⃣Получатель: контракт, который пользователь намеревался вызвать без оплаты платы за газ, этот контракт должен уметь определять личность пользователя, который первоначально запросил транзакцию.</p>
  <p id="12Q7">В Ethereum такие ретрансляторы организованы в сеть, в так называемую Open Gas Station Network (OGSN (<a href="https://opengsn.org/" target="_blank">https://opengsn.org/</a>)). Механизм OGSN такой же, но сеть ретрансляторов обеспечивает децентрализацию и многие другие преимущества.</p>
  <p id="0p6a">Давайте попробуем воссоздать упрощенную схему метатранзакций без кассиров, хаба ретрансляторов и др. участников.</p>
  <h2 id="ETIm"><strong>Перенаправляющий контракт</strong></h2>
  <p id="A46e">Отправной точкой для понимания основного механизма является реализация OpenZeppelin <a href="https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/metatx/MinimalForwarder.sol" target="_blank">MinimalForwarder</a>, который будет использоваться вместе с контрактом, совместимым с ERC2771, в качестве контракта получателя.</p>
  <p id="1sVw">Давайте рассмотрим контракт MinimalForwarder.sol:</p>
  <pre id="eFRX" data-lang="arduino">contract MinimalForwarder is EIP712</pre>
  <p id="vpaI">Контракт соответствует предложению по усовершенствованию EIP-712, стандарту хэширования и подписи типизированных структурированных данных, реализуя схему разделителя доменов для защиты от атак повторного воспроизведения при возможном форке чейна.</p>
  <pre id="tjag" data-lang="arduino">struct ForwardRequest {
 address from;
 address to;
 uint256 value;
 uint256 gas;
 uint256 nonce;
 bytes data;
 }</pre>
  <p id="AIYz">Он имеет тип struct, определяющий необходимые поля Meta Transaction.</p>
  <pre id="6F6f" data-lang="arduino">mapping(address =&gt; uint256) private _nonces;</pre>
  <p id="Rg6y">Мэппинг между адресами и одноразовым токеном доступа, это связано с тем, что мета-транзакции не регистрируются в блокчейне, поэтому контракт должен самостоятельно проверять количество мета-транзакций, отправленных с данного адреса, чтобы избежать атак повторного воспроизведения.</p>
  <pre id="Dh0i" data-lang="arduino">function verify(ForwardRequest calldata req, bytes calldata signature) public view returns (bool)</pre>
  <p id="GQsR">Эта функция проверяет, что Мета-транзакция (ForwarderRequest) имеет валидную подпись Пользователя и ее nonce корректен.</p>
  <pre id="EKB3" data-lang="arduino">function execute(ForwardRequest calldata req, bytes calldata signature)
 public
 payable
 returns (bool, bytes memory)
 {</pre>
  <p id="YEIz">После метода верификации эта функция обновляет nonce пользователя и пересылает мета-транзакцию контракту-получателю.</p>
  <h2 id="BJEi">Контракт получателя</h2>
  <p id="zBeq">Теперь нам нужен пример контракта с получателем. Его иллюстрация на картинке ниже.</p>
  <figure id="SzKF" class="m_column">
    <img src="https://miro.medium.com/max/1014/1*zBAt5p7I6uHeDPCorJtKWQ.png" width="507" />
  </figure>
  <p id="bzEt">Этот контракт имеет в памяти объект флага, который изначально белый и не имеет владельца.</p>
  <p id="VuQe">Любой пользователь может вызвать метод <em>setFlagOwner</em> контракта, заявить о своем праве собственности на флаг и покрасить его в тот цвет, который он предпочитает.</p>
  <p id="sc8P">Контракт получателя должен работать как с прямыми, так и с перенаправленными транзакциями. Разница между ними заключается в значении <em>msg.sender.</em></p>
  <p id="VbvX">В перенаправленных транзакциях msg.sender — это адрес контракта форвардера. Таким образом, в этой ситуации контракт получателя должен получить фактический msg.sender из полезной нагрузки транзакции.</p>
  <p id="jyEf">Это достигается путем расширения контракта @openzeppelin/contracts/metatx/ERC2771Context.sol</p>
  <pre id="7HIY" data-lang="arduino">contract Recipient is ERC2771Context</pre>
  <p id="v6R8">Кроме того, контракт должен быть развернут с указанием трастового форвардера <em>(единственного, которому разрешено пересылать транзакции)</em>:</p>
  <pre id="TjK2" data-lang="arduino">constructor(address trustedForwarder) ERC2771Context(trustedForwarder) {}</pre>
  <p id="1atw">и в коде контракта msg.sender должен быть заменен на метод _msgSender().</p>
  <pre id="ka4Q" data-lang="arduino">function setFlagOwner(string memory _color) external {
 address previousHolder = currentHolder;
 currentHolder = _msgSender();
 color = _color;
 emit FlagCaptured(previousHolder, currentHolder, color);
 }</pre>
  <p id="8LbH">Ниже показано, как метод _msgSender() может получить предполагаемого отправителя сообщения как для прямых, так и для перенаправленных транзакций.<br /></p>
  <pre id="GCJG" data-lang="arduino">function _msgSender() internal view virtual override returns (address sender) {
 if (isTrustedForwarder(msg.sender)) {
 assembly {
 sender := shr(96, calldataload(sub(calldatasize(), 20)))
 }
 } else {
 return msg.sender;
 }
 }</pre>
  <p id="8pub">Аналогичные подходы, которые следует изучить:</p>
  <ul id="57LV">
    <li id="9be0"><a href="https://wyvernprotocol.com/docs" target="_blank">https://wyvernprotocol.com/docs</a></li>
    <li id="5b4d"><a href="https://github.com/etherdelta/smart_contract" target="_blank">https://github.com/etherdelta/smart_contract</a></li>
    <li id="c531"><a href="https://protocol.0x.org/en/latest/index.html" target="_blank">https://protocol.0x.org/en/latest/index.html</a></li>
    <li id="3f56"><a href="https://github.com/DexyProject/protocol" target="_blank">https://github.com/DexyProject/protocol</a></li>
  </ul>
  <p id="0dcx"></p>
  <h2 id="Ujao">Пример</h2>
  <p id="EnNC">Работающий пример доступен на <a href="https://meta-transaction.vercel.app/." target="_blank">Vercel.</a></p>
  <p id="5s3q">Веб-интерфейс доступен для пользователей, которые хотят вызвать метод setFlagOwner без оплаты за газ. Единственным требованием является наличие установленного в браузере плагина metamask для подписи сообщений, но кто-то все равно должен платить за газ. Плата за газ (разумеется, тестовый) будет оплачиваться демо-сервером Relayer.</p>
  <p id="fdvc"><a href="https://github.com/donpabblo/meta-transaction." target="_blank">Код контракта и демо-сервера.</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@borisaguero/_kaeRF48yKw</guid><link>https://teletype.in/@borisaguero/_kaeRF48yKw?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero</link><comments>https://teletype.in/@borisaguero/_kaeRF48yKw?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero#comments</comments><dc:creator>borisaguero</dc:creator><title>Примеры популярного скама в web3</title><pubDate>Sun, 10 Jul 2022 08:53:49 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/4a/b8/4ab8054e-39bc-4f6f-8d22-2450fa9aed75.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/max/1400/0*bNECz-apMnlcHQvg.PNG"></img>
Жертве социальных сетей сообщали, в основном на YouTube или в социальных сетях, что он может покупать и продавать гэпы ликвидности на Pancakeswap.]]></description><content:encoded><![CDATA[
  <h2 id="NIUZ"><strong>Pancake Swap Scam</strong></h2>
  <p id="iVlk">Жертве социальных сетей сообщали, в основном на YouTube или в социальных сетях, что он может покупать и продавать гэпы ликвидности на Pancakeswap.</p>
  <p id="yD72">Мошенник сообщает пользователю, что ему не нужно быть экспертом или много знать о смарт-контрактах, и отправляет ссылку для развертывания контракта.</p>
  <p id="aeZb">Пример кода этого скама.</p>
  <pre id="K2va" data-lang="arduino">constructor(
 string memory _tokenName,
 string memory _tokenSymbol,
 uint256 _loanAmount
 ) public {
 tokenName = _tokenName;
 tokenSymbol = _tokenSymbol;
 flashLoanAmount = _loanAmount;
 router = new RouterV2();
 }</pre>
  <p id="YfQ7">Ссылка на контракт роутера отличается от того, что говорит нам контракт. Обратите внимание, что в строке 9 написано router = new routerV2();</p>
  <p id="XVKa">Помните, что это функция-конструктор, которая должна выполняться перед любой другой функцией в контракте.</p>
  <p id="K8K7">Перед выполнением контракта вызывается функция router.</p>
  <figure id="XEVl" class="m_column">
    <img src="https://miro.medium.com/max/1400/0*bNECz-apMnlcHQvg.PNG" width="877" />
  </figure>
  <p id="NcpW">Скопируйте URL из роутера в браузер, и вы увидите другой контракт. Ссылка импортирует функцию router V2 в первый контракт, который запускает следующий.</p>
  <pre id="jPSi" data-lang="arduino">contract RouterV2 {
 function pancakeRouterV2Address() public pure returns (address) {
 return 0x05fF2B0DB69458A0750badebc4f9e13aDd608C7F;
 }</pre>
  <pre id="0wSe"> function compareStrings(string memory a, string memory b)
 public pure
 returns (bool)
 {
 return (keccak256(abi.encodePacked((a))) ==
 keccak256(abi.encodePacked((b))));
 }</pre>
  <pre id="ljSm"> function pancakeSwapAddress() public pure returns (address) {
 return 0x65163Fd9FEac0a9B52862bC1a0e32Cd6656597f2;</pre>
  <pre id="fBxg"> }</pre>
  <p id="U80V">Заметьте разницу между двумя контрактами, проверьте адрес в эксплореле и появится вот это.</p>
  <figure id="Kmew" class="m_column">
    <img src="https://miro.medium.com/max/1400/0*lN38P9Ixf925D0yN.PNG" width="1053" />
  </figure>
  <p id="CMqK">Этот счет получает ETH от ничего не подозревающих пользователей, которые запускают код и отправляют свои средства в надежде получить своп или кредит.</p>
  <h1 id="aa0d">FLIP-COIN Scam</h1>
  <p id="4t7o">Один из самых древних и простых разводов. Жертве сообщают, что по конкретному адресу нужно отправить сумму монет, которая обязательно удвоится. Так скамили совсем недавно с миллионным фейковым аккаунтом Илона Маска в инстаграме с использованием дипфейка. </p>
  <p id="qjz4">Мошенники использовали также аккаунты Джеффа Безоса, Apple, Uber, Барака Обамы и Джо Байдена.</p>
  <figure id="7MRA" class="m_column">
    <img src="https://miro.medium.com/max/1400/0*mUOkJL9I5Z3g3z67.jpg" width="750" />
  </figure>
  <p id="0qBW">На таком глупом скаме жертвы потеряли более $2 млн.</p>
  <h1 id="e494">Pump and Dump Scam</h1>
  <p id="4Hux">Влиятельные люди, инфлиенсеры и внутренние трейдеры покупают крипту по низкой цене. Взамен рекламируют в социальных сетях и пампят за счет своей аудитории. </p>
  <p id="LuYt">Инсайдер получает огромную прибыль от сброса монеты на пике пампа, зарабатывая больше денег, в то время как ничего не подозревающие покупатели теряют свои средства, когда цена падает.</p>
  <p id="B6Nt"></p>
  <p id="JSmF">Читая такие простые схемы скама, кажется, что никогда не попадешься. Но мошенники становятся изобретательнее с каждым днем. Рекомендуем прочитать <a href="https://www.cointracker.io/blog/security-at-cointracker-how-to-avoid-cryptocurrency-scams" target="_blank">статью по защите от скама </a>просто на всякий случай.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@borisaguero/jmL7Nod1Bvq</guid><link>https://teletype.in/@borisaguero/jmL7Nod1Bvq?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero</link><comments>https://teletype.in/@borisaguero/jmL7Nod1Bvq?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=borisaguero#comments</comments><dc:creator>borisaguero</dc:creator><title>Как создать сервер чата на Solidity</title><pubDate>Mon, 04 Jul 2022 13:27:02 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/2b/e9/2be99ecf-2201-4fb5-83ac-e8c12b549c43.png"></media:content><description><![CDATA[<img src="https://callbackhunter.com/blog/wp-content/uploads/2017/05/1-4.jpg"></img>Для начала нам нужно определиться с архитектурой приложения. Основная проблема, которую нужно решить — это имитировать обычное серверное приложение для чата со смарт-контрактами.

В простом приложении чата у нас есть 2 пользователя, отправляющих тексты друг другу в одном экземпляре чата. Этот чат может быть таблицей базы данных, содержащей в каждой строке сообщение с from, toи message.

Мы же создадим смарт-контракт, который заменит эту базу данных переменными  контракта.

]]></description><content:encoded><![CDATA[
  <p id="y8Oh">Для начала нам нужно определиться с архитектурой приложения. Основная проблема, которую нужно решить — это имитировать обычное серверное приложение для чата со <strong>смарт-контрактами.<br /><br /></strong>В простом приложении чата у нас есть 2 пользователя, отправляющих тексты друг другу в одном экземпляре чата. Этот чат может быть таблицей базы данных, содержащей в каждой строке сообщение с <code>from</code>, <code>to</code>и <code>message</code>.<br /><br />Мы же создадим смарт-контракт, который заменит эту базу данных переменными  контракта.<br /><br /></p>
  <figure id="fQEZ" class="m_column">
    <img src="https://callbackhunter.com/blog/wp-content/uploads/2017/05/1-4.jpg" width="1001" />
  </figure>
  <h2 id="6062">Создание контракта</h2>
  <p id="9a9e">Первое, что мы должны определить, это контракт, который будет работать как чат-сервер. Для этого мы можем начать создавать простой контракт, в котором определим структуру сообщения.</p>
  <pre id="zxmD" data-lang="arduino">pragma solidity &gt;=0.7.0 &lt;0.9.0;</pre>
  <pre id="RH9W">contract Chat {</pre>
  <pre id="VwSw">struct Message {</pre>
  <pre id="Q6lm">uint id;</pre>
  <pre id="ukX3">address from;</pre>
  <pre id="0itL">string text;</pre>
  <pre id="zY6N">}</pre>
  <pre id="L4cu">}</pre>
  <h2 id="c96d">Получение сообщения</h2>
  <p id="RYla">Чат-приложения обычно работают с сокетами для того, чтобы &quot;прослушивать&quot; серверное приложение на случай отправки новых сообщений пользователю.</p>
  <p id="UtEF">В Solidity способ сообщить фронтенду о том, что что-то произошло, - это события, поэтому именно их мы будем использовать для получения сообщения.</p>
  <pre id="1X89" data-lang="css">pragma solidity &gt;=0.7.0 &lt;0.9.0;</pre>
  <pre id="o3FF">contract Chat {</pre>
  <pre id="PZf0">struct Message {</pre>
  <pre id="Owon" data-lang="ruby">uint id;</pre>
  <pre id="0f7h">address from;</pre>
  <pre id="L9EZ">string message;</pre>
  <pre id="cDgl">}</pre>
  <pre id="amAE">// tells the frontend that a new message has been sent.</pre>
  <pre id="WQ7A">event sendMessageEvent(uint indexed _id, address indexed _from, string _message);</pre>
  <h2 id="WXoT">Отправка сообщений</h2>
  <p id="uueF">Для запуска действий внутри смарт-контракта мы можем поступать, как обычно в других языках программирования, вызывая функции, поэтому в данном случае мы вызовем функцию внутри смарт-контракта, которая создаст новое сообщение и запустит <code>sendMessageEvent</code>, чтобы сообщить получателю, что новое сообщение было отправлено.</p>
  <pre id="19Id" data-lang="arduino">pragma solidity &gt;=0.7.0 &lt;0.9.0;</pre>
  <pre id="pdPl">contract Chat {</pre>
  <pre id="fRjJ">// ...</pre>
  <pre id="2idQ">// We can use an autoincremental id for each new message.</pre>
  <pre id="Svag">uint lastMessageId;</pre>
  <pre id="EDZT">function sendMessage(string _text) public {</pre>
  <pre id="bD1u">// increments id and sends message.</pre>
  <pre id="cXTo">lastMessageId++;</pre>
  <pre id="7VEs">sendMessageEvent(lastMessageId, msg.sender, _text);</pre>
  <pre id="R9z4">}</pre>
  <pre id="mKKJ">}</pre>
  <h2 id="14NQ">Создание диалога</h2>
  <p id="5vE7">Очень важной особенностью чатов является возможность не только отправлять и получать сообщения как пользователь, но и составлять список всех старых сообщений, которые мы отправляли друг другу во время разговора.</p>
  <p id="aR2X">Для этого в языке программирования Solidity есть удобный тип под названием <code>mapping</code> . С помощью этого типа данных мы можем хранить массивы данных, сопоставленных по индексам.</p>
  <pre id="Vrce" data-lang="arduino">pragma solidity &gt;=0.7.0 &lt;0.9.0;</pre>
  <pre id="VuC5">contract Chat {</pre>
  <pre id="ULt0">// the list of old messages in the chat</pre>
  <pre id="13h8">mapping(uint =&gt; Message) public messagesList;</pre>
  <pre id="RUkd">function listMessages() public constant returns (uint[]){</pre>
  <pre id="0cT0">// if the chat is empty</pre>
  <pre id="A2C8">if(lastMessageId == 0) {</pre>
  <pre id="z3lB">return new uint[](0);</pre>
  <pre id="wjCD">}</pre>
  <pre id="OdGO">// give me the ids.</pre>
  <pre id="4w5G">uint[] memory ids = new uint[](lastMessageId);</pre>
  <pre id="aU4x">// loads all the message ids on &#x27;ids&#x27; list.</pre>
  <pre id="5rdG">for (uint i = 1; i &lt;= lastMessageId; i++) {</pre>
  <pre id="1Ma8">// if the sender is different than me.</pre>
  <pre id="83Rk">if(messages[i].sender != msg.sender) {</pre>
  <pre id="G44o">ids[numOfMessages] = messagesList[i].id;</pre>
  <pre id="fnvi">}</pre>
  <pre id="13eh">}</pre>
  <pre id="q5Si">return ids;</pre>
  <pre id="HZcx">}</pre>
  <pre id="SSqE">}</pre>
  <p id="bowy">Проблема теперь в том, что <code>messageList</code> всегда пуст, для загрузки этого списка нам нужно изменить функцию <code>sendMessage</code>, чтобы загружать новое сообщение в мэппинг каждый раз, когда отправляется одно сообщение.</p>
  <pre id="M1O8" data-lang="typescript">pragma solidity &gt;=0.7.0 &lt;0.9.0;</pre>
  <pre id="2Qno">contract Chat {</pre>
  <pre id="Z0mN">function sendMessage(string _text) public {</pre>
  <pre id="Kvj2">lastMessageId++;</pre>
  <pre id="WwX2">// loads the message into the list.</pre>
  <pre id="ij3a">messageList[messageIdCounter] = Message(</pre>
  <pre id="5rCh">lastMessageId,</pre>
  <pre id="h36P">msg.sender,</pre>
  <pre id="bMPK">_text</pre>
  <pre id="FCrB">);</pre>
  <pre id="cuHG">//Trigger event</pre>
  <pre id="M07W">newMessageEvent(lastMessageId, msg.sender, _text);</pre>
  <pre id="tXLM">}</pre>
  <pre id="cPnt">}</pre>
  <h2 id="cKE2">Развертывание контракта</h2>
  <p id="UZj6">Существует множество платформ, на которых вы можете очень просто протестировать свои собственные контракты на фронтенд-приложениях. Наиболее популярной из них является Remix, вы можете написать контракт, развернуть его в тестовой цепочке и докручивать его там.</p>

]]></content:encoded></item></channel></rss>