<?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>bomb diggity</title><generator>teletype.in</generator><description><![CDATA[bomb diggity]]></description><image><url>https://img3.teletype.in/files/ea/fb/eafbf485-dc1a-4daa-bff0-4faf2a524eef.png</url><title>bomb diggity</title><link>https://teletype.in/@nodiggity</link></image><link>https://teletype.in/@nodiggity?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nodiggity</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/nodiggity?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/nodiggity?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sat, 04 Apr 2026 03:48:21 GMT</pubDate><lastBuildDate>Sat, 04 Apr 2026 03:48:21 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@nodiggity/U11opzC3qpj</guid><link>https://teletype.in/@nodiggity/U11opzC3qpj?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nodiggity</link><comments>https://teletype.in/@nodiggity/U11opzC3qpj?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nodiggity#comments</comments><dc:creator>nodiggity</dc:creator><title>Arkham часть 1. (Top 100 holders LayerZero)</title><pubDate>Sun, 30 Jun 2024 13:09:32 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/59/81/59811083-fab6-4220-a51c-d1d210d1f3c3.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/16/7e/167ef0c9-be1c-4c8c-97fb-bf2d63d70800.png"></img>1.1 Перехожу в личный кабинет, раздел - мои панели.]]></description><content:encoded><![CDATA[
  <figure id="sNI8" class="m_custom">
    <img src="https://img2.teletype.in/files/16/7e/167ef0c9-be1c-4c8c-97fb-bf2d63d70800.png" width="626" />
  </figure>
  <h3 id="w5GW">1. Создание панели мониторинга. </h3>
  <p id="aB7c">1.1 Перехожу в личный кабинет, раздел - мои панели.</p>
  <figure id="eMJr" class="m_original">
    <img src="https://img3.teletype.in/files/6c/89/6c89a329-147b-45c6-9d5f-3bae791359c3.png" width="1393" />
  </figure>
  <p id="7E63">1.2 Создать панель.</p>
  <figure id="lWGi" class="m_original">
    <img src="https://img1.teletype.in/files/42/07/4207dc19-9474-424b-af31-455dd79b9e92.png" width="348" />
  </figure>
  <figure id="bYCc" class="m_custom">
    <img src="https://img2.teletype.in/files/56/a3/56a3d94c-b766-4104-8cf0-0735985357ca.png" width="863" />
  </figure>
  <figure id="bWmZ" class="m_custom">
    <img src="https://img2.teletype.in/files/91/f4/91f45e83-113a-411e-a8df-ef985cbc40ec.png" width="783.8040712468194" />
  </figure>
  <p id="t9KL">1.3 Нахожу панель с холдерами. </p>
  <figure id="lLDT" class="m_custom">
    <img src="https://img3.teletype.in/files/a8/de/a8deeea1-b2c7-4a10-922a-c050392720f2.png" width="1105" />
  </figure>
  <p id="t2Vd">1.4 Настраиваю под нужный токен.</p>
  <figure id="8tQw" class="m_custom">
    <img src="https://img2.teletype.in/files/53/4c/534cb6eb-dde2-4381-b399-847ecff45745.png" width="989" />
  </figure>
  <p id="pEB7">1.4.1 В правой части, выбираю размер информационной панели. </p>
  <figure id="bRbd" class="m_custom">
    <img src="https://img2.teletype.in/files/52/87/528710d0-bc3e-4b5b-8e2b-02601ba09047.png" width="993.3835616438356" />
  </figure>
  <p id="jN7p">1.5 Наша панель ZRO холдеров создана.</p>
  <figure id="fV2S" class="m_original">
    <img src="https://img4.teletype.in/files/fe/0c/fe0c545c-accb-4788-af81-a85f333c92bd.png" width="984" />
  </figure>
  <h3 id="EYb8"></h3>
  <h3 id="hLIg">2. Анализ данных.</h3>
  <p id="AoWJ"><em>Некоторым кошелькам, аркхам автоматически присваивает метки принадлежности. Создам таблицу эксель и занесу топ 100 адресов, разделю по категориям (кошельки проекта, маркет мейкеры/биржи, х - кошельки.</em></p>
  <figure id="yiUs" class="m_custom">
    <img src="https://img1.teletype.in/files/49/11/4911ad55-c983-46a4-992d-4bee3230dc68.png" width="1029" />
  </figure>
  <p id="4eeu"><em>На примере кошелька Gnosis Safe Proxy (0x806f68Bb6ce8f3100D4745C8b13b36e4f40D8431)</em></p>
  <p id="JGmI"><a href="https://platform.arkhamintelligence.com/explorer/address/0x806f68Bb6ce8f3100D4745C8b13b36e4f40D8431" target="_blank">https://platform.arkhamintelligence.com/explorer/address/0x806f68Bb6ce8f3100D4745C8b13b36e4f40D8431</a></p>
  <figure id="qj1m" class="m_custom">
    <img src="https://img3.teletype.in/files/a0/91/a091e148-936c-4f97-952a-e100b44fc0c5.png" width="1029" />
  </figure>
  <figure id="GT8V" class="m_custom">
    <img src="https://img2.teletype.in/files/94/74/9474851b-431d-40b6-a035-aa4ca7bb5f54.png" width="999.4545454545454" />
  </figure>
  <p id="XXBm"><a href="https://etherscan.io/tx/0x9f4c16f296f5ea5576496a4c4eaff7cf2411fb23baabd40c85844c45ac6e0b18" target="_blank">https://etherscan.io/tx/0x9f4c16f296f5ea5576496a4c4eaff7cf2411fb23baabd40c85844c45ac6e0b18</a></p>
  <figure id="rrca" class="m_custom">
    <img src="https://img3.teletype.in/files/a9/e1/a9e1a9f7-5bf5-4737-a110-600767e3e0da.png" width="825.0259259259259" />
  </figure>
  <p id="48WO"><em>Как видим в <strong>Tokens Transferred: 23 адреса.</strong> В таблице каждый батч отмечаю своим цветом.</em></p>
  <figure id="1nEp" class="m_custom">
    <img src="https://img3.teletype.in/files/a0/34/a034e60c-dc57-4bab-a7ae-bae9a275cf0a.png" width="435.09677419354836" />
  </figure>
  <p id="DMSD"><em>Таким образом формирую группы: 1) кошельки LZ, отдельным цветом отмечаю биржи, мм, кошельки Airdrop и AptosAirdropZRO. 9 адресов из 100, отобрал в категорию неизвестных кошельков X-address, к ним и перейдем.</em></p>
  <figure id="yXYL" class="m_custom">
    <img src="https://img2.teletype.in/files/5f/cf/5fcf2ba3-6373-4bd5-be98-214016fc65b7.png" width="674" />
  </figure>
  <h3 id="7iYY">3. X - address</h3>
  <p id="LrsR">Общие данные: на 29.06.24 топ<strong> 100 кошельков</strong> - владеют 95,48% всего саплая, *без учета airdrop кошельков - 93,49% В локе 70 из топ 100 и на их долю приходится 88,6%</p>
  <figure id="yb2M" class="m_original">
    <img src="https://img3.teletype.in/files/65/28/6528fad1-6c1e-47be-a069-93618c9a2327.png" width="710" />
  </figure>
  <p id="tI0v">Х кошельки - 9 из топ 100, на их долю приходится 9M токенов, 0,9% от всех токенов (10,5% от 85M)</p>
  <figure id="oJh9" class="m_custom">
    <img src="https://img2.teletype.in/files/db/e2/dbe2922a-6106-4dcb-b13e-7e149cdd752b.png" width="561.4878892733564" />
  </figure>
  <p id="cyGw"><strong>1) 0x63be42b40816eB08F6Ea480e5875E6F4668da379</strong></p>
  <p id="bZ0I">Переходим в <a href="https://platform.arkhamintelligence.com/visualizer/entity/0x63be42b40816eB08F6Ea480e5875E6F4668da379?flow=all&positions=%7B%7D&sortDir=desc&sortKey=time&usdGte=0.1" target="_blank">визуализатор</a>: </p>
  <figure id="3H8H" class="m_custom">
    <img src="https://img3.teletype.in/files/2b/2f/2b2f835f-b83f-4fc8-b9fb-65c0d8462bcf.png" width="801" />
  </figure>
  <p id="hYGD"><em>Среди множества зеленых линий входящих транзакций, есть красная линия - отток средств.</em></p>
  <figure id="AT1E" class="m_original">
    <img src="https://img2.teletype.in/files/14/94/149461b5-fa14-46c4-891e-edb995a7daea.png" width="445" />
  </figure>
  <p id="9cMv">Кошельку 16 дней, в сети эфира аккумулирует ZRO крупными суммами из других 6 кошельков. *На кошельке только токены ZRO и эфира.</p>
  <figure id="thRb" class="m_original">
    <img src="https://img2.teletype.in/files/94/be/94be6a9d-239b-4b6b-ae2a-5be8a6ce76df.png" width="445" />
  </figure>
  <p id="4GKG">Во вкладке дополнительной информации, возможна фильтрация переводов.</p>
  <figure id="MiPV" class="m_original">
    <img src="https://img2.teletype.in/files/da/58/da58a1dc-1e29-4a2b-8625-806313610d2a.png" width="954" />
  </figure>
  <p id="vGVp"><em>И была одна транзакция на вывод в обратную сторону. В общем, имеет смысл кошелек поставить на алерт и наблюдать за ним дальше. </em></p>
  <p id="4yip"></p>
  <p id="E1gC"><strong>2) 0x8dB0f952B8B6A462445C732C41Ec2937bCae9c35</strong></p>
  <figure id="68zX" class="m_original">
    <img src="https://img3.teletype.in/files/6d/24/6d24d074-0608-4e9f-bfb9-56c219f5bf65.png" width="782" />
  </figure>
  <figure id="mtZM" class="m_original">
    <img src="https://img3.teletype.in/files/ab/b7/abb7d6f9-e76e-4700-ac99-e6accda9bd38.png" width="942" />
  </figure>
  <p id="zUi6"><em>Несколько тысяч пополнений небольшими суммами, все в сети base.</em></p>
  <p id="8Faq"><a href="https://platform.arkhamintelligence.com/explorer/address/0x8dB0f952B8B6A462445C732C41Ec2937bCae9c35" target="_blank">https://platform.arkhamintelligence.com/explorer/address/0x8dB0f952B8B6A462445C732C41Ec2937bCae9c35</a></p>
  <figure id="ZR5l" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/43/a1/43a1d837-e331-400a-a50f-be90bfa20fde.png" width="945" />
    <figcaption>Tранзакции оттока.</figcaption>
  </figure>
  <p id="S3BZ"></p>
  <p id="vQZJ"><strong>3) 0x25681Ab599B4E2CEea31F8B498052c53FC2D74db</strong></p>
  <figure id="VQj7" class="m_custom">
    <img src="https://img2.teletype.in/files/9a/fc/9afcca22-0a2b-40aa-9ea5-b5a42ffc0b16.png" width="935" />
  </figure>
  <figure id="KxgN" class="m_custom">
    <img src="https://img1.teletype.in/files/8b/ac/8bac4574-81cd-4ebf-8b4f-498d0817029a.png" width="933" />
  </figure>
  <p id="So3t"><a href="https://platform.arkhamintelligence.com/explorer/address/0x25681Ab599B4E2CEea31F8B498052c53FC2D74db" target="_blank">https://platform.arkhamintelligence.com/explorer/address/0x25681Ab599B4E2CEea31F8B498052c53FC2D74db</a></p>
  <p id="kN0E"><em>Кошельку 10 дней и аркхам никак его не индефицирует, я отнесу его к Binance, т.к. массовое пополнение с бинанса. </em></p>
  <figure id="jDZK" class="m_original">
    <img src="https://img1.teletype.in/files/0c/82/0c8234ac-9a40-44cf-935e-18f4b3406ee3.png" width="908" />
  </figure>
  <p id="9ELN"><em>И прием средств происходит каждую минуту.</em></p>
  <figure id="Tw28" class="m_original">
    <img src="https://img1.teletype.in/files/86/09/8609193c-e5ba-47f9-97b0-4dfe938cab9f.png" width="871" />
  </figure>
  <p id="c9H3"></p>
  <p id="pPNJ"><strong>4) 0x3348984E9285b4A214bF098573918b2D69172517</strong></p>
  <figure id="WvM4" class="m_original">
    <img src="https://img3.teletype.in/files/ac/1e/ac1ef897-1750-49c6-8bff-ef14d901a13b.png" width="1050" />
  </figure>
  <figure id="hxqR" class="m_original">
    <img src="https://img3.teletype.in/files/23/92/2392d52e-f3f9-4e7c-94a3-8e9208648b9d.png" width="949" />
  </figure>
  <figure id="Ci4X" class="m_original">
    <img src="https://img1.teletype.in/files/ce/ed/ceed28a0-ca20-4d59-9e1c-f8cae9036832.png" width="973" />
  </figure>
  <p id="rs5s"><a href="https://platform.arkhamintelligence.com/explorer/address/0x3348984E9285b4A214bF098573918b2D69172517" target="_blank">https://platform.arkhamintelligence.com/explorer/address/0x3348984E9285b4A214bF098573918b2D69172517</a></p>
  <p id="uAa9"><em>Высокий отток, вероятно временный кошелек, но на балансе все еще &gt;500к Zro.</em></p>
  <p id="IzoJ"></p>
  <p id="DCoK"><strong>5) 0x3931dAb967C3E2dbb492FE12460a66d0fe4cC857</strong></p>
  <figure id="qK8i" class="m_original">
    <img src="https://img4.teletype.in/files/34/e4/34e40eb1-992b-42e7-b974-4a8a75a3ba93.png" width="950" />
  </figure>
  <figure id="EdTV" class="m_original">
    <img src="https://img1.teletype.in/files/49/0a/490a3f46-16ac-45d7-83f2-fddfc65a57a9.png" width="946" />
  </figure>
  <p id="TFo3"><a href="https://platform.arkhamintelligence.com/explorer/address/0x3931dAb967C3E2dbb492FE12460a66d0fe4cC857" target="_blank">https://platform.arkhamintelligence.com/explorer/address/0x3931dAb967C3E2dbb492FE12460a66d0fe4cC857</a></p>
  <p id="IcG6"><em>Также как кошелек №3 создан 10 дней назад, пополнение с Binance.</em></p>
  <p id="oW07"></p>
  <p id="QzLv"><strong>6) 0xf3cCBf6537CB1fD3fDB72E3b1909Ab58B29CDAFA</strong></p>
  <figure id="YFc7" class="m_custom">
    <img src="https://img3.teletype.in/files/22/a7/22a7f525-acc8-4546-ab62-7f156a0f5318.png" width="970.0000000000001" />
  </figure>
  <figure id="jIqU" class="m_custom">
    <img src="https://img3.teletype.in/files/ef/fe/effeb1c0-d37b-410b-898c-8f47e4b4e492.png" width="918" />
  </figure>
  <figure id="GMog" class="m_original">
    <img src="https://img4.teletype.in/files/7a/74/7a7489ec-0998-49a6-8889-0046b0f84e95.png" width="917" />
  </figure>
  <p id="O5j6"><a href="https://platform.arkhamintelligence.com/explorer/address/0xf3cCBf6537CB1fD3fDB72E3b1909Ab58B29CDAFA" target="_blank">https://platform.arkhamintelligence.com/explorer/address/0xf3cCBf6537CB1fD3fDB72E3b1909Ab58B29CDAFA</a></p>
  <p id="LXMj"><em>Кошельку 12 дней, связь с Wintermute и Galaxy Digital.</em></p>
  <p id="l2VE"></p>
  <p id="SWc5"><strong>7) 0x4680900FB91164Ee22b9E8f7c66efc79D7C4E1f9</strong></p>
  <figure id="7BOr" class="m_original">
    <img src="https://img4.teletype.in/files/70/23/7023c170-5817-44b1-b2db-8364797c22a0.png" width="980" />
  </figure>
  <figure id="VuAw" class="m_original">
    <img src="https://img4.teletype.in/files/33/17/3317b2c0-4b23-47bd-af41-c4677e618e68.png" width="926" />
  </figure>
  <figure id="UIOO" class="m_original">
    <img src="https://img2.teletype.in/files/56/54/5654e19d-881f-4bf4-92c7-e9f1c90386c9.png" width="922" />
  </figure>
  <p id="7I3S"><a href="https://platform.arkhamintelligence.com/explorer/address/0x4680900FB91164Ee22b9E8f7c66efc79D7C4E1f9" target="_blank">https://platform.arkhamintelligence.com/explorer/address/0x4680900FB91164Ee22b9E8f7c66efc79D7C4E1f9</a></p>
  <p id="APny"><em>Высокий показатель оттока, пока под наблюдением. Источник притока вызывает интерес. </em></p>
  <figure id="wMXb" class="m_custom">
    <img src="https://img2.teletype.in/files/13/78/1378a0d3-5ad3-40e2-b420-9347f9197092.png" width="850" />
  </figure>
  <p id="dmNg">Поступление <strong>$1,71M</strong> (499,999 ZRO) </p>
  <p id="DYtZ"><a href="https://etherscan.io/tx/0x155363a5eae943a44cb44b35508df091f0d1522b398470f825c57cc5d3903667" target="_blank">https://etherscan.io/tx/0x155363a5eae943a44cb44b35508df091f0d1522b398470f825c57cc5d3903667</a></p>
  <p id="EbAU">от <strong>0x0d88d7a4Ca8826A7F8bcAE5650386a6dB8c5ce6e</strong></p>
  <p id="sC67">В свою очередь на этот адрес 0x0d88d7a4Ca8826A7F8bcAE5650386a6dB8c5ce6e был приток в<strong> 1M</strong> <strong>zro</strong> </p>
  <figure id="JJBg" class="m_original">
    <img src="https://img3.teletype.in/files/e1/18/e118911f-72f5-4b76-bacf-bd97b36ecc34.png" width="949" />
  </figure>
  <p id="k6hJ"><strong>Поступление 500К</strong> от 0x3348984E9285b4A214bF098573918b2D69172517 это наш адрес под <a href="#pPNJ">№4</a></p>
  <p id="LgOn"><a href="https://arbiscan.io/tx/0x492c927e2a8b8b574c83859436c3444b6167027361c126dda4fb36257de3800e" target="_blank">https://arbiscan.io/tx/0x492c927e2a8b8b574c83859436c3444b6167027361c126dda4fb36257de3800e</a></p>
  <p id="wzC1"><strong>Поступление 200к</strong> от 0xe89792360C32b3fa9BaACFc577b809000f6D0c24</p>
  <p id="IvWz"><a href="https://platform.arkhamintelligence.com/explorer/tx/0x98e96fbc5f4651015b139c0606f15255d0eadca4277f5ceae88364c7f2c2ed53" target="_blank">https://platform.arkhamintelligence.com/explorer/tx/0x98e96fbc5f4651015b139c0606f15255d0eadca4277f5ceae88364c7f2c2ed53</a></p>
  <figure id="SaEU" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/03/f1/03f1d087-9ec2-49be-8628-9b7f67bd5c4f.png" width="970" />
    <figcaption>приток на адрес 0xe89792360C32b3fa9BaACFc577b809000f6D0c24</figcaption>
  </figure>
  <p id="KRUp"><strong>Поступление 300к</strong> от 0x0Af5fe66F56FAbbde7e9C0fB54898A64B325070C</p>
  <p id="rcYT"><a href="https://etherscan.io/tx/0x3b68886a1e259ce8139eae53839fe0a7a129d3a4126a5dc66b0384198e5e8f43" target="_blank">https://etherscan.io/tx/0x3b68886a1e259ce8139eae53839fe0a7a129d3a4126a5dc66b0384198e5e8f43</a></p>
  <p id="8uqX">Поступление на адрес 0x0Af5fe66F56FAbbde7e9C0fB54898A64B325070C</p>
  <figure id="sKsu" class="m_custom">
    <img src="https://img4.teletype.in/files/38/cb/38cb5b07-5794-4f90-b655-fc7d786553ff.png" width="950" />
  </figure>
  <p id="WXpw">Оба адреса aркхам относит к L0 </p>
  <figure id="u3JS" class="m_custom">
    <img src="https://img3.teletype.in/files/e6/ad/e6adfbfd-15bf-428b-93a9-eabd8035388e.png" width="626" />
  </figure>
  <p id="ENFa"></p>
  <p id="Nf9n"><strong>8) 0x64440d8A6E6F949536646C363A4b734819EeDbfd</strong></p>
  <figure id="iJyh" class="m_custom">
    <img src="https://img2.teletype.in/files/11/cf/11cf48cc-539f-4c72-95a5-2703dfcb1ef3.png" width="672" />
  </figure>
  <figure id="sQpA" class="m_original">
    <img src="https://img3.teletype.in/files/61/e3/61e33535-a17e-4ec5-80f6-363d11f9be48.png" width="926" />
  </figure>
  <p id="JEHV"><a href="https://platform.arkhamintelligence.com/explorer/address/0x64440d8A6E6F949536646C363A4b734819EeDbfd" target="_blank">https://platform.arkhamintelligence.com/explorer/address/0x64440d8A6E6F949536646C363A4b734819EeDbfd</a></p>
  <p id="pIYt"><em>Весь приток c Paribu Deposit</em></p>
  <figure id="a5LX" class="m_original">
    <img src="https://img2.teletype.in/files/db/d1/dbd16fa0-1b76-438a-8213-47ae822c9205.png" width="933" />
  </figure>
  <p id="QC9L"><em>Исходящие транзакции уже на разные биржи и кошельки.</em></p>
  <p id="xqP7"></p>
  <p id="01WP"><strong>9) 0xaa7C42fBC45396d94Ee2fbF7F37c4f05db3E3cE4</strong></p>
  <figure id="ij4K" class="m_custom">
    <img src="https://img1.teletype.in/files/c9/56/c956f1b5-b54d-4859-90e8-fc98cfbdef7b.png" width="1003" />
  </figure>
  <p id="1QAT"><a href="https://platform.arkhamintelligence.com/explorer/address/0xaa7C42fBC45396d94Ee2fbF7F37c4f05db3E3cE4" target="_blank">https://platform.arkhamintelligence.com/explorer/address/0xaa7C42fBC45396d94Ee2fbF7F37c4f05db3E3cE4</a></p>
  <figure id="hfDK" class="m_original">
    <img src="https://img3.teletype.in/files/6a/c7/6ac710ee-aa0b-4b5b-841c-087a9c80e193.png" width="925" />
  </figure>
  <p id="fXLy"><em>Накапливает zro по 40-50к $, остается под наблюдением дальше.</em></p>
  <p id="KG1c"></p>
  <h3 id="LWAu">4. Alerts</h3>
  <p id="xzhJ">Из девяти, отсеялось три кошелька, два Binance и один за связь с Wintermute и Galaxy Digital. </p>
  <figure id="DqJc" class="m_original">
    <img src="https://img4.teletype.in/files/fe/95/fe9551f4-0d42-478a-bff8-ffc8efae0940.png" width="618" />
  </figure>
  <p id="87Fo">За кошельками планирую понаблюдать, иду в оповещения - &gt; создать оповещение.</p>
  <figure id="l9u6" class="m_original">
    <img src="https://img4.teletype.in/files/fd/99/fd99d457-417a-4b4d-857b-9a0acb10e106.png" width="863" />
  </figure>
  <p id="xKaW">Добавляю 6 кошельков, фильтр на объем от 100к$ и добавляю оповещение в телеграм группу.</p>
  <figure id="855Y" class="m_original">
    <img src="https://img4.teletype.in/files/31/5e/315efb0d-7262-49f6-a625-2addf010f984.png" width="1046" />
  </figure>
  <p id="yjbO">Тоже самое делаю с категорией: биржи и маркет мейкеры.</p>
  <figure id="YurG" class="m_original">
    <img src="https://img2.teletype.in/files/1b/16/1b16f0e8-da9a-4419-85af-b6a08bdcd060.png" width="1050" />
  </figure>
  <p id="9vWu">Чтобы не перенасыщать бота уведомлениями, объем транзакции меняю - на 500k zro и выше.</p>
  <p id="Ppub">Дальше создаю Locklist Zro. (70 кошельков LZ из топ 100) Мне интересно насколько эти токены недвижимы. </p>
  <figure id="iqv2" class="m_original">
    <img src="https://img4.teletype.in/files/bc/ce/bcce6478-7173-4b88-baca-0aebe9710304.png" width="1036" />
  </figure>
  <p id="mTB8">Заодно добавил алерт на топ хантеров, уведомление составил из двух списков. </p>
  <p id="YOH6">1) Всеми известная <a href="https://dune.com/cypherpepe/airdrops-and-wallets-v2#matapac" target="_blank">дюна</a> <a href="https://twitter.com/matapac_izi" target="_blank">Matapac</a> и <a href="https://twitter.com/cypher_frog" target="_blank">CypherPepe</a> - в аркхаме <a href="https://platform.arkhamintelligence.com/dashboards/view?dashboardID=ede805b3-26b2-4171-a020-4579885ea0ac" target="_blank">Dashboard</a> по этой дюне от <a href="https://t.me/retrodropsdao" target="_blank">t.me/retrodropsdao </a></p>
  <p id="bcob">2) Список от <a href="https://x.com/lookonchain/status/1800558351660773632?s=12&t=Um4W6MZZLWUHWogGCHasiA" target="_blank">Lookonchain</a></p>
  <figure id="Qe86" class="m_custom">
    <img src="https://img2.teletype.in/files/16/c5/16c5fd7e-10e4-430a-9fba-1e20a7afc0b1.png" width="1113" />
  </figure>
  <p id="pPNQ">И дополню бота алертом на объемы от 800M $ по эфиру и бтс.</p>
  <figure id="fFnm" class="m_custom">
    <img src="https://img2.teletype.in/files/d8/61/d861b029-7f45-403c-bd04-32b1bcf6de4b.png" width="1166" />
  </figure>
  <p id="ugV2"></p>
  <h3 id="rrOu">Вывод: </h3>
  <p id="t8Nq">Аркхам вполне удобный инструмент мониторинга и анализа данных (<a href="https://docs.google.com/spreadsheets/d/1hkuJNYob5sSbuFVSvKKi_pOQTumRSl3LTK6GS3dmHos/edit?usp=sharing" target="_blank">link</a> на таблицу) гибкий в настройках уведомлений и создания дашбордов. Рассмотрели общую картину холдеров, создали телеграм <a href="https://t.me/titdiggity" target="_blank">бота</a> со следующими категориями алертов: 1) <strong>Whitelist ZRO</strong> - состоит из маркет мейкеров, бирж с потоком от 500к zro (Х-кошельков с транзакциями от 100к$ также при обнаружении, будут добавляться новые адреса. 2)<strong> Locklist Zro</strong> (70 кошельков LZ из топ 100) 3) <strong>Grand Hunters</strong> - топ хантеры из двух списков, с объемами &gt; 10к$ 4)<strong> EPIC (ETH &amp; BTC)</strong> - редкие движения тяжеловесных переводов от 800M$. </p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@nodiggity/AjLyPAogLJO</guid><link>https://teletype.in/@nodiggity/AjLyPAogLJO?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nodiggity</link><comments>https://teletype.in/@nodiggity/AjLyPAogLJO?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nodiggity#comments</comments><dc:creator>nodiggity</dc:creator><title>Смарт-контракт с использованием zk-SNARKs</title><pubDate>Sat, 03 Feb 2024 12:46:51 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/34/b6/34b642ef-c677-409d-948f-a6c556a32bc3.png"></media:content><category>Смарт-контракты</category><description><![CDATA[<img src="https://img3.teletype.in/files/6a/28/6a28d5ea-851d-493f-8f04-83df472772c4.jpeg"></img>Например, у нас есть секретная информация, скажем, пароль. Мы хотим доказать другому человеку, что у нас есть этот пароль, но не хотим раскрывать сам пароль. С использованием zk-SNARK, мы сможем сгенерировать доказательство, подтверждающее, что у нас есть знание о пароле, но при этом сам пароль будет оставаться скрытым. Это обеспечит доказуемую аутентификацию без необходимости раскрывать секретную информацию.]]></description><content:encoded><![CDATA[
  <p id="YLPq">Например, у нас есть секретная информация, скажем, пароль. Мы хотим доказать другому человеку, что у нас есть этот пароль, но не хотим раскрывать сам пароль. С использованием <a href="https://ethereum.org/en/zero-knowledge-proofs" target="_blank">zk-SNARKs</a>, мы сможем сгенерировать доказательство, подтверждающее, что у нас есть знание о пароле, но при этом сам пароль будет оставаться скрытым. Это обеспечит доказуемую аутентификацию без необходимости раскрывать секретную информацию.</p>
  <blockquote id="R0gC">Поскольку смарт-контракты могут раскрывать значения, а нам необходимо хранить пароль в секрете. Для этого обратимся к ZoKrates.</blockquote>
  <figure id="aS64" class="m_custom">
    <img src="https://img3.teletype.in/files/6a/28/6a28d5ea-851d-493f-8f04-83df472772c4.jpeg" width="564.4212840809147" />
  </figure>
  <p id="LGOq"><a href="https://zokrates.github.io/introduction.html" target="_blank">ZoKrates</a> - набор инструментов которые упрощает разработку и развертывание программ доказательства с нулевым разглашением, специально разработанных для использования на Ethereum. </p>
  <p id="9LSq"><strong>Варианты использования:</strong></p>
  <ul id="J6v6">
    <li id="zrbh">Плагин в Remix IDE предоставляет создание и верификацию zk-SNARKs. </li>
    <li id="qgKt"><a href="https://play.zokrat.es/" target="_blank">ZoKrates Playground </a>- веб-игровая площадка, где разработчики могут писать и компилировать программы онлайн. Playground включает в себя редактор кода, компилятор и инструменты для создания и проверки доказательств.</li>
    <li id="gyW5">Установить ZoKrates локально с помощью менеджеров пакетов, таких как npm, или загрузив двоичный файл непосредственно из <a href="https://github.com/ZoKrates/ZoKrates/" target="_blank">репозитория ZoKrates GitHub.</a></li>
    <li id="cadf">Контейнер Docker: ZoKrates также предоставляет контейнер Docker, который можно использовать для запуска программ ZoKrates в виртуализированной среде. Эта опция полезна для разработчиков, которые не хотят устанавливать ZoKrates локально и предпочитают использовать стандартизированную среду. <code>docker run -ti zokrates/zokrates /bin/bash</code></li>
  </ul>
  <p id="AMPc"></p>
  <p id="0NAs"><strong>Технические особенности:</strong></p>
  <ul id="38Kj">
    <li id="f1c9">ZoKrates — использует программы на предметно-ориентированном языке (<a href="https://zokrates.github.io/language/variables.html" target="_blank">DSL</a>) высокого уровня.</li>
    <li id="2b50">ZoKrates DSL похож на язык программирования C (Си) включает переменные, циклы и условные операторы.</li>
    <li id="7203">Использует <a href="https://github.com/Zokrates/libsnark" target="_blank">libsnark</a>, библиотеку C++ zkSNARKs, для генерации доказательств и ключей проверки.</li>
    <li id="b297">Поддерживает криптографию на основе <a href="https://electriccoin.co/blog/snark-explain7/" target="_blank">эллиптических кривых</a>, модульную арифметику, хеш-функции и другие криптографические операции.</li>
    <li id="29c9">Использует систему доказательств <a href="https://xn--2-umb.com/22/groth16/" target="_blank">Groth16</a> для быстрого и эффективного создания и проверки ZKP.</li>
    <li id="00e0">Имеет лицензию MIT и представляет собой проект с открытым исходным кодом.</li>
  </ul>
  <blockquote id="O1qa" data-align="right"><a href="https://github.com/Zokrates/ZoKrates/blob/0.8.8/CHANGELOG.md" target="_blank">Журнал</a> изменений ZoKrates</blockquote>
  <p id="pLo7"></p>
  <p id="1zoH">Рассмотрим пример, где у нас есть секретное значение <code>x</code> а у нашего товарища Жака такое хэш-значение: <code>y = H(x)</code></p>
  <p id="mW68">При  использовании 256-битного хэш, практически нет шансов, что мы когда-либо узнаем значение <code>x</code>, зная только значение <code>y</code>. Таким образом, <code>x</code> может быть паролем.  Итак, посмотрим, сможем ли мы доказать <code>x</code>, зная<code> H(x)</code> и запустить смарт-контракт. </p>
  <p id="BSNL"></p>
  <p id="VbyD"><strong>1) В ZoKrates Playground  напишем следующий код:</strong></p>
  <pre id="e0Jh" data-lang="javascript">import &quot;hashes/sha256/512bitPacked&quot; as sha256packed;

def main(private field a, private field b, private field c, private field d) -&gt; field[2] {
    field[2] h = sha256packed([a, b, c, d]);
    return h;
}</pre>
  <blockquote id="FS0g">Первая строка импортирует <code>sha256packed</code>функцию из стандартной библиотеки ZoKrates.<code>sha256packed</code>— это реализация SHA256, оптимизированная для использования в ZoKrates DSL. Вот как это работает: мы хотим передать 512 бит входных данных в SHA256. Однако<code>field</code>значение может содержать только 254 бита из-за размера основного поля, которое мы используем. Как следствие, мы используем четыре элемента поля, каждый из которых кодирует 128 бит, для представления наших входных данных. Затем четыре элемента объединяются в ZoKrates и передаются в SHA256. Учитывая, что длина полученного хеша составляет 256 бит,  то он делится на две части и возвращает каждое значение как 128-битное число.</blockquote>
  <p id="wYbJ"></p>
  <figure id="K8Qr" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/f6/1f/f61f9cc9-9e5c-48e8-87b9-b29d6771c8e2.png" width="528" />
    <figcaption><a href="https://zokrates.github.io/examples/sha256example.html" target="_blank">Вычисление хеша</a> с помощью ZoKrates.</figcaption>
  </figure>
  <p id="FuaG">Переходим во вкладку Execute и нажимаем Run</p>
  <figure id="YKWz" class="m_original">
    <img src="https://img3.teletype.in/files/e8/9e/e89e414b-90f3-48c0-9a6d-91679eb5e0ff.png" width="326" />
  </figure>
  <blockquote id="Ihtk"><code>[ &quot;71860681579908444993719277659355514616&quot;, &quot;203894998809118867442052767119280883826&quot; ]</code></blockquote>
  <p id="rKO0"></p>
  <p id="IPPb"><strong>2) Создадим доказательство с нулевым разглашением.</strong></p>
  <p id="WRgh">2.1) В Remix IDE cоздадим фаил <code>main.zok</code> и напишем следующий код:</p>
  <pre id="I9fs" data-lang="javascript">import &quot;hashes/sha256/512bitPacked&quot; as sha256packed;

def main(private field a, private field b, private field c, private field d) {
    field[2] h = sha256packed([a, b, c, d]);
    assert(h[0] == 71860681579908444993719277659355514616);
    assert(h[1] == 203894998809118867442052767119280883826);
    return;
}</pre>
  <blockquote id="btB4">Код использует библиотеку sha256packed для вычисления хеша SHA-256 от четырех приватных полей a, b, c и d. Затем программа проверяет, что вычисленный хеш совпадает с ожидаемыми значениями, и возвращает ошибку, если это не так. В данном случае программа проверяет, что вычисленный хеш (полученный ранее в п.1) равен 71860681579908444993719277659355514616 для h0 и 203894998809118867442052767119280883826 для h1. Если это условие выполняется, то программа завершается успешно, иначе возникает ошибка.</blockquote>
  <p id="2f6C"></p>
  <figure id="4eK3" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/33/f0/33f0f6f1-426a-413a-9296-0a16beafa62f.png" width="463" />
    <figcaption>main.zok</figcaption>
  </figure>
  <p id="biCj">2.2) Добавим плагин ZoKrates в Remix IDE</p>
  <figure id="Nbzg" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/be/31/be31ab16-3323-43b1-a3b1-bb5b7f14d1bf.png" width="156" />
    <figcaption>Менеджер плагинов</figcaption>
  </figure>
  <p id="13Lw"></p>
  <figure id="cj7E" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/80/fa/80fa4b7f-096c-45d5-8ed9-6740c28b3eba.png" width="369" />
    <figcaption>Активация ZoKrates</figcaption>
  </figure>
  <p id="0fp5"></p>
  <figure id="F1KE" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/51/24/5124918e-e441-451a-98c4-cf2ffeaf9d44.png" width="165" />
    <figcaption>ZoKrates</figcaption>
  </figure>
  <p id="HGeo">2.3) <strong>Компиляция:</strong> на левой боковой панели кнопка компиляции. Если ошибки нет, можем двигаться дальше.</p>
  <figure id="0wXP" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/77/c0/77c07daf-dd49-465e-93f0-118c34b2bc13.png" width="372" />
    <figcaption>Компиляция кода</figcaption>
  </figure>
  <p id="LTAD"></p>
  <figure id="eQ0V" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/1e/31/1e31599c-289d-4d90-b39a-5380861a2593.png" width="328" />
    <figcaption>Скомпилировано успешно</figcaption>
  </figure>
  <p id="OhUy"></p>
  <p id="KDwF">2.4) <strong>Вычисление свидетеля </strong>для которого предоставлены действительные частные значения (наш пароль) Уже на этой стадии пароль изменить не сможем т.к. хеш к этому паролю скомпилирован. </p>
  <blockquote id="BpNH">Свидетель – представляет собой набор данных, который подтверждает истинность скрытой информации, не раскрывая конфиденциальности. Необходим для доказательства, что держатель этой информации обладает знанием о ней, но не раскрывает саму информацию. </blockquote>
  <p id="IZpK"></p>
  <figure id="PDAF" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/d0/f2/d0f2b000-115f-43a8-af72-38de3ba11130.png" width="288" />
    <figcaption>Вычислено успешно</figcaption>
  </figure>
  <p id="cyuj">К примеру удаляем одну цифру - Execution failed</p>
  <figure id="PjHi" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/06/f6/06f6d7d4-8bd9-4050-82a0-5071e7ab978e.png" width="298" />
    <figcaption>Выполнение не удалось</figcaption>
  </figure>
  <p id="FgA7"></p>
  <p id="DiGO">2.5) <strong>Run</strong> <strong>Setup (cоздать доказательство).</strong> Используем свидетель для создания доказательства, которое демонстрирует достоверность вычислений без раскрытия частных входных данных. После вычисления мы можем сгенерировать проверочный и подтверждающий ключ. Это может занять больше минуты, но выполняется только один раз. Эти ключи получены из источника случайности, обычно называемого «токсичными отходами». Мы увидим, что создался файл с именем <code>verification_key.json,</code> который содержит все эти данные.</p>
  <p id="QkV1"></p>
  <figure id="bRBS" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ec/0d/ec0d44be-84d2-481a-8dbc-a32e4be1bfa6.png" width="274" />
    <figcaption>Запустить установку</figcaption>
  </figure>
  <p id="tqId"></p>
  <figure id="rOLR" class="m_custom" data-caption-align="center">
    <img src="https://img4.teletype.in/files/39/81/3981776c-45b7-4790-9052-ff3806363ecb.png" width="674.9065743944636" />
    <figcaption>Изменение ключа проверки</figcaption>
  </figure>
  <p id="yy5X"></p>
  <figure id="5PJh" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/4b/9a/4b9a245d-c0fc-4067-9b37-ed172abd4967.png" width="935" />
    <figcaption>verification_key.json</figcaption>
  </figure>
  <p id="U9h6"></p>
  <p id="7hI4">2.6) <strong>Generate Proof</strong> - имея ключи верификатора, а также свидетель, мы теперь можем сгенерировать наше доказательство:</p>
  <p id="0yRU"></p>
  <figure id="JZWn" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/d7/a1/d7a1985d-96db-403e-89f8-afab7e50a5da.png" width="265" />
    <figcaption>Создать доказательство</figcaption>
  </figure>
  <p id="SIbW"></p>
  <p id="viL0">Теперь у нас есть проверяющее доказательство <code>(proof.js)</code></p>
  <p id="wDic"></p>
  <figure id="nLLI" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/a9/d7/a9d704da-6366-472d-8ae2-ed946d884ade.png" width="616" />
    <figcaption>Доказательство (proof.js)</figcaption>
  </figure>
  <p id="nGUD"></p>
  <pre id="f8tJ" data-lang="javascript">{
  &quot;scheme&quot;: &quot;g16&quot;,
  &quot;curve&quot;: &quot;bn128&quot;,
  &quot;proof&quot;: {
    &quot;a&quot;: [
      &quot;0x0ac917308a7b8db29288c028109c8617f910f6b6843c975a736374ddbc276797&quot;,
      &quot;0x1960e7c91c4bb774e6308c418615d566280679a5b7c18b45f89ab64098187bdf&quot;
    ],
    &quot;b&quot;: [
      [
        &quot;0x2df5af53473f2343c58091e657898f92b5b7f0b88a6ea7514c9952a47e07f444&quot;,
        &quot;0x0121a9c22c2abafb7dee637ef4f743a4d62798835350d042d55c708d2481fe3d&quot;
      ],
      [
        &quot;0x1e46763eeacc9f85215740e3d3f7eaddc2fca5c8115c282be1e60157740bcec8&quot;,
        &quot;0x23d8a13843a39d8f37b8a0ef6da31281b7ee2c61d16079a48f2620b9f6ef9aa0&quot;
      ]
    ],
    &quot;c&quot;: [
      &quot;0x2f990abf7f96daee712f3ca282e7e304370ac70d633b6156a41b91f140e6cb41&quot;,
      &quot;0x0e619f6d20fc6c39fa3fa0320c795e57218824f1f11ee90b0d7edf3a306de8fd&quot;
    ]
  },
  &quot;inputs&quot;: []
}</pre>
  <p id="6aLE"></p>
  <figure id="k6yg" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e7/b1/e7b17a34-6ae3-4ac8-b543-3220fd25e6c1.png" width="326" />
    <figcaption>Копируем доказательство</figcaption>
  </figure>
  <blockquote id="pCmE">[[&quot;0x0ac917308a7b8db29288c028109c8617f910f6b6843c975a736374ddbc276797&quot;,&quot;0x1960e7c91c4bb774e6308c418615d566280679a5b7c18b45f89ab64098187bdf&quot;],[[&quot;0x2df5af53473f2343c58091e657898f92b5b7f0b88a6ea7514c9952a47e07f444&quot;,&quot;0x0121a9c22c2abafb7dee637ef4f743a4d62798835350d042d55c708d2481fe3d&quot;],[&quot;0x1e46763eeacc9f85215740e3d3f7eaddc2fca5c8115c282be1e60157740bcec8&quot;,&quot;0x23d8a13843a39d8f37b8a0ef6da31281b7ee2c61d16079a48f2620b9f6ef9aa0&quot;]],[&quot;0x2f990abf7f96daee712f3ca282e7e304370ac70d633b6156a41b91f140e6cb41&quot;,&quot;0x0e619f6d20fc6c39fa3fa0320c795e57218824f1f11ee90b0d7edf3a306de8fd&quot;]]</blockquote>
  <p id="3TP9" data-align="center"><em>Наше доказательство</em></p>
  <p id="53Et"></p>
  <p id="Y2Gw">2.7) <strong>Export Verifier</strong> - генерирует контракт Solidity, который включает ключ проверки. Этот контракт предоставляет общедоступную функцию для проверки решений скомпилированной программы. Это обеспечивает независимую проверку правильности и повышает прозрачность в системах с нулевым разглашением данных.</p>
  <p id="gRFK"></p>
  <figure id="bK6p" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/2b/9e/2b9eebb8-92b5-46bf-9632-b243a2ab92db.png" width="295" />
    <figcaption>Экспорт верификатора</figcaption>
  </figure>
  <figure id="AXty" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/09/49/0949f22c-69ef-4b71-af39-590a96b8da10.png" width="273" />
    <figcaption>Верификатор экспортирован </figcaption>
  </figure>
  <figure id="20ec" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c6/d2/c6d278db-8475-4b48-8abe-1b6cc7e91686.png" width="440" />
    <figcaption>Файл verifier.sol</figcaption>
  </figure>
  <p id="h0zG"></p>
  <p id="I2Ck"><strong>3) Проверка доказательства с нулевым разглашением.</strong></p>
  <p id="wiAp">3.1) Компилируем <code>verifier.sol</code> После развертывания контракт верификатора можно использовать для проверки решений скомпилированной программы.</p>
  <figure id="IU2M" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/25/9c/259c2b7c-0b35-45e2-9949-56388e724aab.png" width="534" />
    <figcaption>Solidity компилятор</figcaption>
  </figure>
  <p id="KDXG"></p>
  <figure id="do9y" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b6/36/b63606f7-1e29-4c2e-91b8-5336ba2f3adb.png" width="444" />
    <figcaption>Компиляция файла verifier.sol</figcaption>
  </figure>
  <p id="iMxb"></p>
  <p id="MxbR"> 3.2) Развертывание смарт-контракта <code>verifier.sol</code></p>
  <figure id="zFd3" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/5d/5c/5d5c017e-edcc-4a48-923e-23f445ae560c.png" width="402" />
    <figcaption>Deploy verifier.sol</figcaption>
  </figure>
  <p id="Q2se"></p>
  <figure id="RHk8" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/77/68/776885d5-083b-4b1d-8d52-100e9234bed2.png" width="293" />
    <figcaption>Контракт Verifier</figcaption>
  </figure>
  <p id="czdY"></p>
  <blockquote id="QuZ6">[[&quot;0x0ac917308a7b8db29288c028109c8617f910f6b6843c975a736374ddbc276797&quot;,&quot;0x1960e7c91c4bb774e6308c418615d566280679a5b7c18b45f89ab64098187bdf&quot;],[[&quot;0x2df5af53473f2343c58091e657898f92b5b7f0b88a6ea7514c9952a47e07f444&quot;,&quot;0x0121a9c22c2abafb7dee637ef4f743a4d62798835350d042d55c708d2481fe3d&quot;],[&quot;0x1e46763eeacc9f85215740e3d3f7eaddc2fca5c8115c282be1e60157740bcec8&quot;,&quot;0x23d8a13843a39d8f37b8a0ef6da31281b7ee2c61d16079a48f2620b9f6ef9aa0&quot;]],[&quot;0x2f990abf7f96daee712f3ca282e7e304370ac70d633b6156a41b91f140e6cb41&quot;,&quot;0x0e619f6d20fc6c39fa3fa0320c795e57218824f1f11ee90b0d7edf3a306de8fd&quot;]]</blockquote>
  <p id="cUp9" data-align="center"><em>Наше доказательство</em></p>
  <blockquote id="5dA8">ZoKrates может генерировать большие ключи подтверждений и проверки, особенно для более сложных вычислений. Размер доказательств, может потенциально достигать нескольких мегабайт.</blockquote>
  <p id="BFDM"></p>
  <p id="XFnb">3.3) Вставляем доказательство в поле, а затем протестируем: должно быть написано<code> «0»: «bool: r true». </code>Это означает, что транзакция успешно подтверждена. </p>
  <figure id="gLvp" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/cb/40/cb400429-b29a-4803-9cd1-9cd2bb18ad2e.png" width="289" />
    <figcaption>Доказательство истинно</figcaption>
  </figure>
  <p id="YW8m"></p>
  <p id="llhL">Но если мы воспользуемся неверным доказательством, мы получим ложный результат: <code>errored: Error occured: invalid opcode.</code></p>
  <p id="VbxT"></p>
  <p id="zqaV"><strong>4) Развернем смарт-контракт в тестовой сети и проверим наше доказательство. </strong></p>
  <figure id="qeng" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/3d/a4/3da49fc5-73d2-4fb6-bac6-9adbb6b5f5a2.png" width="293" />
  </figure>
  <figure id="moLF" class="m_original">
    <img src="https://img1.teletype.in/files/c9/e2/c9e2ae07-149c-48db-8645-84a618d8d6ad.png" width="344" />
  </figure>
  <p id="7haN">4.1) Создан новый смарт-контракт в сети Sepolia:</p>
  <figure id="BOn6" class="m_original">
    <img src="https://img1.teletype.in/files/cf/5d/cf5d172a-bd24-4ce4-9fde-9ea86691f696.png" width="575" />
  </figure>
  <p id="sceq"><a href="https://sepolia.etherscan.io/tx/0x0a555af118bc0961984947432ee28e20ff33e8f8525cf0b9fc31080a45c61566" target="_blank">https://sepolia.etherscan.io/tx/0x0a555af118bc0961984947432ee28e20ff33e8f8525cf0b9fc31080a45c61566</a></p>
  <p id="17G1"></p>
  <p id="SmNB">4.2) Переходим в контракт:</p>
  <figure id="F4DI" class="m_original">
    <img src="https://img4.teletype.in/files/f3/e3/f3e35328-6dc8-4430-97f1-883c8aa8d130.png" width="777" />
  </figure>
  <p id="l5oy"></p>
  <figure id="qupe" class="m_original">
    <img src="https://img2.teletype.in/files/dc/ba/dcbad057-5417-4bd8-87e0-7b9dde6ef30b.png" width="559" />
  </figure>
  <p id="Uzx6">4.3) Контракт необходимо верифицировать.</p>
  <figure id="9qV3" class="m_original">
    <img src="https://img1.teletype.in/files/40/79/407982a9-371d-4904-bfe0-65dd25494359.png" width="740" />
  </figure>
  <p id="YIkN">4.3.1) Заполняем поля:</p>
  <figure id="aAKM" class="m_original">
    <img src="https://img1.teletype.in/files/81/bb/81bb6b39-be82-42ee-8cea-f553a1a18fd9.png" width="816" />
  </figure>
  <p id="e1Yw">4.3.2) В новом окне необходимо вставить код нашего контракта <code>verifier.sol</code></p>
  <figure id="6XJ3" class="m_original">
    <img src="https://img3.teletype.in/files/a3/f4/a3f4bdbc-74a0-42fa-8032-bf70067cefed.png" width="859" />
  </figure>
  <p id="vo2k"></p>
  <figure id="h0V9" class="m_original">
    <img src="https://img1.teletype.in/files/05/19/0519dd97-352d-418c-bfb5-6b306b62da3a.png" width="587" />
  </figure>
  <p id="XAM1">4.3.3) Подтверждаем верификацию. </p>
  <figure id="ArB9" class="m_original">
    <img src="https://img4.teletype.in/files/33/a2/33a20e59-0e82-42ad-b041-c27587962000.png" width="561" />
  </figure>
  <p id="rsms">4.3.4) Верификация пройдена.</p>
  <figure id="Hdru" class="m_original">
    <img src="https://img3.teletype.in/files/ea/18/ea1891b5-d45f-47b6-b723-4d04886d5df7.png" width="1010" />
  </figure>
  <p id="WAMq">4.4) Переходим в <code>Read Contract</code></p>
  <figure id="brVf" class="m_original">
    <img src="https://img3.teletype.in/files/2e/ce/2ece3b56-2b11-4ac3-a088-4c4ec6ba8924.png" width="595" />
  </figure>
  <p id="Ah3N">4.5) В строку <code>proof (tuple)</code> вставляем наше доказательство. </p>
  <figure id="LuN9" class="m_original">
    <img src="https://img4.teletype.in/files/fc/c1/fcc1ffdc-75bf-4948-85f7-47abf4b389c9.png" width="430" />
  </figure>
  <blockquote id="8RWI">[[&quot;0x0ac917308a7b8db29288c028109c8617f910f6b6843c975a736374ddbc276797&quot;,&quot;0x1960e7c91c4bb774e6308c418615d566280679a5b7c18b45f89ab64098187bdf&quot;],[[&quot;0x2df5af53473f2343c58091e657898f92b5b7f0b88a6ea7514c9952a47e07f444&quot;,&quot;0x0121a9c22c2abafb7dee637ef4f743a4d62798835350d042d55c708d2481fe3d&quot;],[&quot;0x1e46763eeacc9f85215740e3d3f7eaddc2fca5c8115c282be1e60157740bcec8&quot;,&quot;0x23d8a13843a39d8f37b8a0ef6da31281b7ee2c61d16079a48f2620b9f6ef9aa0&quot;]],[&quot;0x2f990abf7f96daee712f3ca282e7e304370ac70d633b6156a41b91f140e6cb41&quot;,&quot;0x0e619f6d20fc6c39fa3fa0320c795e57218824f1f11ee90b0d7edf3a306de8fd&quot;]]</blockquote>
  <p id="a9fO" data-align="center"><em>Доказательство</em></p>
  <p id="ReGe"></p>
  <figure id="ZNXU" class="m_original">
    <img src="https://img1.teletype.in/files/cd/d6/cdd66740-8ffd-4a2c-8270-fbdf64c67099.png" width="478" />
  </figure>
  <p id="vOc9" data-align="center"><em>Доказательство истинно</em></p>
  <p id="k9FP"><a href="https://sepolia.etherscan.io/address/0xe38f6eebf205303e417525bf52638290ffee7d08#readContract" target="_blank">https://sepolia.etherscan.io/address/0xe38f6eebf205303e417525bf52638290ffee7d08#readContract</a></p>
  <p id="iamK"></p>
  <p id="LIzg"><strong>Вывод:  </strong></p>
  <p id="wMHL">При помощи инструментов ZoKrates сгенерировали доказательство zk-SNARKs и подтвердили истинность нашего значения <code>х</code> которое было сохранено в хеш и разделено на две части. Как видим смарт-контракты с нулевым разглашением (ZK) предполагают внедрение системы, которая позволяет сторонам доказывать подлинность определенной информации, не раскрывая деталей этой информации.</p>
  <p id="F0Y4">Этот подход обеспечивает хорошую защиту от кражи персональных данных, похитители не могут украсть то, чего не видят, что значительно затрудняет реализацию мошеннических действий.</p>
  <p id="Xml7">ZoKrates делает создание zk-SNARKs доступным, предоставляя простой язык для написания функций. Также существует обширный <a href="https://github.com/Zokrates/ZoKrates/tree/develop/zokrates_cli/examples" target="_blank">набор примеров</a>, демонстрирующий все возможности языка. Потенциал использования: в системах идентификации, сохраняя конфиденциальность, в различных голосованиях, финансах, оракулах, приложениях DeFi и т.д.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@nodiggity/l2H2En0fEh0</guid><link>https://teletype.in/@nodiggity/l2H2En0fEh0?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nodiggity</link><comments>https://teletype.in/@nodiggity/l2H2En0fEh0?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nodiggity#comments</comments><dc:creator>nodiggity</dc:creator><title>Ethernaut - основы игры.</title><pubDate>Wed, 17 Jan 2024 16:24:34 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/89/03/89039717-71ea-4631-ad7a-56b3353a7788.png"></media:content><category>Ethernaut</category><description><![CDATA[<img src="https://img1.teletype.in/files/03/68/03681812-bb66-4c62-b001-97e922943c26.jpeg"></img>Ethernaut – это СTF решение OpenZeppelin,  каждый уровень является смарт-контрактом, который необходимо «взломать». Исходный код игры полностью открытый, а все уровни созданы другими игроками.]]></description><content:encoded><![CDATA[
  <p id="jOWv"><a href="https://ethernaut.openzeppelin.com/" target="_blank">Ethernaut</a> – это СTF решение OpenZeppelin,  каждый уровень является смарт-контрактом, который необходимо «взломать». Исходный код игры полностью открытый, а все уровни созданы другими игроками.</p>
  <blockquote id="caDL">CTF (Capture The Flags/War games) — это проблемы безопасности, в которых представлен уязвимый код и вам необходимо написать смарт-контракт для использования этой уязвимости.</blockquote>
  <figure id="VuDe" class="m_custom">
    <img src="https://img1.teletype.in/files/03/68/03681812-bb66-4c62-b001-97e922943c26.jpeg" width="571.717528373266" />
  </figure>
  <p id="F8f1">Проблема Ethernaut в том что некоторые уязвимости применимы только к старым версиям Solidity и в реальной жизни мы их уже не увидим. Тем не менее это хороший инструмент для отработки навыков. </p>
  <p id="xyW0">Игра изначально создавалась для использования в тестовой сети Ethereum, но на январь 2024 г. запланировано прекращение поддержки cети Goerli. Для подписания транзакций буду использовать <a href="https://chainlist.org/?testnets=true&search=Mumbai" target="_blank">Polygon Mumbai.</a></p>
  <h3 id="aoVF">Задача 0. Hello Ethernaut</h3>
  <p id="jhOI">Методы контракта уровня 0 интегрированы в консоль нашего браузера, что позволят нам инициировать вызовы методов.</p>
  <p id="w2Hn">1) Добавим в метамаск тестовую сеть <a href="https://chainlist.org/?testnets=true&search=Mumbai" target="_blank">Polygon Mumbai</a></p>
  <p id="vENH">2) В <a href="https://mumbaifaucet.com/" target="_blank">кране</a> запрашиваем Matic</p>
  <p id="3M3i">3) Переходим на <a href="https://ethernaut.openzeppelin.com/" target="_blank">сайт</a> игры, подключаем кошелек.</p>
  <blockquote id="RQkN">Можем сразу поменять язык.</blockquote>
  <figure id="nZrz" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/05/24/0524e00c-b661-4d70-b233-4788d440c7dc.png" width="603" />
    <figcaption>Панель выбора языка</figcaption>
  </figure>
  <p id="pY1d"></p>
  <p id="tU1J">4) Выбираем задачу </p>
  <figure id="ewPn" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/3b/7c/3b7c1c28-8bae-48e4-973b-3e850dec8dcc.png" width="835" />
    <figcaption>Панель выбора задачи</figcaption>
  </figure>
  <p id="reac"></p>
  <p id="d1Jt">5) Откроем консоль разработчика Chrome. (<code>Правая кнопка мыши - Просмотреть код - Вкладка Console</code>)</p>
  <figure id="GrXd" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ec/e3/ece340aa-b0b3-480e-91e1-2ca760750321.png" width="386" />
    <figcaption>Вызов консоли</figcaption>
  </figure>
  <p id="2omB"></p>
  <figure id="548N" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/f0/3e/f03e3238-e138-4238-b706-3a1c4769f690.png" width="602" />
    <figcaption>Приветствие Ethernaut</figcaption>
  </figure>
  <p id="fWhA">6) Из нашей консоли мы вызовем команду: <code>player</code></p>
  <figure id="tn9I" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/9d/a4/9da45187-2d1f-4086-b68a-7f187eaca244.png" width="428" />
    <figcaption>Консоль выводит адрес моего кошелька</figcaption>
  </figure>
  <p id="D5at"></p>
  <pre id="wPTw">также инструкция с командами доступна в окне нашей задачи. </pre>
  <figure id="0pzb" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/79/19/7919dc9b-295e-426c-ae70-87c6481a4e62.png" width="643" />
    <figcaption>Окно с инструкцией к текущей задаче</figcaption>
  </figure>
  <p id="G42Z"></p>
  <p id="kGyZ">7) Чтобы проверить свой баланс вызовем команду: <code>await getBalance(player)</code></p>
  <figure id="Ez54" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/46/95/46957d0d-8c31-4fce-8f76-fb9abfd46e77.png" width="438" />
    <figcaption>Текущий баланс кошелька</figcaption>
  </figure>
  <p id="xvWB"></p>
  <p id="rwKJ">8) Команда <code>help() покажет список вспомогательных функций:</code></p>
  <figure id="xqFE" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/bc/d2/bcd25e78-da4f-4915-87f9-70f91561727c.png" width="439" />
    <figcaption>Вспомогательные функции</figcaption>
  </figure>
  <p id="FkLl">9) Команда <code>await ethernaut.owner()</code> выведет адрес владельца контракта ethernaut:</p>
  <figure id="ApEQ" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/f1/0a/f10ad01f-22a8-4812-b2ac-75c8ab6d6cd5.png" width="410" />
    <figcaption>owner</figcaption>
  </figure>
  <p id="VfOQ">10)  Для прохождения уровня необходимо запросить <strong>инстанс уровня.</strong> (экземпляр) Чтобы запросить инстанс нажмем на соответствующую кнопку внизу страницы и подтвердим транзакцию в метамаске. После этого в консоли должно появиться несколько новых сообщений.</p>
  <blockquote id="dHjj">Примечание: создание инстанса займет некоторое время</blockquote>
  <figure id="qeLf" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/08/39/08392894-e74d-4ee3-9984-a285cb2484cc.png" width="424" />
    <figcaption>Запрс инстанса</figcaption>
  </figure>
  <p id="Xy9B"></p>
  <figure id="SQmp" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/eb/6d/eb6df422-e1ae-4264-a6a1-68ab785586c8.png" width="465" />
    <figcaption>Адрес инстанса</figcaption>
  </figure>
  <p id="9STo"> </p>
  <p id="KRiX">11) Теперь чтобы завершить уровень необходимо взаимодействовать с контрактом, следующими командами: </p>
  <figure id="u6RW" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/36/1c/361c59d5-8abb-430e-9f42-f6a6bdb80a4c.png" width="692" />
    <figcaption>Взаимодействие с контрактом</figcaption>
  </figure>
  <p id="G9cK"></p>
  <p id="jFpC">12) Вызовем метод <code>await contract.info()</code></p>
  <figure id="E2vG" class="m_original">
    <img src="https://img3.teletype.in/files/ee/7b/ee7baf67-476a-423c-8f62-ab3d2f032117.png" width="337" />
  </figure>
  <pre id="K8zi">Ответ: «Вы найдете то, что вам нужно, в info1()»</pre>
  <p id="LB4I"></p>
  <p id="6tlU">13) Вызовем метод <code>await contract.info1()</code></p>
  <figure id="r4CY" class="m_original">
    <img src="https://img3.teletype.in/files/e3/93/e3934331-2ac4-4277-964c-e60441310a20.png" width="373" />
  </figure>
  <pre id="Cz9C">Ответ: Попробуйте info2(), но с «hello» в качестве параметра.</pre>
  <p id="WWop"></p>
  <p id="TdTz">14) Вызовем метод <code>await contract.info2(&quot;hell&quot;)</code></p>
  <figure id="MhQA" class="m_original">
    <img src="https://img2.teletype.in/files/90/3d/903d6ab6-a841-44ff-bef8-931bdc658a62.png" width="509" />
  </figure>
  <pre id="pri9">Ответ: «Свойство infoNum содержит номер следующего информационного метода, 
который будет вызван».</pre>
  <p id="x5ka"></p>
  <p id="X6ZU">15) Вызовем метод <code>await contract.infoNum()</code></p>
  <figure id="z6eP" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/41/d9/41d9648e-568e-45d3-95a4-58e97d88d4e3.png" width="446" />
    <figcaption>Номер 42 - номер следующего информационного метода</figcaption>
  </figure>
  <p id="1FTe"></p>
  <p id="0KrG">16) Вызовем метод <code>await contract.info42()</code></p>
  <figure id="FFDK" class="m_original">
    <img src="https://img2.teletype.in/files/5e/c0/5ec01ec8-67fe-4078-a58e-662faa1c8bce.png" width="360" />
  </figure>
  <pre id="3Pjs">Получаем ответ: &#x27;theMethodName — это имя следующего метода.&#x27;</pre>
  <p id="NvNC"></p>
  <p id="4dET">17) Вызовем метод <code>await contract.theMethodName()</code></p>
  <figure id="lCep" class="m_original">
    <img src="https://img1.teletype.in/files/44/56/4456f61f-1494-4fbd-a13c-678aff8fc0f9.png" width="292" />
  </figure>
  <pre id="H6wD">Наш ответ: &#x27;Имя метода — method7123949.&#x27;</pre>
  <p id="Y2Qs"></p>
  <p id="pPbA">18) Вызовем <code>await contract.method7123949()</code></p>
  <figure id="u7Wv" class="m_original">
    <img src="https://img4.teletype.in/files/be/45/be4574ce-c32d-4f92-b526-445e6bdf4bb1.png" width="432" />
  </figure>
  <pre id="143W">Ответ: &#x27;Если вы знаете пароль, отправьте его в функцию authenticate().&#x27;</pre>
  <p id="aS7j"></p>
  <p id="M806">19) Вызовем функцию пароля <code>await contract.password()</code></p>
  <figure id="Y0Lo" class="m_original">
    <img src="https://img3.teletype.in/files/e9/2e/e92e42a8-b4ab-4255-b220-eb10dfcca3e5.png" width="263" />
  </figure>
  <pre id="X85i">Наш пароль: &#x27;ethernaut0&#x27;</pre>
  <p id="p6KI"></p>
  <p id="hBxA">20) Передадим пароль в функцию <code>authenticate()</code> и подпишем транзакцию.</p>
  <figure id="kQq9" class="m_original">
    <img src="https://img3.teletype.in/files/ed/5d/ed5dc2b7-dfae-4911-978b-67353511de55.png" width="553" />
  </figure>
  <p id="OT1f">21) Транзакция прошла успешно.</p>
  <figure id="2iB0" class="m_original">
    <img src="https://img2.teletype.in/files/1c/3b/1c3b8996-ee59-45ba-8d54-41dd983dac0f.png" width="440" />
  </figure>
  <p id="F1d7">Также можем посмотреть txid в сети: <a href="https://mumbai.polygonscan.com/tx/0xc6eccc73e46da5b472d1410efc73d1ee40f169019251537f735f67510caeeed3" target="_blank">https://mumbai.polygonscan.com/tx/0xc6eccc73e46da5b472d1410efc73d1ee40f169019251537f735f67510caeeed3</a></p>
  <figure id="XcN3" class="m_original">
    <img src="https://img3.teletype.in/files/a1/13/a113eaf0-8923-4cc4-a973-8093547620a3.png" width="433" />
  </figure>
  <p id="cEsp">22) Проверка: вызовем метод <code>await contract.getCleared()</code></p>
  <figure id="jXwd" class="m_original">
    <img src="https://img3.teletype.in/files/23/d2/23d228f1-993f-486f-9dbf-12f0e5262fea.png" width="280" />
  </figure>
  <pre id="LqQi">Ответ: true</pre>
  <p id="pSqS"></p>
  <p id="9HEZ">23) Отправим инстанс на проверку и подпишем транзакцию.</p>
  <figure id="jfFH" class="m_original">
    <img src="https://img2.teletype.in/files/90/ba/90babe92-2567-4901-9d61-65d61b2b9a16.png" width="743" />
  </figure>
  <p id="UAz6">24) Ответ: Отлично, Уровень пройден!</p>
  <figure id="ds8p" class="m_original">
    <img src="https://img2.teletype.in/files/1d/f0/1df0e44b-4653-46ed-a0d5-2d8649e0b15f.png" width="453" />
  </figure>
  <blockquote id="uZhg">Также мы получим контракт с которым работали и его можно задеплоить в ремиксе.</blockquote>
  <figure id="E9Ue" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b5/6e/b56ec471-3435-4647-92fc-e21499ee7a4c.png" width="316" />
    <figcaption>Контракт: Hello Ethernaut</figcaption>
  </figure>
  <p id="I2ut"></p>
  <p id="E1pq"><strong>Бонусная часть:</strong>  В консоле вызовем <code>await contract</code> и увидим все методы которые возможно вызвать в данном контракте.</p>
  <figure id="lbO2" class="m_original">
    <img src="https://img3.teletype.in/files/21/2e/212e2311-5717-483f-b60f-48ea9fe6d21f.png" width="528" />
  </figure>
  <p id="W3tJ">Нам интересна вкладка <a href="https://docs.soliditylang.org/en/latest/abi-spec.html" target="_blank">ABI</a> (Application Binary Interface) - используется для кодирования данных, которые передаются между смарт-контрактом и внешним приложением. ABI представлены в формате <code>JSON</code> и обычно генерируются компилятором при развертывании смарт-контракта, cюда входят имена, типы функций и событий <em>(В Contract ABI возможно обнаружить функции которые скрыты во вкладке Write Contract)</em> В контексте нашей задачи мы можем сразу посмотреть все доступные функции и решить уровень за два шага.</p>
  <figure id="W08f" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/6c/22/6c223ef8-5893-434f-89e3-2688c4eae9e8.png" width="466" />
    <figcaption>ABI</figcaption>
  </figure>
  <p id="leYg"></p>
  <h2 id="Xuco"><strong>Вывод: </strong></h2>
  <p id="Vmf9">Рассмотрели методы контракта уровня 0, добавили в метамаск тестовую сеть Polygon Mumbai, ознакомились с консолью браузера, прошлись по необходимым командам, успешно завершили уровень. Получили данные c contract ABI.</p>
  <p id="DONs">Поэтапное прохождение игры может стать хорошей отправной точкой для новичка по обнаружению уязвимостей в смарт-контрактах и понимания функций языка. </p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@nodiggity/81T5YzNnViQ</guid><link>https://teletype.in/@nodiggity/81T5YzNnViQ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nodiggity</link><comments>https://teletype.in/@nodiggity/81T5YzNnViQ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nodiggity#comments</comments><dc:creator>nodiggity</dc:creator><title>Смарт-контракт «Калькулятор»</title><pubDate>Thu, 04 Jan 2024 18:53:44 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/52/86/52862fa0-8d82-469a-9e46-7b4d01d3f904.png"></media:content><category>Смарт-контракты</category><description><![CDATA[<img src="https://img2.teletype.in/files/9b/7b/9b7b16f1-6baf-48a4-b233-1ef225075393.jpeg"></img>1. Создадим контракт под названием Calculator
2. Создадим переменную result для хранения изначального результата.
3. Создадим функции сложения, вычитания, умножения, деления, возведение в степень, извлечения квадратного корня и округление чисел. 
4. Создадим функцию получить результат вычислений.]]></description><content:encoded><![CDATA[
  <p id="89oe">1. Создадим контракт под названием <code>Calculator</code><br />2. Создадим переменную <code>result</code> для хранения исходного значения калькулятора.<br />3. Создадим функции сложения, вычитания, умножения, деления, возведение в степень, извлечения квадратного корня и округление чисел. <br />4. Создадим функцию получить результат вычислений.</p>
  <figure id="fWDa" class="m_custom">
    <img src="https://img2.teletype.in/files/9b/7b/9b7b16f1-6baf-48a4-b233-1ef225075393.jpeg" width="554" />
  </figure>
  <blockquote id="p4sv">Для создания логики контракта мы будем использовать Solidity - Операторы.</blockquote>
  <h2 id="oGKj">Что такое Solidity - операторы?</h2>
  <p id="Nwbm">Возьмем простое выражение <strong>3 + 5 равно</strong> 8. Здесь 3 и 5 называются <strong>операндами</strong> а &#x27;+&#x27; называется <strong>оператором</strong>. Solidity поддерживает следующие типы операторов:</p>
  <ul id="XGej">
    <li id="y9ZE"><a href="#izRw">Арифметические операторы</a></li>
    <li id="62x7"><a href="#cY4E">Операторы сравнения</a> </li>
    <li id="JtXC"><a href="#gEMl">Логические операторы</a></li>
    <li id="2PYC"><a href="#r4gs">Побитовые операторы</a></li>
    <li id="WYPr"><a href="#kuqH">Операторы присваивания</a></li>
    <li id="anis"><a href="#UW2O">Условные (или тернарные)</a></li>
  </ul>
  <p id="1Ood"></p>
  <h2 id="izRw">Арифметические операторы</h2>
  <p id="bWGI">Арифметические операторы — это своего рода математические помощники в программировании, которые позволяют выполнять такие операции, как сложение, вычитание, умножение, деление и т.д.</p>
  <blockquote id="n5R4">Предположим, что переменная A содержит 10, а переменная B содержит 20, тогда -</blockquote>
  <figure id="G9Uq" class="m_original">
    <img src="https://img1.teletype.in/files/8f/19/8f19164a-e01d-4c68-8ed1-02b9a66863e7.png" width="510" />
  </figure>
  <figure id="dK1p" class="m_custom">
    <img src="https://img4.teletype.in/files/33/5a/335a8369-43d1-4999-a482-2efecb53caf5.png" width="520.8471074380166" />
  </figure>
  <figure id="C3Pt" class="m_custom">
    <img src="https://img1.teletype.in/files/c0/9f/c09f7dd0-157e-4d5b-8615-a5ebccbd179f.png" width="522" />
  </figure>
  <blockquote id="0GZy" data-align="right">Solidity - журнал изменений (<a href="https://github.com/ethereum/solidity/blob/develop/Changelog.md" target="_blank">Link</a>)</blockquote>
  <h3 id="eSbZ"><strong>В следующем коде показано, как использовать арифметические операторы:</strong></h3>
  <pre id="YIh9" data-lang="javascript">// SPDX-License-Identifier: MIT
pragma solidity &gt;=0.8.23;

contract Addition {
   constructor() public{
   }
   function getResult() public view returns(uint){
      uint a = 1; 
      uint b = 2;
      uint result = a + b; //арифметическая операция addition
      return result; 
   }
}</pre>
  <figure id="vE85" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/87/7f/877f1851-0ba2-4e24-afa4-90e848dc9767.png" width="276" />
    <figcaption>Вывод: 3</figcaption>
  </figure>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="n4Id">Ключевые моменты:</p>
    <ul id="iuZa">
      <li id="9A1M"><strong>Целочисленное деление:</strong> Деление Solidity возвращает только частное, отбрасывая остаток. Поддержка дробных чисел или чисел с точкой в Solidity все еще плохо реализована. Для деления с плавающей запятой нужно будет использовать внешние библиотеки или дополнительные приемы.</li>
      <li id="qeic"><strong>Переполнение/недополнение.</strong> Необходимо помнить о возможных Overflow/Underflow при работе с большими числами или вычислениями. Подробней об этой уязвимости в смарт-контракте и как ее обойти <a href="https://coffee-web.ru/blog/solving-the-integer-overflow-underflow-vulnerability-in-smart-contracts/" target="_blank">здесь.</a></li>
      <li id="5b1B"><strong>При преобразовании</strong> целочисленного типа большего размера в меньший - биты справа сохраняются, а биты слева теряются. </li>
      <li id="xk7B"><strong>При преобразовании</strong> типов байтов происходит обратное. Когда больший тип байта преобразуется в меньший тип, первые байты сохраняются, а последние теряются. При преобразовании меньшего байта в больший справа добавляются нулевые байты.</li>
    </ul>
    <ul id="V9sa">
      <li id="5ezX"><strong>Приоритет:</strong> Лучше использовать порядок операций PEMDAS чем BODMAS. (основное различие между ними заключается в приоритете (умножение или деление) и приоритете (сложение или вычитание)</li>
    </ul>
  </section>
  <p id="Gb44"><strong>PEMDAS</strong>  - аббревиатура, используемые для запоминания порядка математических операций.</p>
  <p id="8b52">PEMDAS расшифровывается как:</p>
  <p id="2FP2">- P: Parentheses (скобки)</p>
  <p id="znBH">- E: Exponents (степени)</p>
  <p id="QWz5">- M: Multiplication (умножение)</p>
  <p id="yBT9">- D: Division (деление)</p>
  <p id="2pqF">- A: Addition (сложение)</p>
  <p id="wnc3">- S: Subtraction (вычитание)</p>
  <p id="HxOk">Это специальный порядок операций, который используется при выполнении математических выражений, чтобы определить, какие операции выполнять первыми.</p>
  <blockquote id="haPS">Порядок старшинства операторов (<a href="https://docs.soliditylang.org/en/latest/types.html#order-of-precedence-of-operators" target="_blank">Link</a>)</blockquote>
  <h2 id="cY4E">Операторы сравнения</h2>
  <p id="boy0">Операторы сравнения в Solidity действуют как детективы, ищущие истину, оценивая отношения между значениями и возвращая логические результаты (истина или ложь). Они необходимы для создания условной логики и обеспечения целостности контракта.</p>
  <blockquote id="wXr7">Предположим, что переменная A содержит 10, а переменная B содержит 20, тогда -</blockquote>
  <figure id="uBNJ" class="m_original">
    <img src="https://img3.teletype.in/files/a6/94/a69415cb-1f4a-4bc8-8e1b-8b8d6fbe4103.png" width="691" />
  </figure>
  <figure id="mW3C" class="m_original">
    <img src="https://img1.teletype.in/files/0f/24/0f246e3e-e040-42e1-a68f-322fd15315ad.png" width="677" />
  </figure>
  <p id="2Q2r">В приведенном ниже контракте <em><code>RelationalOperator</code></em> демонстрируется вышеупомянутые различные типы реляционных операторов (сравнения)</p>
  <pre id="lR8b" data-lang="javascript">// SPDX-License-Identifier: MIT
pragma solidity &gt;=0.8.23;

contract RelationalOperator {

    // Объявление переменных
    uint16 public a = 20;
    uint16 public b = 10;
    
    // Инициализация переменной 
    // с логическим значением равенства a и b 
    bool public eq = a == b;
    
    // Инициализация переменной
    // с логическим значением неравенства a и b 
    bool public noteq = a != b;
    
    // Инициализация переменной 
    // с логическим значением a больше b
    bool public gtr = a &gt; b;
    
    // Инициализация переменной
    // с логическим значением a меньше b
    bool public les = a &lt; b;
    
    // Инициализация переменной
    // с логическим значением a больше или равно b
    bool public gtreq = a &gt;= b;
    
    // Инициализация переменной
    // с логическим значением a меньше или равно b
    bool public leseq = a &lt;= b;
    
}</pre>
  <figure id="9dGh" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/73/ed/73ed0f5d-be86-46f0-86c5-ff2c225a71ef.png" width="187" />
    <figcaption>Значения типов операторов сравнения</figcaption>
  </figure>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="xdZn">Ключевые моменты:</p>
    <ul id="H4Ah">
      <li id="aFdK"><strong>Совместимость типов данных:</strong>  Сравниваемые значения относятся к совместимым типам данных. Сравнение несовместимых типов может привести к неожиданным результатам.</li>
      <li id="TtGD"><strong>Строгое равенство:</strong>  Solidity использует строгие проверки равенства значений. Например, <code>0</code> не считается равным <code>false</code>.</li>
      <li id="dZM5"><strong>Сравнение адресов:</strong>  Используйте  <code>==</code> оператор для прямого сравнения адресов.<br /></li>
    </ul>
  </section>
  <p id="MceR"></p>
  <h2 id="gEMl">Логические операторы</h2>
  <p id="ToEW">Логические операторы в Solidity — мастера принятия сложных решений, позволяющие создавать сложную условную логику в смарт-контрактах. Они действуют как логические часовые, оценивая условия и определяя, какие пути кода выполнять. Используются для объединения двух или более условий.</p>
  <blockquote id="RN3u">Предположим, что переменная A содержит 10, а переменная B содержит 20, тогда -</blockquote>
  <figure id="11LP" class="m_original">
    <img src="https://img1.teletype.in/files/01/45/014507d1-446e-471b-8aa3-0876579fdacf.png" width="594" />
  </figure>
  <p id="dFpu">В приведенном ниже примере контракт<em> <code>logicalOperator</code></em> демонстрирует вышеупомянутые различные типы логических операторов.</p>
  <pre id="RlvZ" data-lang="javascript">  // SPDX-License-Identifier: MIT
pragma solidity &gt;=0.8.23;
  
  contract logicalOperator{
  
  // Определение функции для демонстрации 
  // Логический оператор
  function Logic(
  bool a, bool b) public view returns(
  bool, bool, bool){
    
  // Логический оператор И
  bool and = a&amp;&amp;b;
    
  // Логический оператор ИЛИ
  bool or = a||b;
    
  // Логический оператор НЕ
  bool not = !a;
  return (and, or, not);
  }
}
</pre>
  <figure id="VFcj" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ac/d5/acd57e40-b88e-45f4-b044-f6847868d43b.png" width="378" />
    <figcaption>Случай 1: Когда a - истинно,  b - истинно</figcaption>
  </figure>
  <figure id="j40S" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/7d/d6/7dd66e0b-db9b-4ee9-872a-ed802c19f47a.png" width="377" />
    <figcaption>Случай 2: Когда a - ложно,  b - истинно</figcaption>
  </figure>
  <figure id="249F" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/81/3a/813a4321-b8f4-43df-a6b8-b7e671a62159.png" width="340" />
    <figcaption>Случай 3: Когда a - нулевое (ложь),  b - ненулевое (истина)</figcaption>
  </figure>
  <figure id="voOH" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/3a/b8/3ab829a1-95f7-4f3c-a4e0-71a78c5d1e1d.png" width="377" />
    <figcaption>Случай 4: Когда a - ложно,  b - ложно</figcaption>
  </figure>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="prPR">Ключевые моменты:</p>
    <ul id="Bdl7">
      <li id="zulA"><strong>Типы операндов:</strong> Логические операторы в основном работают с логическими значениями (<code>true</code> или<code>false</code>). Однако Solidity может неявно преобразовывать <code>ненулевые числа </code>в <code>true</code> и <code>0</code> в <code>false</code> в определенных контекстах.</li>
      <li id="bkYE"><strong>Упрощенная оценка:</strong> Solidity использует short-circuit для операторов <code>И</code> и <code>ИЛИ</code>. Это означает, что он оценивает второй операнд только в случае необходимости для определения окончательного результата.</li>
      <li id="KMPp"><strong>Приоритет:</strong> Логические операторы имеют более низкий приоритет, чем операторы сравнения. Используйте круглые скобки, чтобы уточнить порядок вычислений при объединении разных операторов.</li>
    </ul>
  </section>
  <h2 id="wVk5"></h2>
  <h2 id="r4gs">Побитовые операторы</h2>
  <p id="bvJ9"></p>
  <p id="WSIW">Побитовые операторы в Solidity предлагают детальный способ управления отдельными битами двоичных данных, позволяя выполнять точные операции и оптимизацию в смарт-контрактах. </p>
  <blockquote id="FvO5">Предположим, что переменная A содержит 2, а переменная B содержит 3, тогда -</blockquote>
  <p id="SHw5"></p>
  <figure id="lcis" class="m_original">
    <img src="https://img3.teletype.in/files/20/f9/20f9c048-4201-4b03-9023-5f81fc777f64.png" width="653" />
  </figure>
  <figure id="xtaf" class="m_custom">
    <img src="https://img2.teletype.in/files/18/76/18761301-ef28-4423-b220-56ef27b4091d.png" width="653.8205980066446" />
  </figure>
  <figure id="ucyi" class="m_original">
    <img src="https://img4.teletype.in/files/37/53/3753d5dc-e52e-4ab0-a6f4-756d0a91c47e.png" width="649" />
  </figure>
  <p id="1ecO">В приведенном ниже примере контракт<em> <code>Bitwise</code></em> демонстрирует вышеупомянутые различные типы побитовых операторов.</p>
  <pre id="JKdF" data-lang="javascript">// SPDX-License-Identifier: MIT
pragma solidity &gt;=0.8.23;

contract Bitwise {

  // Объявление переменных
  uint16 public a = 20;
  uint16 public b = 10;
  
  // Объявление переменных
  // to &#x27;&amp;&#x27; value
  uint16 public and = a &amp; b;
  
  // Объявление переменных 
  // to &#x27;|&#x27; value
  uint16 public or = a | b;
  
  // Объявление переменных
  // to &#x27;^&#x27; value
  uint16 public xor = a ^ b;
  
  // Объявление переменных
  // to &#x27;&lt;&lt;&#x27; value
  uint16 public leftshift = a &lt;&lt; b;
  
  // Объявление переменных 
  // to &#x27;&gt;&gt;&#x27; value
  uint16 public rightshift = a &gt;&gt; b;
  
  // Объявление переменных
  // to &#x27;~&#x27; value
  uint16 public not = ~a;
  
}</pre>
  <figure id="GPOV" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/7a/69/7a695257-5770-4e04-aa16-d800fb2a72b5.png" width="241" />
    <figcaption>Типы побитовых операторов</figcaption>
  </figure>
  <p id="dNrb"></p>
  <h2 id="kuqH">Операторы присваивания</h2>
  <p id="izIa"></p>
  <p id="EVYw">Эти операторы предназначены для присвоения значения переменной. Операнд слева является <code>переменной</code>, а операнд справа — <code>значением.</code></p>
  <blockquote id="7pja">Поддерживает следующие операторы присваивания -</blockquote>
  <figure id="efEL" class="m_original">
    <img src="https://img2.teletype.in/files/59/e1/59e174c6-a192-46f1-b0c0-90f346314e9d.png" width="536" />
  </figure>
  <figure id="Ifsl" class="m_custom">
    <img src="https://img4.teletype.in/files/77/f8/77f85dcc-94b6-4fcb-8f89-045c6c81fed2.png" width="545.0637119113574" />
  </figure>
  <blockquote id="sIix">Примечание: Та же логика применяется к побитовым операторам, поэтому они будут выглядеть как &lt;&lt; =, &gt;&gt; =, &gt;&gt; =, &amp; =, | = , ^ =.</blockquote>
  <p id="gLD7"></p>
  <p id="SQFa">В приведенном ниже контракте <em><code>AssignmentOperator</code></em> демонстрируется вышеупомянутые различные типы операторов присваивания.</p>
  <pre id="i5g7" data-lang="javascript">// SPDX-License-Identifier: MIT
pragma solidity &gt;=0.8.23;
contract AssignmentOperator {    
    
    // Объявление переменных
    uint16 public assignment = 20;
    uint public assignment_add = 50;
    uint public assign_sub = 50;
    uint public assign_mul = 10;
    uint public assign_div = 50;
    uint public assign_mod = 32;
  
    // Определение функции для
    // демонстраии операторов присвоения
    function getResult() public{
        assignment_add += 10;
        assign_sub -= 20;
        assign_mul *= 10;
        assign_div /= 10;
        assign_mod %= 20;
        return;
    }
}</pre>
  <figure id="fGGC" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/45/01/450184b1-1ac7-4ad9-9367-52f5676ad607.png" width="295" />
    <figcaption>Значения до вызова функции</figcaption>
  </figure>
  <figure id="ldH7" class="m_custom" data-caption-align="center">
    <img src="https://img2.teletype.in/files/5a/b8/5ab86a59-cd4c-4d6c-aa5c-6012606a155a.png" width="193" />
    <figcaption>Значения после вызова функиции</figcaption>
  </figure>
  <p id="rmTB"></p>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="heFm">Ключевые моменты:</p>
    <ul id="Uv33">
      <li id="fKLS"><strong>Порядок оценки:</strong> Сначала вычисляется выражение справа, затем результат присваивается переменной слева.</li>
      <li id="T0eN"><strong>Возвращаемое значение:</strong>  Операторы присваивания не возвращают значение, поэтому их нельзя использовать непосредственно в выражениях.</li>
      <li id="R1L3"><strong>Совместимость типов данных:</strong>  Убедитесь, что назначаемое значение совместимо с типом данных переменной, чтобы избежать ошибок.</li>
    </ul>
  </section>
  <h2 id="rAWA"></h2>
  <h2 id="UW2O">Условные (или тернарные) операторы</h2>
  <p id="FS0l"></p>
  <p id="3iAu">Тернарный оператор  — это оператор, который принимает три операнда. Тернарные операторы пригодятся, если нужно написать простой оператор if-else в одну строку.</p>
  <blockquote id="ZJQF">*Конструкция <code>if-else</code> способна проверить одно или же несколько условий и в случае если условие не будет верным, то выполнить другой код или проверить другое условие.</blockquote>
  <p id="2Vpr"></p>
  <figure id="6lSF" class="m_original">
    <img src="https://img3.teletype.in/files/68/c1/68c186be-ff9a-4092-a666-1fb251f997fd.png" width="694" />
  </figure>
  <p id="jahG">В приведенном ниже примере контракт<em> <strong><code>Conditional</code></strong></em>демонстрирует условный оператор.</p>
  <pre id="7i1m" data-lang="javascript">// SPDX-License-Identifier: MIT
pragma solidity &gt;=0.8.23;
 
// Creating a contract
contract Conditional{
 
     // Определение функции для демонстрации
     // условного оператора
     function subtract(
       uint a, uint b) public view returns(
       uint){
      uint result = (a &gt; b? a-b : b-a);
      return result;
 }
}</pre>
  <figure id="xzTp" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e0/f9/e0f90ef5-6b2b-4a7d-be9d-40063367e947.png" width="331" />
    <figcaption>Разность чисел a и b</figcaption>
  </figure>
  <blockquote id="KLMi">Функция subtract принимает два аргумента типа uint и возвращает их разность. Она использует условный оператор для определения модуля разности чисел a и b. Если a больше b, то возвращается разность a - b, иначе возвращается разность b - a.</blockquote>
  <p id="BcSq"></p>
  <p id="9aEu"><strong>Пример: тройная цепочка операторов</strong></p>
  <blockquote id="OEbJ">(условие 1) ? оператор 1: ((условие 2) ? оператор 2: оператор 3);</blockquote>
  <pre id="nf8n" data-lang="javascript">  // SPDX-License-Identifier: MIT
pragma solidity &gt;=0.8.23;

// Контракт на демонстрацию оператора Solidity
// На данный момент этот контракт просто показывает, как
// реализовать тройную цепочку операторов
contract TripleChain {
  constructor() {}
  
  function getResult() public pure returns (string memory) {
    
    // Этот код возвращает строку
    // если a &gt; b, мы возвращаем «a больше»
    // иначе, если a == b, мы возвращаем «a и b равны»
    // иначе b &gt; a мы возвращаем «b больше»
    uint256 a = 200;
    uint256 b = 400;
  
    return (a &gt; b ? &quot;a is bigger&quot; : ((a==b) ? 
        &quot;a and b are equal&quot; : &quot;b is bigger&quot; ));
  }
}</pre>
  <figure id="a39H" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/a4/ea/a4ea7993-b58a-427b-94e7-70b92da39bfb.png" width="290" />
    <figcaption>Случай когда: b больше</figcaption>
  </figure>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="tytk"><strong>условие 1</strong> — a&gt;b, <strong>условие 2</strong> — a==b.</p>
    <p id="qEwL"><strong>утверждение 1</strong> — «а больше»,   <strong>утверждение 2 </strong>— «а и b равны», </p>
    <p id="Tykl"><strong>утверждение 3</strong> — «b больше».</p>
  </section>
  <blockquote id="U6lo">После того когда ознакомились со всеми ключевыми операторами, приступим к смарт-контракту <em><code>Calculator</code> </em></blockquote>
  <h2 id="fMXK"></h2>
  <h2 id="YDZB">Калькулятор</h2>
  <p id="sFGL"></p>
  <p id="5uNm">В приведенном ниже примере контракт<em> <code>Calculator</code> </em>демонстрирует:</p>
  <blockquote id="8jvO">Сложение, вычитание, умножение, деление, возведение в степень, извлечения квадратного корня, округления числа до десятков, сотен, тысяч и т.д.</blockquote>
  <p id="bLKt"></p>
  <pre id="fw1K" data-lang="javascript">// SPDX-License-Identifier: MIT
pragma solidity &gt;=0.8.23;

contract Calculator {
// Исходное значение калькулятора равно нулю.
    uint256 result = 0; 
// Функция add позволяет прибавить к результату указанное число.
    function add(uint256 num) public { 
        result += num; 
    }
// Функция subtract позволяет вычесть из результата указанное число.
     function subtract(uint256 num) public {
        result -= num; 
    }
// Функция multiply позволяет умножить текущий 
// результат на указанное число.
     function multiply(uint256 num) public {
        result *= num; 
    }
// На выходе контракта возвращается значение 
// текущего результата или значение вычислений.
    function getResult() public view returns (uint256) {
        return result;
    }
// Функция divide позволяет разделить текущий результат
// на указанное число, с проверкой на ноль.
    function divide(uint256 num) public {
    require(num != 0, &quot;Cannot divide by zero&quot;);
    result /= num; 
    }
// Функция exponential позволяет возвести число 
// в указанную степень.
    function exponential(uint256 base, uint256 exponent) public {
    result = uint256(1);
        for(uint256 i = 0; i &lt; exponent; i++){
        result *= base;
        }
    }
// Функция squareRoot позволяет получить квадратный корень из числа,
// возвращая только частное, отбрасывая остаток.
    function squareRoot(uint256 num) public view returns (uint256) {
    uint256 x = num;
    uint256 y = (x + 1) / 2;
    while (y &lt; x) {
        x = y;
        y = (x + num / x) / 2;
    }
    return x;
    }
// Функция round позволяет округлить число 
// до десятков, сотен, тысяч и т.д.
    function round(uint256 num, uint256 decimalPlaces) public pure returns (uint256) {
        uint256 precision = 10**decimalPlaces;
        return (num + precision / 2) / precision * precision;
    }
}</pre>
  <p id="svqP"><strong>Функция сложения</strong> &quot;<code>add</code>&quot; принимает один параметр типа <code>uint256</code> под названием <code>num</code>. Имеет модификатор <code>public</code>, что означает, что она доступна для вызова извне контракта.</p>
  <p id="jbix">В теле функции используется оператор <code>+=</code>, который является сокращенной формой записи для операции сложения с присваиванием. В данном случае, <code>result += num</code> означает, что значение переменной <code>result</code> увеличивается на значение, переданное в аргументах функции <code>(num)</code>. Это эквивалентно записи <code>result = result + num;</code></p>
  <p id="2nw7">Таким образом, функция <code>add</code> позволяет увеличить текущее значение <code>result</code> на значение, переданное в качестве аргумента.</p>
  <blockquote id="iAR1">Логика функций вычитания и умножения аналогична функции сложения. (Меняются только операторы присваивания)</blockquote>
  <p id="EXiV"><strong>Функция деления</strong> &quot;<code>divide</code>&quot; начинается с проверки с использованием функции <code>require</code>, чтобы убедиться, что аргумент <code>num</code> не равен нулю, иначе функция <code>divide</code>прервет свое выполнение, выдав ошибку &quot;<code>Cannot divide by zero</code>&quot;.</p>
  <p id="8zsa">Далее в теле функции используется оператор <code>/=</code>, который является сокращенной формой записи для операции деления с присваиванием. <code>result /= num</code> означает, что значение переменной <code>result</code> делится на значение, переданное в аргументах функции (<code>num</code>) и результат присваивается обратно переменной <code>result</code>. Это эквивалентно записи <code>result = result / num.</code></p>
  <p id="eCyf">Таким образом, функция &quot;<code>divide</code>&quot; позволяет разделить текущее значение <code>result</code> на значение, переданное в качестве аргумента, при условии, что значение аргумента не равно нулю.</p>
  <p id="nCjH"><strong>Функция возведения в степень</strong> принимает два аргумента: <code>base</code> (основание) и <code>exponent </code>(показатель степени) и используется для вычисления степени числа. Функция выполняет умножение <code>base </code>на само себя <code>exponent </code>раз и сохраняет результат в переменную <code>result.</code> Таким образом, функция возводит число <code>base</code> в степень <code>exponent.</code></p>
  <p id="FTfp"><strong>Функция квадратного корня</strong> выполняет вычисление из числа <code>num</code> с использованием метода Ньютона:</p>
  <p id="HgQX">Переменная <code>x</code> инициализируется значением числа<code>num</code>. Затем переменная <code>y</code> вычисляется как<code>(x+1) / 2.</code></p>
  <p id="P6ZU">Затем в цикле <code>while</code> проверяется условие <code>y &lt; x.</code> Внутри цикла <code>x</code> присваивается значение <code>y</code>, а затем <code>y</code> вычисляется как среднее арифметическое между <code>x</code> и <code>num / x.</code> Это повторяется до тех пор, пока значение <code>y</code> не станет больше или равно <code>x.</code></p>
  <p id="vceR">После выполнения цикла функция возвращает значение <code>x,</code> которое и будет приближенным значением квадратного корня из числа <code>num,</code> полученным методом Ньютона.</p>
  <p id="FGE4"><strong>Функция округления</strong> принимает два параметра:<code>num</code>число, которое нужно округлить) и <code>decimalPlaces</code>(число = количество нулей, на сколько нужно округлить, округление до десятков, до сотен, до тысяч и т.д.)</p>
  <p id="fbfr">Внутри функции создается переменная <code>precision</code>, которая равна <code>10</code> в степени <code>decimalPlaces</code>. Это используется для определения точности округления.</p>
  <p id="ItkT">Затем функция возвращает результат округления числа <code>num</code> до заданной цифры разряда. Для этого к числу <code>num</code> добавляется <code>precision / 2</code>, затем результат делится на <code>precision</code> и умножается на <code>precision</code>, чтобы получить округленное число. Это позволяет округлить число до нужной точности.</p>
  <p id="RRcT"></p>
  <figure id="wEdQ" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/25/57/25570989-55ce-4b20-8b75-feb35f5be5ec.png" width="279" />
    <figcaption>Исходное значение калькулятора равно 0</figcaption>
  </figure>
  <figure id="rDRL" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/f3/fc/f3fc6841-cec4-4335-a5a3-4d769cea8a18.png" width="279" />
    <figcaption>Использование функции сложения (add 10)</figcaption>
  </figure>
  <figure id="xeYE" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ac/ff/acffee4b-fb40-4677-bc50-bcc3ec052698.png" width="281" />
    <figcaption>Использование функции деления на 5</figcaption>
  </figure>
  <figure id="96Df" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b9/21/b921d7e6-5807-4ad1-88cf-cd7f65f4fbd9.png" width="287" />
    <figcaption>Возведение 3 в 4 степень. getResult: 81</figcaption>
  </figure>
  <figure id="D0MS" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/2d/10/2d106b22-3a55-4ca0-899c-30f84a35d845.png" width="283" />
    <figcaption>Функция умножения на 10 </figcaption>
  </figure>
  <figure id="pC2Q" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/83/28/83289907-87a3-4ae5-8c1b-1a450aa01411.png" width="280" />
    <figcaption>Вычитание: 810-2=808</figcaption>
  </figure>
  <figure id="Frvy" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c6/c0/c6c0e178-e055-410d-873e-f940b258ee82.png" width="290" />
    <figcaption>Округление до сотен</figcaption>
  </figure>
  <figure id="saMw" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/4d/92/4d927748-ca4c-46a1-9bdf-5352c7a05e00.png" width="290" />
    <figcaption>Округление до тысяч</figcaption>
  </figure>
  <figure id="EMVn" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/7e/17/7e176df0-4c31-4717-a683-6a1e89c1ed60.png" width="287" />
    <figcaption>Вычисление квадратного корня из числа 1089</figcaption>
  </figure>
  <h2 id="cVmf">Вывод:</h2>
  <p id="lOAe">Рассмотрели операторы Solidity. Они превращают простые данные в разумные решения и в логическое управление, где каждый тип оператора необходим под свои задачи. </p>
  <p id="J3gv">Используются для изменения состояния контракта (например, изменения значения переменной <code>result</code>), а также для возвращения значений, выполнение проверок (например, проверка деления на ноль в функции <code>divide</code>) и выполнения вычислений в циклах (как в функции <code>exponential</code>).</p>
  <p id="y9Ny">Этот пример показывает, что операторы Solidity играют центральную роль в разработке функциональных и безопасных смарт-контрактов.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@nodiggity/0DwiHIAksXx</guid><link>https://teletype.in/@nodiggity/0DwiHIAksXx?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nodiggity</link><comments>https://teletype.in/@nodiggity/0DwiHIAksXx?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nodiggity#comments</comments><dc:creator>nodiggity</dc:creator><title>Смарт-контракт для airdrop events.</title><pubDate>Tue, 19 Dec 2023 10:11:48 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/a8/e6/a8e6481a-490f-439f-b143-d470818d3df9.png"></media:content><category>Смарт-контракты</category><description><![CDATA[<img src="https://img4.teletype.in/files/f1/02/f102092f-4f1b-4169-a0b8-664e9a6b375b.jpeg"></img>Скажем некое сообщество X планирует сделать раздачу eth для своих подписчиков. Чтобы каждый из них в течении месяца после определенных дат смог забрать свой дроп равный сумме, которую владелец паблика внесет на депозит (смарт-контракта) xBank, поделенное на количество участников события.]]></description><content:encoded><![CDATA[
  <p id="gI4z">Скажем некое сообщество X планирует сделать раздачу eth для своих подписчиков. Чтобы каждый из них в течении месяца после определенных дат смог забрать свой дроп равный сумме, которую владелец паблика внесет на депозит (смарт-контракта) <code>xBank</code>, поделенное на количество участников события.</p>
  <figure id="dVGm" class="m_custom">
    <img src="https://img4.teletype.in/files/b0/d8/b0d84654-3347-474e-bc5c-301084a3b39e.jpeg" width="614" />
  </figure>
  <pre id="vehb" data-lang="javascript">// SPDX-License-Identifier: MIT  
pragma solidity &gt;=0.8.17;</pre>
  <pre id="yyeN" data-lang="javascript">contract AirdropEvent {
    uint8 public totalEligible; /* всего eligible участников (переменная 
    uint8 говорит о том, что возможно до 255 человек*/
    uint256 public xBank; /* внесенная общая сумма средств (владельцем), доступная 
    для распределения (может отличаться от текущего баланса контракта)*/
    address public owner; // адрес владельца контракта (владельца сообщества тг)</pre>
  <blockquote id="UP8k">Cтруктура для хранения данных о каждом участнике, включая их username в telegram, дату и время разблокировки eth и информацию о том, получили ли они уже средства.</blockquote>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="TQ4Q" data-lang="javascript">    struct EligibleMember {
        string userNameTelegram;
        uint256 unlocking;
        bool alreadyGotMoney;
        bool exist;
    }</pre>
  </section>
  <pre id="vjQM" data-lang="javascript">    address[] public arrEligibleMembers; /* массив для хранения адресов участников, 
    имеющих право на получение токенов.*/
    mapping(address =&gt; EligibleMember) public eligibleMembers; 
    /* использует для хранения информации об участниках, 
    имеющих право на получение токенов, на основе их адреса кошелька.*/</pre>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="qE4i">    constructor(){
        owner = msg.sender;
        totalEligible = 0;
    }</pre>
  </section>
  <pre id="qrei" data-lang="javascript">    function addEligibleMember( /* функция используется владельцем контракта 
    для добавления участников, имеющих право на получение дропа.*/
        address walletAddress, // адрес кошелька участника
        string memory userNameTelegram, // username в телеграме
        uint256 unlocking // дата и время разблокировки в Unix Timestamp https://www.unixtimestamp.com/
    ) public onlyOwner {
        require(unlocking &gt; 0, &quot;The unlock date has not arrived&quot;);
        require( /* проверка что дата разблокировки больше нуля 
        и что пользователя еще нет в списке участников. 
        Если обе проверки пройдены успешно, участник добавляется в 
        список и общее количество увеличивается*/
            eligibleMembers[walletAddress].exist == false,
            &quot;Error! There is such a user&quot;
        );
        eligibleMembers[walletAddress] = (
            EligibleMember(userNameTelegram, unlocking, false, true)
        );
        arrEligibleMembers.push(walletAddress);
        totalEligible++;
        emit NewEligibleMember(walletAddress, userNameTelegram, unlocking);
    } /*генерируется событие &quot;NewEligibleMember&quot;о добавлении нового участника. 
    Модификатор &quot;onlyOwner&quot; гарантирует, что только владелец контракта 
    может вызвать эту функцию. */</pre>
  <blockquote id="6IPP">Функция для чтения определенного диапазона участников из массива.</blockquote>
  <pre id="ESaE" data-lang="javascript">
       function readEligibleMembersArray(uint cursor, uint length) public view returns (address[] memory) { 
        address[] memory array = new address[](length);
        uint totalEligible2 = 0;
        for (uint i = cursor; i &lt; cursor+length; i++) {
            array[totalEligible2] = arrEligibleMembers[i];
            totalEligible2++;
        }
        return array;
    }</pre>
  <blockquote id="mvEV">Функция claim эфира для участников, имеющих право на получение токенов после разблокировки.</blockquote>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="m3KV">  function claim() public { 
        address payable walletAddress = payable(msg.sender);</pre>
  </section>
  <pre id="4Lva" data-lang="javascript">        require(
            eligibleMembers[walletAddress].exist == true,
            &quot;No such participant!&quot;
        ); /* Проверка - существует ли участник с данным кошельком. 
        Если параметр exist (существует) равен false, 
        то будет выведено сообщение &quot;Нет такого участника!&quot; 
        и выполнение функции будет остановлено.*/
        require(
            block.timestamp &gt; eligibleMembers[walletAddress].unlocking,
            &quot;Unlocking hasn&#x27;t happened yet!&quot;
        ); /* Проверяет произошло ли уже разблокирование для данного участника. 
        Если текущее время (block.timestamp) не наступило, то будет выведено сообщение 
        &quot;Разблокирование ещё не произошло!&quot; и выполнение функции будет остановлено.*/
        require(
            eligibleMembers[walletAddress].alreadyGotMoney == false,
            &quot;You have already received eth!&quot;
        ); /* Получил ли участник уже эфир. Если параметр 
        alreadyGotMoney (уже получил) для участника с заданным кошельком 
        равен true, то будет выведено сообщение &quot;Вы уже получили эфир!&quot; 
        и выполнение функции будет остановлено.
        
        Таким образом, эти три проверки обеспечивают, что участник имеет право 
        получить свой дроп, иначе функция вызовет ошибку 
        и завершит своё выполнение.*/</pre>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="bHUw" data-lang="javascript">        uint256 amount = xBank / totalEligible;
        eligibleMembers[walletAddress].alreadyGotMoney = true;
        (bool success, ) = walletAddress.call{value: amount}(&quot;&quot;);
        require(success);
        emit GotMoney(walletAddress);
    }</pre>
  </section>
  <blockquote id="b2q7"><code> Проверка текущего баланса контракта.</code></blockquote>
  <pre id="h9XM" data-lang="javascript">function currentBalance() public view returns (uint256) {
        return address(this).balance; 
    }</pre>
  <pre id="q5wb" data-lang="javascript">    modifier onlyOwner() { /* модификатор для ограничения доступа к определенным функциям 
    (только для владельца контракта)*/
        require(msg.sender == owner, &quot;You are not the owner&quot;);
        _;
    }</pre>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="YYj1" data-lang="javascript">    receive() external payable { /*&quot;запасная&quot; функция для приема и сохранения поступающего эфира в xBank 
    для последующего распределения.*/
        xBank += msg.value;
    }</pre>
  </section>
  <pre id="lsfn" data-lang="javascript">    //события
    event NewEligibleMember(address indexed walletAddress, string userNameTelegram, uint256 unlocking);
    event GotMoney(address indexed walletAddress);
    }</pre>
  <blockquote id="NEe0">Конструкция <code>event</code> в Solidity используется для объявления событий, которые могут быть инициированы в ходе выполнения функций в смарт-контракте. </blockquote>
  <p id="AGRA">1. <code>event NewEligibleMember(address indexed walletAddress, string userNameTelegram, uint256 unlocking);</code><br />* Это событие <code>NewEligibleMember</code> инициируется при добавлении нового участника в список. <br />* Он принимает три параметра: адрес кошелька, имя пользователя в Telegram и дату разблокировки.<br />* Ключевое слово <code>indexed</code> используется для обеспечения возможности эффективного поиска и фильтрации событий по указанному параметру.</p>
  <p id="bg5S">2. <code>event GotMoney(address indexed walletAddress);</code><br />* Это событие <code>GotMoney</code>, которое будет вызвано в случае, если участник получит деньги.<br />* Он принимает один параметр - адрес кошелька.<br />* Также используется ключевое слово <code>indexed</code> для этого параметра.</p>
  <blockquote id="tOsg">Эти события могут быть подписаны во внешних приложениях или интерфейсах, чтобы отслеживать и реагировать на изменения в смарт-контракте.</blockquote>
  <p id="uZdf"><strong>[1] Компиляция, деплой и функционал.</strong></p>
  <p id="2s1C">Видим оранжевые и синие кнопки, через <code>addEligibleMember</code> можем добавить данные подходящих участников: адрес кошелька, telegram username и дату unlocking например 18.12.2023 17:21:01 преобразованную в<a href="https://www.unixtimestamp.com/" target="_blank"> <u>Unix Timestamp</u></a> <code>1702909261</code> т.к. все вносится в ручную количество участников небольшое до 255.</p>
  <section>
    <figure id="cwoB" class="m_custom">
      <img src="https://img3.teletype.in/files/29/4f/294f7c7c-3f68-4d63-8e29-6f2c76f2e766.png" width="247.47853736089027" />
    </figure>
  </section>
  <figure id="bmvr" class="m_custom">
    <img src="https://img1.teletype.in/files/43/67/4367bb00-d6fa-4842-9b81-4a31de6de7ad.png" width="330" />
  </figure>
  <p id="gJ8x"><strong>[2] Добавим 3х человек с наступившей датой и 2х с разлоком на 25.12.2023</strong></p>
  <p id="KFGl"><strong>username1</strong><br />0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2</p>
  <p id="BPc7">18.12.2023 17:21:01<br /><code>1702909261</code><br />______________________________________<br /><strong>username2</strong><br />0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db</p>
  <p id="v0Jl">18.12.2023 17:21:01<br /><code>1702909261</code></p>
  <p id="WGG5">______________________________________<br /><strong>username3</strong><br />0x78731D3Ca6b7E34aC0F824c42a7cC18A495cabaB</p>
  <p id="fois">18.12.2023 17:21:01<br /><code>1702909261</code></p>
  <p id="UMZ4">_______________________________________<br /><strong>username4</strong><br />0x617F2E2fD72FD9D5503197092aC168c91465E7f2</p>
  <p id="JQrI">25.12.2023 01.11.11<br /><code>1703455871</code><br />________________________________________<br /><strong>username5</strong><br />0x17F6AD8Ef982297579C203069C1DbfFE4348c372</p>
  <p id="2owE">25.12.2023 01.11.11<br /><code>1703455871</code></p>
  <figure id="2BmO" class="m_custom">
    <img src="https://img1.teletype.in/files/0f/72/0f7257cc-02a7-476b-963a-f017cbcd2f5e.png" width="291" />
  </figure>
  <p id="QFu1"> *Функция для чтения определенного диапазона участников из массива.</p>
  <figure id="pPnX" class="m_original">
    <img src="https://img2.teletype.in/files/5f/51/5f5162a4-1c98-4b95-b96d-b4de373a295a.png" width="320" />
  </figure>
  <p id="Fuss"><strong>[3] Сlaim</strong></p>
  <p id="5Inw"><u>Username1</u> успешно заклеймил 0,2 eth, на балансе контракта осталось 0,8. <u>username4 и username5</u> смогут это сделать (25.12.)</p>
  <figure id="LmOs" class="m_original">
    <img src="https://img1.teletype.in/files/4e/cb/4ecbf07c-9091-4e71-8126-8f85bd76bb71.png" width="328" />
  </figure>
  <p id="bUVe"><strong>[4] Вывод: </strong> Смарт-контракт предоставляет базовую структуру для проведения аирдропа среди подписчиков (также возможно адаптировать под различные активности и мероприятия, добавлять больше данных о пользователях / ранжировать на группы по анлоку), где участники могут получить свои токены после определенной даты разблокировки.</p>

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