<?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>@valpaq</title><generator>teletype.in</generator><description><![CDATA[@valpaq]]></description><link>https://teletype.in/@valpaq?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=valpaq</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/valpaq?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/valpaq?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Fri, 22 May 2026 23:22:49 GMT</pubDate><lastBuildDate>Fri, 22 May 2026 23:22:49 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@valpaq/arcium</guid><link>https://teletype.in/@valpaq/arcium?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=valpaq</link><comments>https://teletype.in/@valpaq/arcium?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=valpaq#comments</comments><dc:creator>valpaq</dc:creator><title>Arcium</title><pubDate>Tue, 04 Nov 2025 16:54:06 GMT</pubDate><description><![CDATA[<img src="https://img4.teletype.in/files/b3/2c/b32c89f8-be1f-4ce0-9ef6-ad68b4262236.png"></img>Когда в Solana появились confidential transfers в Token-2022, оказалось, что теперь можно прятать балансы и суммы. Тем не менее, жить с этим сложно: доступен лишь EOA кошелек, нет DeFi и UX сложен для конечного пользователя.]]></description><content:encoded><![CDATA[
  <figure id="2hRe" class="m_original">
    <img src="https://img4.teletype.in/files/b3/2c/b32c89f8-be1f-4ce0-9ef6-ad68b4262236.png" width="389" />
  </figure>
  <p id="diPc">Когда в Solana появились confidential transfers в Token-2022, стало возможным прятать балансы и суммы. Но пользоваться этим сложно: доступен только EOA-кошелёк, нет DeFi и UX&#x27;а нет для обычного юзера(кошельки не поддерживают, баги есть, нахрен надо?). </p>
  <p id="RoG5">Про это уже писалось в отдельной статье: <a href="https://teletype.in/@valpaq/confidential_balances" target="_blank">https://teletype.in/@valpaq/confidential_balances</a></p>
  <p id="Cdwi">Arcium — вторая половина истории: Solana остаётся быстрым L1, рядом вешается зашифрованный «процессор», который считает над зашифрованными данными и отдает результат обратно обычным программам.</p>
  <h2 id="QsJN">Что такое Arcium</h2>
  <ul id="sP7i">
    <li id="AKKa"><strong>Solana</strong> отвечает за:</li>
    <ul id="PxQt">
      <li id="UGeT">очередь задач (ончейн-мемпул вычислений),</li>
      <li id="PlkO">оплату, стейкинг, слэшинг,</li>
      <li id="NWPv">вызовы из программ и обратно.</li>
    </ul>
    <li id="ful7"><strong>Arcium </strong>- это сеть Arx нод:</li>
    <ul id="UOVa">
      <li id="p33X">получают зашифрованные входы,</li>
      <li id="8TMQ">внутри MPC-кластера считают функцию (добавляют рандом и подобное),</li>
      <li id="0rt8">шлют результат обратно в Солану (через Arcium Program или ваш callback-сервер).</li>
    </ul>
    <li id="HMpO"><strong>MXE (Multi-Party Execution Environment)</strong> - контейнер под конкретное приложение:</li>
    <ul id="suPZ">
      <li id="0hnz">ваша Solana-программа,</li>
      <li id="sXRV">набор «конфиденциальных инструкций»,</li>
      <li id="1ugH">метаданные, какой MPC-кластер использовать и т.п.</li>
    </ul>
    <li id="Ex8y"><strong>Arcis</strong> - слой над Anchor для написания конфиденциальных инструкций.</li>
    <ul id="8Hra">
      <li id="fwki"><code>arcium</code> CLI - обертка над Anchor,</li>
      <li id="Q8af">TS-клиент, который шифрует данные на устройстве и отправляет в MXE. </li>
    </ul>
  </ul>
  <p id="MfVB">В программе на Solana появляется вызов условной [confidential]-функции. Она не считает сама: собирает описание вычисления и кидает его в Arcium Program. Тот кладёт задачу в ончейн-мемпул, выбирает свободный MPC-кластер и через callback возвращает результат.</p>
  <p id="fLLh"></p>
  <h2 id="W0nr">Cerberus и Manticore: два режима MPC</h2>
  <p id="IRbv">У Arcium два MPC-протокола: <strong>Cerberus</strong> и <strong>Manticore.</strong></p>
  <h3 id="Mx8c">Cerberus - permissionless </h3>
  <ul id="KFsU">
    <li id="a8GA"><strong>Модель безопасности.</strong><br />Dishonest majority / <em>N-1 honest</em> - достаточно, чтобы хотя бы одна нода в кластере была честной.</li>
    <li id="gjOx"><strong>Без trusted dealer’а.</strong><br />Нет единого генератора секретов, в которого надо верить; все распределяется протоколом.</li>
    <li id="b3WB"><strong>MAC-проверки.</strong><br />Каждая часть секрета обвешана MAC’ами; как только кто-то начинает подсовывать левое значение, вычисление останавливается, ноду можно выкинуть из кластера.</li>
    <li id="nRcO"><strong>Арифметика в шифртекстах.</strong><br />Сложение/умножение над зашифрованными данными делается без дешифровки. </li>
  </ul>
  <p id="xGRW">Кейсы: приватные ордера, предикшн-маркеты, конфиденциальные балансы.</p>
  <p id="Mk57"></p>
  <h3 id="lUuA">Manticore - permissioned</h3>
  <ul id="6EVQ">
    <li id="dANH"><strong>Модель.</strong><br />Honest-but-curious / honest majority - участники следуют протоколу, но могут пытаться вытащить лишнюю инфу из своих шеров.</li>
    <li id="Y3Um"><strong>Trusted dealer.<br /></strong>Есть отдельный участник, который готовит криптографические материалы (preprocessing, секреты и т.п.). Это ускоряет протокол, но требует доверия к сетапу.</li>
    <li id="c878"><strong>Заточен под ML.<br /></strong>Исходный ресерч по Manticore - как раз про эффективный MPC для вещественной и булевой арифметики (ML/AI, аналитика, матрицы и прочая беда).</li>
  </ul>
  <p id="kKnu"></p>
  <h2 id="dlwH">Как это выглядит для разработчика</h2>
  <h3 id="p5SM">Жизненный цикл вычислений</h3>
  <ol id="npmX">
    <li id="Da9l"><strong>Definition.</strong><br />В Arcis описываешь computation: какие аргументы, какая функция, какой кластер.</li>
    <li id="hiZA"><strong>Commissioning.</strong><br />Solana-программа дёргает этот definition с конкретными аргументами и окном по времени.</li>
    <li id="F287"><strong>Mempool.</strong><br />Задача падает в ончейн-мемпул Arcium Program.</li>
    <li id="qtCj"><strong>Execution.</strong><br />Кластер Arx-нод забирает задачу, крутит Cerberus/Manticore, на выходе - зашифрованный результат.</li>
    <li id="3O4Y"><strong>Callback.</strong><br />Результат заворачивается в callback-транзу (или в ваш HTTP-callback, если не влезает) и прилетает обратно в программу на Солане.</li>
  </ol>
  <p id="HoQI">Весь MPC живёт в сети Arx-нод. Солана видит только описание вычисления, факт исполнения и кусок данных. Дальше уже сами решаете, что с этим делать.<br /></p>
  <h3 id="nRKs">DSL/Arcis</h3>
  <p id="zdEE">Arcis — язык под схемы, которые крутятся на Arcium. Рамки жёсткие:</p>
  <ul id="82g4">
    <li id="RE8B">в Cerberus/Manticore вы не залезете - протоколы спрятаны под капот.</li>
    <li id="dMPn">топологию кластера вы не настроите, только выберете, куда слать (и то летом ни о какой Manticore речи не было).</li>
    <li id="4t7x">с отдельными нодами не пообщаетесь, всё идёт через Arcium Program / клиент.</li>
    <li id="4YG9">Все детерминированно заранее, никаких циклов от размера массива и т.д.</li>
  </ul>
  <p id="vWFq">Это не «соберу свой MPC», а «описал функцию - Arcium посчитал и отдал результат, взамен сказал ему спасибо(заплатил монету)».</p>
  <h3 id="4oQX">Технические ограничения</h3>
  <ul id="btq9">
    <li id="TswM"><strong>Размер выхода.<br /></strong>Результат одной конфиденциальной инструкции должен влезать в одну Solana-транзу (callback). Если нет - нужно поднимать свой HTTP-callback-сервер, принимать весь остаток там и самому уже управлять результатом.</li>
    <li id="XCVG"><strong>Асинхронность.</strong> <br />Вычисление живет отдельно от Solana-транзакции по времени. Есть <code>valid_after</code> / <code>valid_before</code> окна; если не успели - задача протухла.</li>
  </ul>
  <ul id="213s">
    <li id="b4vN"><strong>Сетевой слой от вас независим.</strong> <br />Вы не управляете тем, какой конкретно узел считает вашу задачу; это переключаемые кластеры, какой именно узел считает - не контролируете.</li>
  </ul>
  <ul id="rdo4">
    <li id="hY0H"><strong>Mainnet. <br /></strong>Еще нет, этой весной обещали в q4/2025, возможно q1/2026.</li>
  </ul>
  <h2 id="Kyzm"><br />Arcium SPL</h2>
  <p id="Rq9b">Ранее мы уже смотрели на <strong>Token-2022 SPL CT</strong>:</p>
  <ul id="jD9B">
    <li id="XMqb">twisted ElGamal поверх публичного ключа</li>
    <li id="pEbJ">range/validity/equality ZK-пруфы</li>
    <li id="B39c">разделение pending/available</li>
    <li id="rAGy">опциональный аудитор, AES-баланс</li>
  </ul>
  <p id="lV88"><strong>Arcium Confidential SPL Token (C-SPL)</strong> - надстройка над этим всем. Задуман как единый слой поверх разных стандартов токенов.</p>
  <ol id="CJ1d">
    <li id="LbS0"><strong>Программная работа с конфиденциальными аккаунтами.</strong><br /> Token-2022 CT разрешает владеть конфиденциальным балансом только EOA-кошелькам, что убивает DeFi - программы не могут работать с  зашифрованными балансами.<br /> C-SPL добавляет адаптер, который через Arcium позволяет программам владеть и двигать эти балансы внутри MPC, не открывая их.</li>
    <li id="09Xl"><strong>Аккаунты за других людей.</strong><br /> В CT получатель должен заранее завести конфиденциальный аккаунт для каждого минта. В C-SPL есть Confidential ATA-програм, которая через Arcium создает временный защищенный аккаунт на получателя, а он потом его «забирает» и подшивает свои ключи. UX похож на обычный SPL~.</li>
    <li id="3jUf"><strong>Канонические конфиденциальные обертки.</strong><br /> Через token-wrap можно сделать единый C-SPL-mint для любого обычного SPL-токена и дать исходному минту роль аудитора.</li>
    <li id="R7ir"><strong>Отдельный Encrypted SPL Token.</strong><br /> Для программных (не EOA) use-case’ов они делают отдельный, более легкий стандарт, заточенный под Cerberus и прямое вычисление над ciphertext’ами в MPC.</li>
  </ol>
  <p id="BDRj"></p>
  <h2 id="0GPz">Umbra: приватный слой поверх Arcium</h2>
  <p id="b4W9">У Umbra вся архитектура делится на три крупных блока:</p>
  <ul id="nUd3">
    <li id="4Onz">Umbra Addresses - «stealth-адреса» на Solana;</li>
    <li id="vuta">Anonymity Layer (shielded pool) - слой, который рвёт линк депозит ↔ вывод;</li>
    <li id="EyUT">Encrypted Balances - хранение балансов как ciphertext’ов в PDA + MPC-обновления.</li>
  </ul>
  <h3 id="0PEg">Umbra Addresses</h3>
  <p id="UCHl">Umbra Address - это обычный Ed25519-ключ, ничем не отличимый от стандартного адреса Solana. Важен не формат, а процесс генерации:</p>
  <ul id="Y9dl">
    <li id="u7o2">берётся подпись статического сообщения основным кошельком;</li>
    <li id="j4ZT">эта подпись идёт в PRF, из неё детерминированно вываливается последовательность сидов;</li>
    <li id="ES5p">по каждому сиду генерится отдельный Ed25519-keypair - это и есть Umbra-адрес (как в SPL-CT, только шире).</li>
  </ul>
  <p id="2umt">Свойства: легко восстановить, сложно привязать к автору и друг к другу.</p>
  <p id="d5nZ">На уровне протокола Umbra отделяет «публичные» балансы на этих адресах от приватных, живущих внутри shielded pool.</p>
  <h3 id="0sxs">Anonymity Layer: shielded-пул с ZK-claim’ами и релейерами</h3>
  <ul id="M7Jp">
    <li id="tlXB"><strong>Shielded Pool.</strong><br /> Контракт, который держит кучу токенов разных пользователей; приватность одной транзы зависит от размера множества депозитов.</li>
    <li id="8LvM"><strong>Deposit.</strong><br /> Ты кладёшь токены в пул, а данные (сумма, целевой Umbra-адрес и т.п.) зашиваются в commitment / «записку», которая попадает в общий список.</li>
    <li id="hnmV"><strong>Claim.</strong><br /> Получатель доказывает через ZK-пруф, что он владеет одной из этих записок, не раскрывая какой именно. Контракт проверяет proof, смотрит, не был ли nullifier уже потрачен, и выдаёт токены Umbra-адресу получателя.</li>
    <li id="FAGP"><strong>Relayer Network.</strong><br /> Чтобы не светить, кто платит газ и с какого адреса идёт claim, используется сеть релейеров: они платят комиссию и получают компенсацию из выводимой суммы.</li>
  </ul>
  <h3 id="Q7mZ">Encrypted Balances: PDAs + X25519 + Rescue + MPC</h3>
  <p id="9dlE">Umbra хранит приватные балансы как ciphertext в PDA на Solana, а все обновления делает через Arcium.</p>
  <p id="pNUy"><strong>Две пары ключей на кошелёк:</strong></p>
  <ul id="nI3L">
    <li id="CsOK">Ed25519 - обычный spending key, подписывает транзы;</li>
    <li id="eKpU">X25519 - encryption key, по нему считается ECDH с MPC-сетью, от него зависят PDA.</li>
  </ul>
  <p id="L3YP"><strong>Структура on-chain:</strong></p>
  <ul id="kXSl">
    <li id="Drci">PDA-аккаунт пользователя;</li>
    <li id="i5jx">PDA под каждый токен: внутри <code>(ciphertext, nonce)</code>, где</li>
    <ul id="HjEM">
      <li id="MTHL"><code>ciphertext</code> - зашифрованный баланс через Rescue cipher;</li>
      <li id="JgK0"><code>nonce</code> - уникальная «соль» на каждое обновление.</li>
    </ul>
  </ul>
  <p id="w1Aa"><strong>Дешифровка:</strong></p>
  <ul id="YK80">
    <li id="6uME">кошелёк дёргает PDA, вытаскивает <code>(ciphertext, nonce)</code>;</li>
    <li id="bAVI">делает ECDH(X25519_user, PK_MPC) → shared secret;</li>
    <li id="lVbq">из секрета + nonce инициализирует Rescue и расшифровывает баланс - всё локально на девайсе.</li>
  </ul>
  <p id="gkct"><strong>Обновление баланса:</strong></p>
  <ul id="gFui">
    <li id="Jyu1">кошелёк шлёт в MPC-кластер инструкцию <code>+10 USDC</code> в зашифрованном виде;</li>
    <li id="AcD9">MPC-ноды подтягивают текущий ciphertext из PDA, делают гомоморфное обновление над шифртекстом, генерят новый <code>ciphertext + nonce</code>, пишут обратно.</li>
    <li id="1YDZ">При этом никто из нод не видит ни старого, ни нового баланса, ни дельту.</li>
  </ul>
  <p id="oaML"></p>
  <h2 id="o675">Stealf</h2>
  <p id="EgIt">Stealf - нео-банк на стейблкоинах, у которого два уровня кошелька: публичный и приватный.</p>
  <p id="75FO"><strong>Публичный:</strong></p>
  <ul id="2jM2">
    <li id="o0BG">KYC;</li>
    <li id="lov8">карта;</li>
    <li id="oQpZ">SEPA;</li>
    <li id="eJLU">полностью прозрачный трейс - всё как в обычном банке.</li>
  </ul>
  <p id="ZUsb"><strong>Приватный:</strong></p>
  <ul id="oY3d">
    <li id="pKtS">Arcium-движок;</li>
    <li id="krmu">полностью шифрованные балансы;</li>
    <li id="McOk">анонимные P2P-переводы без KYC.</li>
  </ul>
  <p id="Lyt6">Технически:</p>
  <ul id="YjJr">
    <li id="ND05">двойная архитектура кошелька: один слой под «официальный» флоу, второй - под крипто-приватность;</li>
    <li id="Xnnu">Arcium + PDAs: приватный кошелёк использует PDA как прокси-адреса, реальные суммы хранятся в зашифрованном виде и обновляются через MPC;</li>
    <li id="sPpe">relayers: чтобы не светить реальные адреса/суммы, транзы подписывают и отправляют релейеры, а сумма на цепочке показывается минимальной, реальная зашита в данных транзы, уходит в MPC и там уже добавляется к балансу.</li>
  </ul>
  <p id="UbGI"></p>
  <h2 id="XJ3K">Melee: viral prediction markets</h2>
  <p id="rAOu">Melee - «viral prediction markets» на Solana: смесь Pump.fun и Polymarket.</p>
  <ul id="bxWd">
    <li id="pH0E">Любой крейтор может завести рынок про что угодно: выборы, мемы, монеты, поп-культуру;</li>
    <li id="sdIp">Нет отдельной касты «админов, которые решают, какие рынки можно»;</li>
    <li id="JvOL">Прайсинг поверх бондинг-кривой: ранние заходы награждаются сильнее - классическая «зашёл первым, оказался прав - забрал львиную долю».</li>
  </ul>
  <p id="FsUP"><strong>Флоу:</strong></p>
  <ul id="MeXV">
    <li id="Hb9s"><strong>Создание рынка.</strong><br /> On-chain маркет создаётся permissionless, параметры и ставки видны всем.</li>
    <li id="3bgf"><strong>Разрешение исхода.</strong><br />Вместо одного централизованного оракула или DAO, который руками резолвит рынок, собирается кворум валидаторов/участников. Они голосуют зашифрованно через Arcium, голоса не видны до конца периода, нет эффекта «подстроиться под большинство».</li>
    <li id="hcvb"><strong>MPC-резолв.</strong><br />Arcium считает итоги и проверяет, кто голосовал против факта; неправильно проголосовавших можно слэшить. Результат (какой исход победил) возвращается на Solana, и уже там идёт обычный расчёт по рынку.</li>
  </ul>
  <p id="PGea"></p>
  <h2 id="DasN">Другие направления поверх Arcium</h2>
  <p id="zy1U">Кроме Umbra / Stealf / Melee там уже намечается зоопарк:</p>
  <ul id="Db5r">
    <li id="V4AE"><strong>Encrypted DeFi / даркпулы.</strong><br /> Orca и co смотрят в сторону рынков, где объёмы, цены и контрагенты уходят в MPC, а на цепи остаётся только сетлмент и минимум метаданных.</li>
    <li id="4fVI"><strong>Платежи и кастоди.</strong><br /> Squads, Sphere, Iron и подобные - конфиденциальные мультисиги/трезори, лимиты и балансы которых не торчат в эксплорере, плюс MPC-key-менеджмент.</li>
    <li id="MkFj"><strong>AI / аналитика.</strong><br /> Nosana, CrunchDAO и прочие AI-ребята - совместный тренинг/инференс по шифрованным данным, когда каждый боится показывать датасет соседу.</li>
  </ul>
  <p id="PUbK">В Colosseum сейчас реально каждый второй питч - «мы делаем X, но поверх Arcium».</p>
  <h2 id="ZtxR">Ограничения</h2>
  <p id="Knoi"><strong>Латентность.</strong></p>
  <p id="zIpA">Помимо самой Solana добавляются:</p>
  <ul id="gnwc">
    <li id="0R4m">очередь в мемпуле Arcium;</li>
    <li id="wy26">несколько раундов MPC;</li>
    <li id="XQYi">callback-транза назад.</li>
  </ul>
  <p id="idh2">Для кошелька/разового перевода ок. Для чего-то, что должно реагировать быстро, задержка уже заметна. На летнем тестнете между «отправил» и «получил результат» у меня было примерно 7 блоков. Их dark pool demo при этом не работал с балансами и ценой - просто кидал и мэтчил ордера с бидами/асками (и не было очереди из других протоколов).</p>
  <p id="teVq"><strong>Размер результата.</strong></p>
  <p id="CyBe">Выход одной encrypted-инструкции должен помещаться в одну транзу. Всё, что выше - поднимаешь HTTP-callback, принимаешь хвост там, проверяешь хеш на цепи и сам раскладываешь по стейту.</p>
  <p id="90MC"><strong>Кластеры и доверие.</strong></p>
  <p id="plxP">Cerberus на бумаге живёт в модели N-1 honest. На практике всё упрётся в то, кто именно крутит Arx-ноды и как у них устроен стейкинг/слэшинг.<br /> Manticore честно говорит «есть trusted dealer» - это история для permissioned-сетапов, а не для любого контракта на Solana.</p>
  <p id="c1B1"><strong>Стадия сети.</strong></p>
  <p id="ZZ5l">Mainnet Alpha только выкатывают, часть нод под командой и «индустриальными» валидаторами, &quot;множество&quot;(тоже encrypted, я их не видел) проектов в закрытых когортах еще с весны. Янник при общении рассказывает многое (вплоть до почти атомарных флоу в одну транзу (и encrypted everything)), но пока это планы.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@valpaq/confidential_balances</guid><link>https://teletype.in/@valpaq/confidential_balances?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=valpaq</link><comments>https://teletype.in/@valpaq/confidential_balances?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=valpaq#comments</comments><dc:creator>valpaq</dc:creator><title>Confidential balances в Solana</title><pubDate>Tue, 03 Jun 2025 14:07:58 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/22/f5/22f52456-c0a5-40ee-b6c3-e07caa56a3d7.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/ff/69/ff692987-7ec7-480a-952d-93e20378cf77.png"></img>]]></description><content:encoded><![CDATA[
  <figure id="30I9" class="m_column">
    <img src="https://img4.teletype.in/files/ff/69/ff692987-7ec7-480a-952d-93e20378cf77.png" width="1536" />
  </figure>
  <p id="z8JF">Еще давно в солане появился Token 2022 - стандарт spl токена, с расширяемой логикой(extensions). Там есть такие же функции на передачу, минт, заморозку, разморозку, сжигание, но в них можешь добавлять еще действия: комиссию (как это сделали в something.cool), проверку на вайтлист, интерест модель, нон трансферабл токенсы, и множество других штук (<a href="https://solana.com/ru/docs/tokens/extensions" target="_blank">https://solana.com/ru/docs/tokens/extensions</a>). Недавно запустили расширение с confidential transactions.</p>
  <p id="8Rbd">Это особенность, благодаря которой скрывается баланс у юзера, а также скрывается размер транзакции (перевода, минта и сжигания). По сути единственное что будет видно это вызов функций (и упоминание програм), а все что происходит внутри скрыто (как в zcash с их z layer). И единственные кто могут увидеть свои балансы это сами юзеры, а также возможное отдельное лицо, называемое аудитором, который может смотреть с помощью определенного приватного ключа. </p>
  <p id="Bl4t"></p>
  <h2 id="MElE">Математика внутри</h2>
  <p id="4crm">Для начала пойдем в то как оно работает. Чтобы скрыть балансы и переводы и все остальное, используется шифрование public key (по сути своей как и работают все блокчейны с публичным и приватным ключом). </p>
  <p id="aRZN">Есть алгоритм ElGamal, и в базовой версии он работает следующим образом - зашифрованные числа можно умножать, при этом после расшифровки финального числа оно равно обычному перемножению. a*b = c = decrypt(enc(a) * enc(b)). Основная защита данного алгоритма в дискретном логарифме.</p>
  <p id="SQ7z">В Solana же используется Twisted ElGamal, позволяющий складывать зашифрованные числа. a+b = c = decrypt( enc(a) * enc(b))</p>
  <p id="E2tR">Зная публичный ключ человека, которому мы передаем баланс, мы можем зашифровать число, которое мы передаем, с помощью публичного ключа данного человека. И можем к этому зашифрованному балансу прибавить другое зашифрованное число, его же публичным ключом, и тем самым произвести увеличение его баланса. А это же число, которое хотим передать, зашифруем у себя своим публичным ключом, и вычтем у себя. </p>
  <p id="m0Lo">При этом, одним twisted ElGamal дело не заканчивается, внутри сети же никто ничего не знает, а значит есть сопутствующие данные и проверки.</p>
  <p id="f16R"></p>
  <p id="bLb9"></p>
  <h3 id="etd6">Доказательство валидного перевода</h3>
  <p id="ca7K">В рамках обычного спл очень легко проверить изменение балансов и этим занимаются валидаторы. Тут же идея что этого не увидит никто, а значит нужно доказать что такой перевод имеет место быть, для этого используются zero knowledge proofs:</p>
  <ol id="8MHY">
    <li id="AnCP">Range proof - доказываем, что числа (после трансфера и сам трансфер) находятся в 0&lt;=x&lt;=2^48 (отсюда и информация в дешифрование twisted ElGamal что эти числа легко перебрать(относительно)) </li>
    <li id="sA1K">Validity proof - здесь мы доказываем, что числа (для сложения и вычитания) зашифрованы валидно. При этом не раскрывается ни сама сумма, ни оставшийся баланс.</li>
    <li id="dS6E">Equality proof - Пруф того что все зашифрованные числа равны (в незашифрованном виде)</li>
  </ol>
  <p id="uGrl"></p>
  <h3 id="KEI8">Генерация ключей</h3>
  <p id="WGZ5">Для использования шифрований нужно как-то сгенерировать эти ключи, а они отличаются от стандартного шифрования в солане (построенного на эллиптической кривой ed25519), а значит нужно сгенерировать новые ключи и управлять ими.</p>
  <ol id="a7TB">
    <li id="bP9s"> Они генерируются на базе твоего приватного ключа под твой аккаунт, не под каждый минт. Результат подписи с сидом &quot;ElGamalSecretKey&quot; идет как сид в генератор случайных чисел и на базе него мы получаем приватный ключ (а от него и публичный). Полностью детерминированная система.</li>
    <li id="Yg9y">Единственная сложность шифра twisted ElGamal состоит в том что при дешифровке числа, ты получаешь не само число, а g^private_number (поэтому он и называется скрученный, и позволяющий делать операцию сложения) а значит, каждый раз проводить вычисления чтобы посмотреть баланс. Каждый раз вычислять его неудобно и долго, поэтому было добавлено еще одно число в сам аккаунт, но уже зашифрованное AES (шифр nist). Данный шифр позволяет хранить числа зашифрованными, и всегда легко и быстро понимать чему они равны и только юзер сможет это прочитать (и изменить).  Для этого нужно знать ключ от данного AES шифра, и ключ генерируется аналогично как для twisted ElGamal, только тут сидом является &quot;AeKey&quot;.</li>
  </ol>
  <p id="8LXt"></p>
  <h3 id="oE6c">&quot;Аудитор&quot; в токене</h3>
  <ol id="f2m8">
    <li id="dpAP">Так как сама по себе солана есть компания из us, она не может сделать одностороннюю зашифрованную систему. Аудитор, в рамках spl ct, это такой наблюдатель со стороны, который может посмотреть баланс юзеров (зашифрованный публичным ключом аудитора). На этом его возможности заканчиваются. </li>
    <li id="6XnU">Принцип работы следующий: при каждом обновлении баланса(трансфере, минте, берне), кроме того чтобы обновить свой зашифрованный баланс своим публичным ключом и чужой(если трансфер), также ты обновляешь свой и чужой баланс, зашифрованный уже публичным ключом аудитора. Используется одно число для двух балансов, так как шифруется публичным ключом аудитора,</li>
    <li id="nByQ">А уже сам аудитор может расшифровать, но это опция, а не необходимость, и далеко не на каждый токен такое нужно(но для любого большого, а-ля shielded usdt,  думаю нужно, иначе вопросы возникнут).</li>
  </ol>
  <p id="7Jxz"></p>
  <h3 id="tTyx">Гарантия консистентности</h3>
  <p id="D3Z6">Так как используются zero-knowledge proofs, то получается, что пока ты создаешь пруфы, отправляешь транзу, и она попадает в блок, тебя могут кто-то обогнать и увеличить твой баланс. А твоя транзакция этого не учитывает и пруфы упадут. </p>
  <p id="7jIW">Поэтому существует разделение баланса в виде pending (ожидающий) и available(доступный). В рамках транзакции от своего аккаунта ты всегда используешь доступный баланс, и если уж тебе надо то ты можешь сам обновить свой баланс транзакцией apply. В этой же транзакции обновляется и AES баланс, так как он показывает только available баланс и может обновляться только самим юзером.</p>
  <figure id="hcQE" class="m_column">
    <img src="https://img1.teletype.in/files/0f/bb/0fbb02fb-c767-43aa-9e06-6967e4683a5b.png" width="800" />
  </figure>
  <p id="9FZB">Что в итоге:</p>
  <ol id="NhZa">
    <li id="2z45">Spl token 2022 расширение с confidential transfers. В рамках данного расширения, балансы скрываются гомоморфным шифрованием twisted ElGamal, позволяющим складывать скрытые числа.</li>
    <li id="ARRC">Для проверки данных чисел в момент транзакций используется zero knowledge proofs (validity proof(легитимность транзакции), range proof(легитимность размера трансфера), equality proof(проверка на одинаковое шифрование)).</li>
    <li id="a1Pi">Есть публичный ключ &quot;аудитора&quot;, хранящийся в токене, с помощью которого &quot;аудитор&quot; может посмотреть чужие балансы, но не влиять на них.</li>
    <li id="lEsg">Чтобы гарантировать консистентность балансов при действиях, используется разделение балансов на доступные (на которые влияет сам пользователь) и ожидающие(куда перечисляют токены другие адреса).</li>
    <li id="K1iY">Для упрощения вычислять скрытый баланс аккаунта используются AES шифрованные балансы, которые не позволяют гомоморфно складывать шифр тексты, но позволяют хранить и быстро шифровать и расшифровывать для быстрого доступа к балансу.</li>
    <li id="1kmD">Все ключи, используемые в twisted ElGamal и AES, привязываются к приватному ключу аккаунта, а не к токену(минту) и вычисляются детерминированно. По 1 связке на каждый аккаунт.</li>
  </ol>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@valpaq/nillion</guid><link>https://teletype.in/@valpaq/nillion?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=valpaq</link><comments>https://teletype.in/@valpaq/nillion?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=valpaq#comments</comments><dc:creator>valpaq</dc:creator><title>Nillion и с чем это едят</title><pubDate>Sun, 21 Jul 2024 21:46:11 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/d2/14/d2145995-8795-4e8f-b888-03f2520e47a1.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/da/cb/dacb34e7-136d-4bcf-9d07-550c9d630652.png"></img>Наевшись ZK во всех его имплементациях, подняв и попилив могучую кучу денег и придя в итоге к зкпсиху и старку, начинаешь смотреть что происходит еще в криптографии в блокчейне. И тут, оказывается, существует еще mpc и оно, наконец, начинает хоть как-то появляться в инфополе, пусть пока и единичных экземплярах (renegade https://renegade.fi/) (даже в кунилисте был Nillion). Так что же это такое этот Nillion? Немного вводных данных вначале]]></description><content:encoded><![CDATA[
  <figure id="U6kT" class="m_column">
    <img src="https://img2.teletype.in/files/da/cb/dacb34e7-136d-4bcf-9d07-550c9d630652.png" width="2000" />
  </figure>
  <p id="0cFI">Наевшись ZK во всех его имплементациях, подняв и попилив могучую кучу денег и придя в итоге к зкпсиху и старку, начинаешь смотреть что происходит еще в криптографии в блокчейне. И тут, оказывается, существует еще mpc и оно, наконец, начинает хоть как-то появляться в инфополе, пусть пока и единичных экземплярах (renegade <a href="https://renegade.fi/" target="_blank">https://renegade.fi/</a>) (даже в кунилисте был Nillion). Так что же это такое этот Nillion? Немного вводных данных вначале</p>
  <h2 id="P3rz">Безопасное хранение HVD</h2>
  <p id="U2Iv">HVD (High value data) - это данные, которые важны юзерам и которые не особо хотят распространять: разные веса для моделек в ML, ордера, левередж позиций, медицинские данные. Эти данные нужно хранить и аккуратно с ними работать, по возможности не раскрывая всем. Для этого существуют разные подходы:</p>
  <ol id="H9GY">
    <li id="sllb">MPC - мы храним секреты в разных местах, и если нам нужно их посчитать, то мы будем делать определенное количество операций между нодами (хранящими данные), например сложение умножение, между самими нодами так, что данные ноды не узнают никакой информации друг у друга, но смогут <strong>совместно </strong>посчитать то что нужно. Например то с чего начался mpc - проблема миллионеров, которые хотят узнать кто из них богаче, не разглашая никому свои балансы (ни третьей стороне, ни друг другу), просто кто богаче. Более приземленные варианты это</li>
    <ol id="28MT">
      <li id="prp5">Аукционы и ордера на покупку, чтобы выбрать самый высокий но чтобы никто не видел кто какой выставил и выбор был произведен абсолютно чисто</li>
      <li id="tLex">Совместные обучения машинок (например Tesla и Waymo) обучают свои машинки отдельно, но могут получить что-то совместное, не делясь датасетом на котором машинки будут обучаться</li>
    </ol>
    <li id="wsvY">ZK - мы проведем вычисления у себя, проверим валидность данных вычислений и скажем результат, но мы есть третья кристально чистая сторона и нам нужно верить (это вот многие не любят). Если нету доверия то схема рушится, ну и сторона эта нужна. Из вариантов подходит</li>
    <ol id="Q6S5">
      <li id="rBwY">Система идентификации и подтверждения, что ты не показываешь паспорт на кассе со всеми сопутствующими данными левыми, а условно через приложуху, <strong>которой обязан доверять магазин, </strong>можешь доказать что тебе уже 18 лет и ты достоин</li>
    </ol>
    <li id="PDX3">FHE - мы зашифруем твои данные и они будут зашифрованными в системе. А уже поверх них мы будем делать сложения и умножения. Они останутся в системе, но мы можем считать разные статистики, складывать умножать, главное что все поверх зашифрованных данных. Если нам нужно получить результат (например 1+2), и наши 1 и 2 зашифрованы, то мы складываем сами зашифрованные данные и в результате получим какое-то третье зашифрованное число, которые при <strong>расшифровке </strong>будет равно 3.</li>
  </ol>
  <p id="fmLq">Вот три существующих подхода по решению данных задач, которые можно или скоро будет можно ( с FHE еще не все так гладко (люди из октры/fhenix/zama со мной не согласны офк)) увидеть в бч.</p>
  <h2 id="n4Nf">В чем основные сложности MPC</h2>
  <p id="iOXv">Так как мы должны использовать наши данные, лежащие в разных местах, для того чтобы посчитать общие результат, мы не можем просто кидать сразу реальные значения. Нам нужно разбить на множество крупиц, и так с каждыми данными из каждой ноды, и путем обмена сообщениями пересобрать уже в итоге финальный результат. Поэтому проблем несколько</p>
  <ol id="FlX2">
    <li id="HTog">Если мы раскинем все по плохим нодам, они могут договориться и собрать сами то что ты разослал и какие данные хранишь. </li>
    <li id="SUAP">Или эти плохие ноды могут давать не те свои данные или не так их разбивать и в итоге получится не совсем то что надо.</li>
    <li id="JsLH">Для множественного взаимодействия нужно достаточно много итераций (которые занимают время). На 10 нод будет 100 итераций (условно), на 1000 нод обмен информацией будет невероятно долгим.</li>
  </ol>
  <p id="xJM1">Ну и есть еще один тип нод, называемых honest but curious, это честные ноды, которые честно все считают и не занимаются херней, но им очень интересно что же ты хранишь там у себя. </p>
  <p id="ZkoL">И из-за этого множества есть особые криптографические алгоритмы с выбором нод, определенных трешхолдов распределения секретов (как на разделении секрета Шамира) и всяких сопутствующих вещей.</p>
  <h2 id="qBF1">Что же придумал Ниллион</h2>
  <h3 id="Qsyq">Архитектура</h3>
  <p id="oMC1">Ниллион решил пойти по пути современных блокчейнов, разделив экзекьюцию, хранение и вычисления в разные слои. Из-за этого получается следующее:</p>
  <p id="xC9V">Существует множество Dealer нод, хранящих информацию. На вход функции поступают еще какие-то инпуты (Какие данные из каких нод, какие еще добавляются), собирают данные с нод с учетом данных инпутов, после отдают это все на вычисления в NMC ноды, которых гораздо меньше, уже на них проводят вычисления локально и после эти, скажем так полуфинальные данные, отдаются в Result nodes, которые меняют то что хранится внутри dealer nodes.</p>
  <p id="xMQT">Raw-perprocessed-finish to network</p>
  <figure id="Lusy" class="m_original">
    <img src="https://img2.teletype.in/files/1a/4d/1a4d2b8e-3da9-456a-be7c-92f111e00f52.png" width="844" />
  </figure>
  <p id="gwJ3"></p>
  <p id="RUu2">основная идея в:</p>
  <ol id="PbEC">
    <li id="UD0J">что мы не будем везде делать полную медленную децентрализацию как оно идет в smpc, и как изначально проектируется во всех криптографических протоколах основных, в итоге сильно сокращая количество действий и проблемы со множеством раундов, итераций.</li>
    <li id="mDiy">сами вычисления nmc нод, получающих какие-то части для вычислений, проводятся локально, на супер быстрой скорости, кои после будут отдаваться в result ноды, а не вся сеть общается друг с другом.</li>
    <li id="hFOC">Бывают вещи в идентификации и еще чем-то, когда эти данные хранятся на одной ноде (не распределены) и тогда не нужно множество дилер нод, а одна, которая делает рассылку на nmc ноды, сильно меньше коммуникаций. Ну и отправка всех скрывающих общие данные частей на все nmc ноды происходит параллельно, по времени +- как одна отправка на одну ноду, что, по их словам, дает скорость как в обычном блокчейне.</li>
  </ol>
  <p id="eeWe">Nillio дают такие &quot;оптимистичные&quot; картинки, о чем они сами говорят (что это желаемое время)<br /></p>
  <figure id="Pb1D" class="m_column">
    <img src="https://img2.teletype.in/files/d2/7d/d27d4081-4804-474d-b004-0380b9e182da.png" width="807" />
  </figure>
  <p id="N0qx">Что это дает по сравнению со стандартным smpc:</p>
  <ol id="4emY">
    <li id="C5Jf">сильно меньше итераций между нодами, по сути базовые просто хранят распределенно инфу, поэтому будут сильно ориентированные ноды на одно, другое и третье.</li>
    <li id="6Pe6">можно на основании эвристик и базовых правил грамотнее распределять нагрузку (возможно как в соле связанное с тем где хранятся ноды, чтобы условных экзекьюшн в моменте был в одной условной великобритании (то же самое делает соль с их бфт)).</li>
    <li id="3M3u">другой вопрос в том как заскейлить экзекьюшн леер через количество нод и расстояние между ними, и не будет ли такого что если вычисления внутри юс, то как SEC сказал с эфиром, раз большая часть внутри нас то это наша юрисдикция и мы это все будем регулировать.</li>
  </ol>
  <p id="G3gL">На вопрос про экзекьюшн они дают ответ что используют byzantine подход, что если хотя бы 2/3 нод не будут &quot;плохими&quot;, то к консенсусу придем. Сам консенсус при 50+% будет достигнут.</p>
  <h3 id="xgC2">Хранение данных</h3>
  <p id="rp1j">Данные могут быть как приватными, так и публичными. Публичным может быть допустим цена токена в пуле, количество токенов у юзера на балансе, всякие такие общие вещи. Приватными же всякие персональные данные, идентификация.</p>
  <p id="Xn4H">Поэтому есть два типа нод, хранящих информацию - легкие и тяжелые. Легкие хранят публичную информацию и идут как помогающие развитию сети. Тяжелые же хранят и приватную и являются основополагающими в сети. При этом чтобы не было сибил атак с созданием множества нод, и доставанием информации, будет необходим стейк токена(омагад), ну и всякие штрафы в случае нарушения. Если же нода, что хранит данные является скомпроментированной, то для этого и существуют репликации и штрафы чтобы исправить данную ситуацию, так как берется информация со множества нод.</p>
  <h2 id="yNXj">Токен</h2>
  <p id="qZjB">У проекта будет токен, erc20 тип NIL, который будет идти на оплату газа, на доходы для нод, инцентивы и DAO. ничего интересного и нового, все стандартно.</p>
  <h2 id="iP7d">Что делают сейчас</h2>
  <p id="Q0MJ">Предоставление своего execution layer под evm. Юзер пишет контракт на solidity, отправляет им в систему и использует у них. Идея в том что можно отойти от подхода зкп с хранением данных и экзекьюшна, и сделать его более децентрализованным и безопасным. Также писали про вариации с л2/сайдчейнами (мы пипец чо можем только скажите, технология вау), но это под вопросом. Были слова про <a href="https://nillion.com/news/982/" target="_blank">https://nillion.com/news/982/</a> коннект с Арбитрумом, очень много всего связано с near и полным переносом всех их штук под экзекьюшн на ниллионе <a href="https://nillion.com/news/1107/" target="_blank">https://nillion.com/news/1107/</a>, но пока не меиннет и не полная реализация то сидим ждем.</p>
  <h2 id="kghn">Язык Nada</h2>
  <p id="k0r1">Так как вид самих программ будет сильно отличаться, не евм стиль, то нужен свой язык. Он является dsl(domain specific language) и по сути сильно похож на питон:</p>
  <ol id="yA5G">
    <li id="Bkw4">строго типизирован</li>
    <li id="xBqf">компилируем</li>
    <li id="FEIT">с проверками на корректность (раст стиль короче)</li>
  </ol>
  <p id="0Nsx">Также они перенесли уже numpy (одна из главных мат либ на питоне) и добавили либу nada ai(позволяет делать регрессии и всякие другие машин штуки) (<a href="https://docs.nillion.com/nada-by-example" target="_blank">https://docs.nillion.com/nada-by-example</a>), но все равно если глубоко залезть в язык, и как сами они пишут, язык еще не полный и не финальная версия его (поэтому и пока не полностью готовы к меиннету). Но активно развивают, так как уже есть н-ное количество проектов, готовых делать сложные вещи. Одним из таких является chooseK. <a href="https://medium.com/@Nillion_Network/nillion-partners-with-choose-k-to-build-the-future-of-encrypted-rrder-books-eaebfdfa37af" target="_blank">https://medium.com/@Nillion_Network/nillion-partners-with-choose-k-to-build-the-future-of-encrypted-rrder-books-eaebfdfa37af</a></p>
  <p id="M9sq">Идея следующая: у нас есть специфическая сеть со множеством внутренних приколюх, почему бы их не использовать. Сразу появляются следующие идеи:</p>
  <ol id="1Chl">
    <li id="vt3m">ончейн дарк ордербук. У нас есть ордера которые являются приватными данными, так пусть они матчатся друг с другом и проводят свои обмены, все в плюсе.</li>
    <li id="WSxc">Есть подтверждения разных данных, так пусть оно остается по возможности анонимным (по сути идея зк), просто в реализации mpc.</li>
    <li id="4a3n">Аукционы и всякие выборы ончейн, пусть оно будет тоже скрытым дабы исключить &quot;плохое&quot; поведение, связанное с абузом.</li>
    <li id="Mpks">И дальше ...</li>
  </ol>
  <p id="V9lD">В чем основной мотив - минимизировать любой возможный мев и абуз, насколько это возможно, только защитив это все не какими-то улучшениями и изменениями нод, а отдав все на криптографию и внутренние особенности сети. </p>
  <h3 id="wNWr">Является ли это интересной штукой, которая может изменить многое в бч? </h3>
  <p id="jY9C">Вопрос сложный, так как уже были старки и зкпсихи со множеством своих идей, космос с вариациями всего, всякие icp. Но сам подход к решению данных проблем может заинтересовать людей с деньгами, а им достаточно собраться в одном месте чтобы создать ажиотаж. А там время покажет(и меиннет).</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@valpaq/shamir_secret_sharing</guid><link>https://teletype.in/@valpaq/shamir_secret_sharing?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=valpaq</link><comments>https://teletype.in/@valpaq/shamir_secret_sharing?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=valpaq#comments</comments><dc:creator>valpaq</dc:creator><title>Shamir Secret Sharing</title><pubDate>Tue, 10 Jan 2023 22:40:23 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/5b/d2/5bd29b66-b948-4641-a965-90d44a9d4352.png"></media:content><description><![CDATA[<img src="https://media.geeksforgeeks.org/wp-content/uploads/20200517223104/82B95E52-C8A5-4F6B-A712-95B526A3E9AF.png"></img>В криптографии под &quot;secret sharing&quot; подразумевается алгоритм распределения фрагментов информации между группой людей, чтобы в случае важной необходимости, они могли собраться и восстановить обратно. Звучит сложно, попробую переформулировать]]></description><content:encoded><![CDATA[
  <figure id="QaE2" class="m_column">
    <img src="https://media.geeksforgeeks.org/wp-content/uploads/20200517223104/82B95E52-C8A5-4F6B-A712-95B526A3E9AF.png" width="1195" />
  </figure>
  <p id="e2m2">В криптографии под &quot;secret sharing&quot; подразумевается алгоритм распределения фрагментов информации между группой людей, чтобы в случае важной необходимости, они могли собраться и восстановить обратно. Звучит сложно, попробую переформулировать</p>
  <p id="oQRN">По сути это типа мультисига, где у вас есть k/n, всего n частей и k достаточно чтобы подписать (или узнать в нашем случае) секретную информацию. </p>
  <h3 id="jiLT">Пример для маленьких<br /></h3>
  <figure id="1qKj" class="m_retina">
    <img src="https://thumbor.forbes.com/thumbor/fit-in/900x510/https://www.forbes.com/advisor/wp-content/uploads/2022/06/solana_logo.jpeg.jpg" width="450" />
  </figure>
  <p id="G2zc">Допустим,  у нас есть секретное слово solana (не очень хорошее, но такая фантазия больная). Можем сделать простейшее разделение на 6 слов и разделить между 6 людьми:</p>
  <p id="uVg6">s?*, ?o*, ??l*, ???a*, ????n*, ?????a*</p>
  <p id="OTqH">В этой нашей схеме слово простое и короткое, получив 3 или 4 буквы и зная идею, можно быстро подобрать.</p>
  <p id="7scz">Можно добавить усложнение, пусть там все эти символы представлены в виде цифирок ascii и существует HE (Homomorphic encryption). Так уже схема чуток лучше, но 6 цифр и примерное понимание больной фантазии автора дают возможность подобрать.</p>
  <h2 id="UN5c">Shamir&#x27;s Secret Sharing Scheme</h2>
  <p id="meYP">И тут на сцену выходит невероятно продуктивный Шамир, отец кучи всего в криптографии, и в 1979 году выдает SSS со следующими параметрами:</p>
  <ol id="y9Wy">
    <li id="iH6o">Разбивая информацию на n частей, вам будет достаточно лишь k чтобы восстановить ее</li>
    <li id="hsOp">Если данных недостаточно (Не k известно, а k-1), то не восстановить</li>
    <li id="ad3Z">Другие недостающие параметры не подобрать просто так (если конечно там не слова из словаря с пробелами между ними, тогда есть шансы), только изначальный владелец знает</li>
  </ol>
  <p id="qNqX"></p>
  <h2 id="rVAR">Принцип работы Вундер Вафли</h2>
  <figure id="C6sT" class="m_column">
    <img src="https://img3.teletype.in/files/2e/ba/2ebaaec3-26a3-40ee-97cd-42c7cd5b2928.png" width="1221" />
  </figure>
  <p id="aKRc">Основа основ множества криптографических алгоритмов есть Lagrange Interpolation. Что это такое: </p>
  <p id="HQyF">Есть у нас 1 точка, ладно.</p>
  <p id="jmbs">Есть две точки, построим прямую (y = ax + b).</p>
  <p id="R9O8">Есть три точки, построим параболу (y = ax^2 + bx + c)</p>
  <p id="UxdE">Есть три точки, есть четыре точки и т.д.</p>
  <p id="rlGN">Идея в том, что мы можем построить многочлен минимальной степени (из двух точек можно и 3-4 сделать степень, но точности не добавит), принимающий заданные значения в заданном наборе точек.</p>
  <p id="425l">Для примера:</p>
  <p id="zehI">Есть у нас две точки: (0,0), (1,1). Можно по формулам геометрии 8 класса посчитать и построить прямую, а можно увидеть что y=x. Вот наша &quot;кривая&quot; прямая линия с максимальной степенью 1. А также можно увидеть, что сюда подходит y=x^2, y=x^3, .. y=x^n, а также вот эти все и их в итоге можно построить сколько угодно, но начиная со 2 максимальной степени. С минимальной = 1 только один, y=x.</p>
  <figure id="jdxQ" class="m_column">
    <img src="https://img2.teletype.in/files/1d/2a/1d2afbb3-ebdd-4d22-a2e4-3363bd047dbd.png" width="1699" />
  </figure>
  <p id="tBMk">Пока звучит легко, да? Но не сильно связано с нашей секретной задачей спрятать по всему миру нашу seed-phrase с 0.01 битком, согласен.</p>
  <h3 id="JY6r">Основная идея</h3>
  <p id="MGA3">Пусть у нас есть какая-то кривая, допустим y=x^2+x+1 (называется парабола)</p>
  <ol id="2FK3">
    <li id="Ehmb">Чтобы нам ее построить, нам нужно иметь как минимум любые три точки, которые на ней лежат</li>
    <li id="sgRg">Если у нас есть 4 точки, то мы все равно получим ту же самую кривую</li>
    <li id="OMis">Но если у нас их недостаточно, то мы не построим ее и не получим секрет</li>
  </ol>
  <p id="0RkP"><br /></p>
  <figure id="EKdq" class="m_column">
    <img src="https://img1.teletype.in/files/c8/28/c82892c6-aef1-4a1a-a5f1-4ec926397cba.png" width="999" />
  </figure>
  <h3 id="ague">Алгоритм</h3>
  <p id="U9cz">Допустим у наш секретный ключ - 4, 5 ключей генерируем, и для расшифровки достаточно любых 3.</p>
  <ol id="2awh">
    <li id="sH6H">Создаем полином y = a0 + a1*x + a2*x^2 (из k точек строится k-1 степень полином)</li>
    <li id="SSgQ">Пусть a0 - наш секрет = 4, a1 - случайное - 2, a2 - случайное - 1</li>
    <li id="nGOq">Генерируем из него 5 точек (1, 7), (2, 12), (3, 19), (4, 28), (5, 39). </li>
    <li id="NdVK">Поздравляю, вы чудесны, вы получили какие-то рандомные точки, которые можете кому-то разослать (желательно чтобы эти люди не сразу же восстановили ваш секрет).</li>
  </ol>
  <p id="brCv">Как же по ним восстановить?</p>
  <p id="zHYW">Можно через лагранжа считать тут формулки, но тогда слишком много текста, порисуем картиночки</p>
  <p id="8ncO"><a href="https://www.desmos.com/calculator/kqi9wezbvx" target="_blank">https://www.desmos.com/calculator/kqi9wezbvx</a> тут все рисуночки</p>
  <p id="j62f">Имея 3 точки, мы получаем следующую кривую</p>
  <figure id="sMCz" class="m_column">
    <img src="https://img2.teletype.in/files/d8/9f/d89f584d-8b9b-417e-a8be-065257de30f8.png" width="676" />
  </figure>
  <p id="Rb1X">(там сверху есть все вычисления, если вдруг кому-то интересно по ссылке)<br />и вот снизу видим нашу точку<br /></p>
  <figure id="gPfb" class="m_original">
    <img src="https://img1.teletype.in/files/c3/ce/c3ce7c2c-1f34-4776-8ae2-a4e9dd4e2484.png" width="524" />
  </figure>
  <p id="VRVF">наше скрытое число<br />Но что будет, если у нас есть только две точки? (Все варианты перебирать не стал, оставил один)<br /><a href="https://www.desmos.com/calculator/imggo3qwgi" target="_blank">https://www.desmos.com/calculator/imggo3qwgi</a></p>
  <figure id="BN3v" class="m_column">
    <img src="https://img3.teletype.in/files/2c/d2/2cd2d7ff-a5ac-41b1-9a11-44e2f322c2a9.png" width="883" />
  </figure>
  <p id="3lOJ">Теперь вообще другая точка.</p>
  <p id="plDH">А если хоть одна будет лишняя, будет вообще другая кривая. </p>
  <p id="ZtMg">Перебирать в итоге достаточно непросто (на самом деле в бесконечном поле в принципе еще хоть как-то, а в конечном гораздо сложнее, так как разрозненные точки и график скачет туда сюда).</p>
  <p id="B2m4"></p>
  <hr />
  <p id="ODy3">Для тех, кто вдруг решил захотеть потыкать ручками, вот есть код на расте (не бейте если там не фулл тру rustacean)<br /><a href="https://github.com/valpaq/sss" target="_blank">https://github.com/valpaq/sss</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@valpaq/yaos-millionare-problem</guid><link>https://teletype.in/@valpaq/yaos-millionare-problem?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=valpaq</link><comments>https://teletype.in/@valpaq/yaos-millionare-problem?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=valpaq#comments</comments><dc:creator>valpaq</dc:creator><title>Multi party computation ч.1. Что это такое?</title><pubDate>Sun, 29 Jan 2023 20:48:30 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/2e/13/2e131777-ab82-4cb0-8301-bb13e64cb7ef.png"></media:content><description><![CDATA[<img src="https://pub.mdpi-res.com/applsci/applsci-10-04080/article_deploy/html/images/applsci-10-04080-g001.png?1592357789"></img>В последних новостях все чаще можно увидеть странные слова &quot;multi-party computation&quot;, &quot;secure multi-party computation&quot; или кто-то даже слышал про Nillion (о них позже напишу). Что же это такое?
]]></description><content:encoded><![CDATA[
  <p id="4yBI">В последних новостях все чаще можно увидеть странные слова &quot;multi-party computation&quot;, &quot;secure multi-party computation&quot; или кто-то даже слышал про Nillion (о них позже напишу). Что же это такое?<br /></p>
  <figure id="UeBa" class="m_column">
    <img src="https://pub.mdpi-res.com/applsci/applsci-10-04080/article_deploy/html/images/applsci-10-04080-g001.png?1592357789" width="2309" />
  </figure>
  <p id="TsOE">Оказывается, криптография развивается не только в шифровании (синхронном и асинхронном), хэшах и zkp(все более известном). С 1980 годов развивается smpc и сейчас (также как и zkp) скорость и распространение просто ауф. </p>
  <h3 id="6wv8">Что это такое и зачем? </h3>
  <p id="tqlx">Это раздел методов, позволяющих множеству (или двум, тут интересное различие) людям/компаниям/государствам вычислить значение функции, используя общие входные данные, не делясь ими друг с другом. Звучит муторно, давай примеры:</p>
  <ol id="kmut">
    <li id="afeS">Tesla и Waymo хотят обучить свои нейроночки на совместных данных, дабы машинки летали по дорогам, при этом не делясь ими друг с другом</li>
    <li id="33mb">Электронное (честное и интимное) голосование, где все хотят за кого-то проголосовать и не раскрывать друг с другом</li>
    <li id="xqKJ">Электронные аукционы </li>
    <li id="xaz4">Хранение и работа с данными, которые достаточно сенситив (например длина члена)</li>
  </ol>
  <p id="nxgM">При этом все начиналось достаточно с простой задачи.</p>
  <h3 id="goLR">Есть три миллионера, как им посчитать средний доход, не раскрывая никому полностью свои цифры?</h3>
  <figure id="3jRp" class="m_retina">
    <img src="https://m.media-amazon.com/images/M/MV5BMmYwYzY4YWYtYjQzNC00ZmExLWFmMDgtNjdjMDU0NTg2NTdhXkEyXkFqcGdeQXVyNTU0ODMwOTg@._V1_.jpg" width="500" />
  </figure>
  <p id="1DFP">...Ладно, задача достаточно простая, в реальности она другая, но нужно сначала разобраться с этой.</p>
  <p id="iKgU">Средний доход есть сумма / количество, а значит им нужно как-то случайно разбить (используя и 0 и отрицательные числа, в зависимости что попадется) размеры их дохода между друг другом, а потом сложить и разделить на 3. </p>
  <p id="qBgx">Идея в том, что каждый отправляет два случайных числа двум другим, а себе оставляет разницу, чтобы в итоге получить свой доход. И получается все легко и просто.</p>
  <p id="NARD">Выглядит громоздко, да, можно упростить решение:</p>
  <p id="1WyN">Один из трех берет калькулятор и добавляет к своему доходу случайное число. Потом передает его дальше. Двое остальных добавляют свои доходы, и потом первый вычитает это случайное число и делит на 3. Таким образом был изначальный сдвиг, и никто ничего не запомнил.</p>
  <p id="4C6Y">Теперь как звучала изначально задача:</p>
  <h3 id="YMeH">Есть два миллионера. Нужно проверить, богаче ли один другого, не разглашая цифр друг с другом или с третьей стороной.</h3>
  <figure id="N7iE" class="m_column">
    <img src="https://www.researchgate.net/profile/Patricia-Sousa-3/publication/320290997/figure/fig1/AS:618851175768064@1524557026126/Millionaires-problem.png" width="850" />
  </figure>
  <p id="yx5D">Так как задача является базовой, то имеет огромное количество решений, с самой разной сложностью. Есть как криптографические с PHE, так и для детишек. Сначала разберем для детишек.</p>
  <ol id="LhqZ">
    <li id="gXq1">Пусть Alice получает 40 млн, а Bob 30</li>
    <li id="6yAb">Тогда Alice купит коробки с замком и дыркой как у копилки, нарисует поверх каждой цифры в млн (10, 20, 30, 40, 50,.. 25 там, главное в диапазоне).</li>
    <li id="CJBh">И выкинет ключи ото всех коробок, кроме той, где указано его количество денег. (В принципе может продемонстрировать Bob&#x27;у, что ключ один (главное чтобы по нему нельзя было коробку идентифицировать)).</li>
    <li id="x6iR">Bob же сделает следующее: Пройдет по всем коробкам и опустит листики, внутри которых написано Да или Нет, в зависимости от того, сколько он получает и сколько на коробке.</li>
    <li id="Ct64">После этого, он уходит, подходит Alice и проверяет свою коробку (ведь больше никакие не может). И там либо Да, либо Нет, а значит либо они получают одинаково, либо нет, но непонятно кто больше и насколько.</li>
  </ol>
  <p id="8Est">Проблем у данного решения несколько, это коробки и поочередность взаимодействия с ними, но это не главное в нем.</p>
  <p id="QjWO"></p>
  <p id="cChh">Один из сотни криптографических способов (выбрал из-за простоты понимания):</p>
  <figure id="MGYz" class="m_column">
    <img src="https://img1.teletype.in/files/cf/31/cf31c2dc-789f-4aa6-a0f2-adf3ac1845ca.png" width="1625" />
  </figure>
  <p id="eBzt">Но для начала нужно объяснить вкратце еще одно популярное направление Homomorphic encryption. По сути, это Layer для чисел (шифрование), позволяющий делать такие же операции, как и с обычными числами, без нарушения их свойств или формата. Но при этом если a&gt;b, то не обязательно будет f(a) &gt;f(b), иначе смысла в схеме не будет особого.</p>
  <p id="h2lA">Зачем же она нужна нам тут? Она позволяет проводить следующие операции<br />(под f^(-1) я подразумеваю расшифрование, под f шифрование)</p>
  <ol id="XAD0">
    <li id="OKYw">Мы можем зашифровать и расшифровать чиселку: a = f^(-1) (f(a))</li>
    <li id="Dcwb">Мы можем складывать в ней и получим идентичные значения при дешифровании (важное условие):<br />a - b = f^(-1) (f(a) - f(b)</li>
    <li id="xNJN">Но также мы можем сделать следующую важную штуку:<br />f(a) + f(b) = f(a+b)<br />Тогда по сути a + b = f^(-1) (f(a) + f(b)) = f^(-1) (f(a+b))</li>
  </ol>
  <p id="K5GP">Тогда сама схема выглядит следующим образом:</p>
  <ol id="jl7R">
    <li id="9cPd">Есть Алиса и число a, есть Боб и число b</li>
    <li id="kSyI">Пусть у Боба есть эта схема, он знает как зашифровать и расшифровать. Боб считает f(a) и отправляет Алисе, вместе со схемой.</li>
    <li id="BlLK">Алиса придумывает случайное число r и считает V = (f(a) - f(b)) (+) f(r)<br />(+) это Xor. Функция делает побайтовое следующие действия:</li>
    <ol id="tnWf">
      <li id="niT8">Если битик а и битик б равны, то bit_a (+) bit_b = 0</li>
      <li id="VjbD">Иначе bit_a (+) bit_b = 1</li>
    </ol>
    <li id="qFeU">Боб расшифрует, получает (a-b) (+) r и отправляет самый левый битик. Этот битик хранит информацию о знаке (a-b) (+) r.</li>
    <li id="5Ed1">Алиса проводит еще разок Xor битика, полученного от боба и самого левого битика от r и если 0, то a&gt;b, иначе наоборот.</li>
  </ol>
  <p id="WZaK">Ничу непонятно, разберем схему с 3 пункта</p>
  <ul id="opP6">
    <li id="cfHY">Если Алиса просто отдаст Бобу f(a) - f(b), то он сможет посчитать это у себя, ведь f(a) - f(b) = f(a-b), а значит f^(-1) (f(a-b)) = a-b и понять сколько зарабатывает Алиса, ничего не сказав ей.</li>
    <li id="zdAK">Зачем нужен xor? чтобы полностью поменять число. Не прибавить, не умножить. Покажу на примере<br />Пусть есть a = 13 и a в битовом формате будет выглядеть так<br />001101 (нулей может быть больше слева, в зависимости от формата)<br />и пусть если число b = 23<br />010111<br />тогда a (+) b  (идем слева направо)</li>
    <ul id="VXQK">
      <li id="vlkp">0 (+) 0 = 0</li>
      <li id="8RDm">0 (+) 1 = 1</li>
      <li id="7XYA">1 (+) 0 = 1</li>
      <li id="C3rj">1 (+) 1 = 0</li>
      <li id="AbM4">0 (+) 1 = 1</li>
      <li id="ZWac">1 (+) 1 = 0</li>
      <ul id="kLqG">
        <li id="Ngnx">Получим число 26</li>
      </ul>
    </ul>
    <li id="RrHZ">Зачем нужны левые битики? в компьютере они представляют собой знаки чисел, и по ним мы ориентируемся.</li>
    <li id="GT0n">Почему же Боб просто не поймет битик? а он не знает наше случайное число, вдруг у него тоже 1 стоит там, тем самым схема безопасна.</li>
  </ul>
  <p id="KLlz"></p>
  <hr />
  <p id="r7du">Если вдруг кто-то заинтересовался кодом, то вот он. <a href="https://github.com/valpaq/yao-s-milltionare-phe" target="_blank">https://github.com/valpaq/yao-s-milltionare-phe</a></p>
  <hr />
  <p id="I2Pt">Если вдруг кто-то заинтересовался, почему же FHE такой клевый, раз туда сюда чиселки можно и все секурно, то вот ответ почему.<br /><strong>Да, это опенсорс штука, не те размеры чисел которые интересуют, но</strong></p>
  <figure id="8crt" class="m_original">
    <img src="https://img4.teletype.in/files/fa/b3/fab3783a-313d-4fe3-88cb-b703da6bcdaf.png" width="726" />
  </figure>
  <p id="7Mj6">197 секунд заняла настройка изначальных параметров на моем компуктере, для чисел u16<br />а также все вычисления крайне долгие и мощностей пока не хватает под них в нашем мире)<br />Keep building...</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@valpaq/simple-srp-protocol</guid><link>https://teletype.in/@valpaq/simple-srp-protocol?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=valpaq</link><comments>https://teletype.in/@valpaq/simple-srp-protocol?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=valpaq#comments</comments><dc:creator>valpaq</dc:creator><title>ZKP не только в криптовалюте. Часть 1</title><pubDate>Sun, 23 Oct 2022 12:48:41 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/a7/17/a717d76e-2b48-497b-b985-d7e0b0ae199d.png"></media:content><description><![CDATA[<img src="https://www.altoros.com/blog/wp-content/uploads/2019/01/zero-knowledge-proof-blockchain-cryptography-zkp.gif"></img>Писать про Zero knowledge proof всегда тяжело, ведь какой нибудь plonk из крипты понять не каждый сможет, тем более описать простым языком. При этом сам zkp есть идея, имеющая определенные необходимые условия, при этом оставляющая реализацию на выбор.]]></description><content:encoded><![CDATA[
  <figure id="ITO9" class="m_original">
    <img src="https://www.altoros.com/blog/wp-content/uploads/2019/01/zero-knowledge-proof-blockchain-cryptography-zkp.gif" width="640" />
  </figure>
  <p id="BXwS">Писать про Zero knowledge proof всегда тяжело, ведь какой нибудь plonk из крипты понять не каждый сможет, тем более описать простым языком. При этом сам zkp есть идея, имеющая определенные необходимые условия, при этом оставляющая реализацию на выбор.</p>
  <p id="witz">Проблемы начинают возникать еще на подступах, ведь почти весь zkp держится на конечных полях (не путать с конченными), эллиптических кривых и теории групп.</p>
  <p id="oEY0">Вот тут есть неплохой вводный материал для понимания идеи zkp <a href="https://teletype.in/@chpotl/zkp" target="_blank">https://teletype.in/@chpotl/zkp</a>, мы же постараемся погрузиться чуть глубже.</p>
  <h2 id="vuvR">Secure remote password</h2>
  <figure id="XFX3" class="m_original">
    <img src="https://upload.wikimedia.org/wikipedia/commons/f/f1/Mediawiki_1.25_sign_in_form.png" width="553" />
  </figure>
  <p id="8Ahj">Проблема работы с паролями известна давно: компании как хотят хранят ваши пароли, довольно часто в plaintext - обычном тексте, не хешируя. Те же, кто хранят в хэше, часто передают по небезопасному протоколу данные вида (логин, пароль) и существует определенная атака под название MITM - man in the middle. </p>
  <h3 id="sIiN">MAN IN THE MIDDLE</h3>
  <p id="dZ6W">Смысл атаки «Человек посередине (от англ. Man-in-the-middle, MITM) заключается в том, что злоумышленник «пропускает» веб-трафик жертвы (возможно, путем изменения параметров <a href="https://encyclopedia.kaspersky.ru/glossary/dns-domain-name-system-server/" target="_blank">DNS-сервера</a> или файла <a href="https://encyclopedia.kaspersky.ru/glossary/hosts-file/" target="_blank">hosts</a> на машине жертвы) «через себя». В то время пока жертва считает, что работает напрямую, к примеру, с веб-сайтом своего банка, трафик проходит через промежуточный узел злоумышленника, который таким образом получает все отправляемые пользователем данные (логин, пароль, ПИН-код и т. п.).</p>
  <p id="OKBk">Определение взято отсюда - <a href="https://encyclopedia.kaspersky.ru/glossary/man-in-the-middle-attack/" target="_blank">https://encyclopedia.kaspersky.ru/glossary/man-in-the-middle-attack/</a></p>
  <p id="XQZp">У данной проблемы существует давно решение, которое почти никто не использует - secure remote password.</p>
  <figure id="DjSE" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*XOjmMYVrbHdy_5sdxVGEpQ.png" width="760" />
  </figure>
  <p id="4Kg8">Суть метода в том, что сервер не хранит пароль в отдельном хеше, а еще с определенными модификациями поверх, позволяющими скрыть пароль в момент передачи, делая его недоступным для &quot;человека между&quot;. А также две итерации происходит, никаких non-interactive proofs. При этом метод достаточно простой и даже не нужны эллиптические кривые. Почему никто не использует - это другой вопрос.</p>
  <h2 id="vZpH">Алгоритм srp</h2>
  <h3 id="IeJm">Обозначения</h3>
  <p id="ijli">Соль - случайная строка, нужна для добавления сложности в перебор паролей</p>
  <p id="Mx9J">Хэш функция - криптографическая хэш функция, а-ля всем известные sha256, keccak и т.д.</p>
  <p id="SelK">SRP группа - состоит из одного простого очень большого числа и генератора - конечное поле. </p>
  <p id="dgmE">Verifier - Сгенерированное число в SRP группе, которое будет хранить сервер и в котором спрятан пароль.</p>
  <h3 id="vBzm">Регистрация</h3>
  <ol id="aBCo">
    <li id="OEot">Клиент генерирует случайную строку - соль. Нужна она для того, чтобы было сложнее перебрать пароли по хэшу, используется как приставка.</li>
    <li id="tUPl">Клиент передает логин, пароль и соль в хэш функцию чтобы получить х - временное поле.</li>
    <li id="wo6X">Потом генерирует кое-что, называемое verifier, используя полученный сверху x и SRP группу.</li>
    <li id="zOja">После отправляет verifier, соль и srp группу с юзернеймом на сервер и сервер будет хранить эти данные (username, verifier, salt).</li>
  </ol>
  <h3 id="YxN8">Аутентификация</h3>
  <ol id="fWzJ">
    <li id="YGOH">Клиент</li>
    <ol id="RXAN">
      <li id="bMhI">Отправляет запрос на соль и SRP группу под определенный логин.</li>
      <li id="Pyge">Создает случайное а - приватное, и на основе него A - публичное, уже в SRP группе. Хранит у себя в памяти a, A - отправляет на сервер.</li>
    </ol>
    <li id="Gp6m">Сервер</li>
    <ol id="YSQL">
      <li id="EXF3">Генерирует случайное число b- приватное, а на его основе B публичное, уже в SRP группе (Аналогично с клиентом). Отправляет Соль, SRP группу и B клиенту.</li>
    </ol>
    <li id="POLI">Что происходит</li>
    <ol id="gY4G">
      <li id="6Juv">Пароль не был обменян</li>
      <li id="XKdN">Обменялись публичными ключами А и B.</li>
      <li id="3hGw">Теперь используя разные вычисление (На чем строится весь zk) они должны прийти к одним значениям (в основе которых и используется пароль)</li>
    </ol>
  </ol>
  <h3 id="0hTr">Верификация вычислений</h3>
  <figure id="Pklz" class="m_column">
    <img src="https://miro.medium.com/max/1400/1*2aLWddmwS5U7X1BbY9oOAw.png" width="890" />
  </figure>
  <ol id="GcQ3">
    <li id="QIEO">Клиент проводит вычисления поверх хэша от пароля с солью, используя общий ключ (хэш от A и B) и отправляет результат на сервер</li>
    <li id="GqBF">Сервер проверяет результат и верифицирует его. Если не проходит проверку, то отменяет аутентификацию. </li>
    <li id="pbSZ">Если же все успешно, то отправляет клиенту другие вычисления поверх пароля и уже с полученным результатом от клиента.</li>
    <li id="JDZf">Клиент проверяет полученные данные и может удостовериться, что это тот сервер.</li>
  </ol>
  <p id="oD29">В итоге они проверили друг друга, совершили небольшое количество итераций и могут использовать общий ключ, полученный от A и B, как симметричный ключ.</p>
  <p id="8tpa"></p>
  <p id="GlMy">Вот тут есть реализации на вики <a href="https://en.wikipedia.org/wiki/Secure_Remote_Password_protocol#Implementations" target="_blank">https://en.wikipedia.org/wiki/Secure_Remote_Password_protocol#Implementations</a></p>
  <p id="msxc">Вот тут моя на Rust, склоненная от другого проекта <a href="https://github.com/valpaq/srp6-rs" target="_blank">https://github.com/valpaq/srp6-rs</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@valpaq/Solana101</guid><link>https://teletype.in/@valpaq/Solana101?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=valpaq</link><comments>https://teletype.in/@valpaq/Solana101?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=valpaq#comments</comments><dc:creator>valpaq</dc:creator><title>Solana 101</title><pubDate>Mon, 17 Oct 2022 17:08:41 GMT</pubDate><description><![CDATA[<img src="https://qph.cf2.quoracdn.net/main-qimg-604513a062d18627bd3d40b04c34b6ed-lq"></img>Привет, эта статья есть небольшой сборник ответов на те вопросы, которые могут возникнуть у людей, интересующихся соланой.]]></description><content:encoded><![CDATA[
  <p id="VlLK">Привет, эта статья есть небольшой сборник ответов на те вопросы, которые могут возникнуть у людей, интересующихся соланой.</p>
  <h2 id="InLX">Почему солана падает</h2>
  <figure id="TPzg" class="m_retina">
    <img src="https://qph.cf2.quoracdn.net/main-qimg-604513a062d18627bd3d40b04c34b6ed-lq" width="301" />
  </figure>
  <p id="UirV">На этот вопрос ответа нет, кроме негодования в сторону лидеров/валидаторов (а это обычно заметно по лидеру, ведь сеть порой отсекается на пол часа), а также кода самой соли (тут обычно надолго).</p>
  <h2 id="UKoy">Архитектура соланы и пох</h2>
  <figure id="slR7" class="m_original">
    <img src="https://miro.medium.com/max/1400/1*jzdjVifAlC9Tr8-PbdQeEw.png" width="960" />
  </figure>
  <p id="frft">Архитектура соланы есть измененный PoS с добавлением времени. Работает следующим образом:</p>
  <ol id="dmdq">
    <li id="2RLM">В каждый момент времени у нас есть лидер - валидатор, который в определенный момент не проверяет транзы, а присваивает им время и рассылает по bft (byzantine fault tolerance) другим валидаторам на проверку</li>
    <li id="T4aT">Зачем он присваивает время? С присвоением времени мы получаем общую синхронизацию всех транзакций, при этом лидер не обязан валидировать транзы.</li>
    <li id="qKVQ">Этим временем, которое присваивает лидер, можно руководствоваться в блокчейне (Но аккуратно, все помнят шифт)</li>
    <li id="EHgn">Сам же лидер меняется раз в несколько блоков, и вы всегда знаете кто будет следующим.</li>
  </ol>
  <p id="3s8D">У этой системы есть свои проблемы:</p>
  <ol id="ftX9">
    <li id="IhGM">Лидер может упасть, тем самым затормозив весь бч</li>
    <li id="z5an">Лидера могут подудосить, а значит вот пинг в 60 сек + и высокое количество недолетевших транз</li>
    <li id="sMnh">Раз ты лидер, ты можешь менять порядок транз в блоках (пусть и в течение малого количества блоков (о чем особо никто не говорит)) то есть mev возможен, если вы держите много валидаторов</li>
  </ol>
  <p id="T0GV"></p>
  <h2 id="Dtl7">Эллиптическая кривая</h2>
  <p id="ibiF">Чтобы быстренько вспомнить/понять что такое ecdsa в общем, вот <a href="https://teletype.in/@ortomich/ECDSA_fast" target="_blank">https://teletype.in/@ortomich/ECDSA_fast</a></p>
  <p id="FL5T">У соланы же она немного отличается и называется ed25519 и выглядит следующим образом и находится она в поле 2^255-19. </p>
  <figure id="ijzc" class="m_retina">
    <img src="https://miro.medium.com/max/1400/1*wlo5HWfoqjU6QmWIJlbN4A.jpeg" width="677.5" />
  </figure>
  <p id="wiIv">Но в итоге выглядит она вот так, ведь работаем мы в целых числах (размеры гораздо больше и точек в разы больше, но это для примера)</p>
  <figure id="r7pL" class="m_original">
    <img src="https://www.mathworks.com/matlabcentral/mlc-downloads/downloads/320650a2-83ad-4799-9b80-527555fb5ffb/207d2632-5a54-4b93-9f2f-35eff0e72d64/images/screenshot.png" width="300" />
  </figure>
  <p id="qqGV">Этот вид эллиптической кривой называется видом Монтгомери. </p>
  <p id="CtSg"></p>
  <h2 id="uw2G">Что такое PDA</h2>
  <figure id="fyo2" class="m_column">
    <img src="https://solanacookbook.com/assets/pda-curve.7c0b9307.png" width="1977" />
  </figure>
  <p id="GfoF">Program derived address - Это такие публичные адреса в сети Солана, которые не лежат на эллиптической кривой (Все эти белые места на картинке сверху). Из-за того, что они не лежат на кривой, у них нет приватника, их не получить таким образом. </p>
  <p id="7gvM">Генериуется они следующим образом:</p>
  <ol id="iItg">
    <li id="TUUG">У вас есть какой либо публичный ключ, лежащий на эллиптической кривой.</li>
    <li id="qevW">Вы добавляете определенный сид </li>
    <li id="ZlU7">В итоге получаете публичный адрес - хэш от сида и публичного ключа.</li>
  </ol>
  <p id="6t0W">Зачем они нужны</p>
  <ol id="9Ln1">
    <li id="gXor">В солане перевод токенов идет с токен аккаунта на другой токен аккаунта. Они хранят конкретный токен и связаны с основным аккаунтом. При этом все они отдельные публичные ключи, являющиеся pda. Просто у них есть определенная формула генерирования.<br /><code>[walletAddress.toBuffer(), TOKEN_PROGRAM_ID.toBuffer(), tokenMintAddress.toBuffer()], SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID </code>При этом spl_ssociated_token_account и token_program_id это солановские смарт контракты. А walletAddress есть адрес пользователя, которому создается новый ассосиэйтед, а tokenMintAddress есть сам минт токена.</li>
    <li id="k3ju">Для работы в смарт контрактах очень удобно использовать pda, хранящие информацию. Почему? Тебе не нужно мапить данные, хранить на беке, когда ты каждый раз из имеющихся данных можешь сгенерировать новые паблик кей и они всегда будут одинаковые под одинаковые данные и при этом разные для разных (опустим вариант коллизий).</li>
  </ol>
  <p id="eszZ"></p>
  <h2 id="ebDB">Что такое смарт контракт на солане</h2>
  <p id="weZN">Для тех, кто работал с эфиром, очень привычна следующая картина:</p>
  <ol id="IP4c">
    <li id="kRcH">Есть куча функций и эвенты и все видно в etherscan.</li>
    <li id="rHKJ">Куча геттеров (view функций а-ля read в etherscan с помощью которых ты узнаешь разные значения).</li>
    <li id="bpn0">Куча openZeppelin и подобных стандартов.</li>
    <li id="ju03">Контракт хранит кучу инфы - маппинги, маппинги маппингов, переменные, массивы.</li>
    <li id="YhRp">Можешь подавать кучу данных.</li>
    <li id="uuC4">Функции контракта оч похожи на функции в обычном программировании.</li>
  </ol>
  <p id="gf1I">У соланы все немного по другому</p>
  <ol id="LwEv">
    <li id="Sh7d">Эвентов нету (есть подобие эвентов от AnchorLang, но ни у меня, ни у тех с кем я общался, они не отрабатывали нормально). В сол скане контракты не верифицированные.</li>
    <li id="fyOx">Поэтому в солскане нет геттеров, не получишь ты стейты по любым адресам, все через сайт проекта. </li>
    <li id="DClW">Нету стандартов, всю реализацию ft и nft берет на себя сама солана, а ты добавляй ей проверок и все будет хорошо.</li>
    <li id="UyPz">Контракт не хранит информацию, кроме констант и функций. По сути контракт есть бинарник, iso, который просто тыкают транзакции, пихают ему аккаунты и данные, а он их обрабатывает.</li>
    <li id="V2NU">Не можешь подавать кучу данных и есть ограничения по &quot;газу&quot;. Во первых у тебя каждая транзакция ограничена 1232 байта, дальше как хочешь. В них нужно поместить аккаунты ( адреса на солане) и данные. Во вторвых есть ограничения по размеру самих вычислений (200к computational units), благо сейчас можно увеличить размер, доплатив коммиссии.</li>
    <li id="eRBm">Функции контракта есть смесь: Н-ное количество подаваемых аккаунтов, у каждого из которых своя цель. </li>
    <ol id="tpuZ">
      <li id="Wz5k">Есть те, кто подписывают транзакцию и платят комиссии</li>
      <li id="Gfes">Есть те, которые создаются и либо становятся токен аккаунтами или чем-нибудь еще, либо заполняются информацией для вычислений (да, вся информация по каждому юзеру хранится на других аккаунтах)</li>
      <li id="gvUI">Есть необходимые аккаунты, по сути являющимися адресами других програм: token_program_id- для проведения транзакций токена, system_program - для проведения транзакций соланой, rent - для создания аккаунтов, associated_token_account - для создания ассосиэйтед аккаунтов, именно их инициализации.</li>
    </ol>
  </ol>
  <h2 id="JHD9">Некоторые фишки Соланы</h2>
  <ol id="2YEI">
    <li id="kNKX">В солане, как и в эфире, есть апрув, при этом апрув в солане позволяет сделать некоторые вещи над аккаунтами</li>
    <li id="pZQ6">Ты можешь поменять authority над чужим аккаунтом, если у тебя есть апрув. Что это значит: Есть Вася, у Васи есть нфт и лежит она на ассосиэйтед токен аккаунте (формула генерации была сверху). Он запускает транзу с твоим контрактом, а ты под шумок берешь апрув у него и берешь владение над его аккаунтом. (эх, сладкое время было раньше, когда фантом не показывал даже апрув). Владение, по сути, дает тебе право использовать его аккаунт. Он останется быть ассосиэйтед к тому же минту, но уже ты являешься его по сути владельцем. Но так как адрес его не меняется, то если на аккаунте было 0 и кто-то решил отправить человеку, и не проверять authority на адресе, то нфт или токены получаешь ты) и сразу выводишь себе.</li>
    <li id="4Cw5">А также, кроме setAuthority, есть еще функция freezeAuthority. Она позволяет заморозить токен аккаунт. Зачем это надо? Например если хочешь оставить нфт на аккаунте у юзера, ведь тогда он остается authority (что есть хорошо для дискорда), при этом она никуда не отправляется (что хорошо для дискорда), при этом при всем юзер ничего с ней сделать не может (даже дважды застейкать или что-то подобное, ведь будет ошибка already frozen).</li>
    <li id="SKar">При этом, если вам нужно, вы можете выпендриться, и создать не associated, а взять приватник, и сделать его своим tokenAccount. Зачем ? это уже другой вопрос.</li>
    <li id="TSI1">Так как смарты в солане по сути своей бинарники, их можно сколько угодно обновлять и стоить это будет недорого. Самое дорогое &quot;обновление&quot; вначале и ты заранее бронируешь размер контракта (Если не указываешь, то берется х2 от размера программы в моменте) и платишь в соланах. Зачем? Потому что программа может расширяться, а размер не бесконечен.</li>
    <ol id="SBh6">
      <li id="YmXZ">При этом есть порой уникумы, считающие что могут закрыть программу и заново задеплоить (это так не работает, программа просто стирается и деньги теряются) (в новостях гуглится)</li>
    </ol>
    <li id="4CKI">При этом изменить размер аккаунта обычного не получится. Его нужно будет закрыть (вернуть бабки), а потом заново можно заполнять.</li>
  </ol>
  <p id="xmpV"></p>
  <h2 id="1FoB">Что такое рент и почему все стоит деняк</h2>
  <p id="a9aL">По сути своей, это плата за существование аккаунта: хочешь наполнить аккаунт информацией - токен аккаунт, данные для займа/торговли - плати. Открывая аккаунт, ты платишь за его размер в соланах, к примеру associatedTokenAccount всегда стоит одинаково - 0.00203928 SOL. Если же аккаунт тебе не нужен, то ты берешь и закрываешь его (есть куча сервисов по закрытию ненужных асосиэйтед токен аккаунтов). Выглядит удобно и комфортно. </p>
  <p id="ypcI">Пока ты не закроешь используемый аккаунт, и если в смарте это не предусмотрено (Ведь ты же только застейкал с него или что-то подобное, не будешь же ты закрывать его...), то транзакция будет падать, ведь токен аккаунт не существует. Поэтому просьба, не спешите с закрытием, и знайте какие закрываете.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@valpaq/montgomery-ladder</guid><link>https://teletype.in/@valpaq/montgomery-ladder?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=valpaq</link><comments>https://teletype.in/@valpaq/montgomery-ladder?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=valpaq#comments</comments><dc:creator>valpaq</dc:creator><title>Непривычное быстрое возведение в степень</title><pubDate>Fri, 07 Oct 2022 20:38:08 GMT</pubDate><description><![CDATA[Обычно, все возводят число в степень бинарно, попробуем сделать это изощреннее.]]></description><content:encoded><![CDATA[
  <p id="wHNM">Обычно, все возводят число в степень бинарно, попробуем сделать это изощреннее.</p>
  <h3 id="vr8v">Бинарное возведение в степень, которому все учат</h3>
  <p id="OTCW">У нас есть число, допустим 7. Нам его нужно возвести в степень 19, по модулю 1024, к примеру. Как оно обстоит:</p>
  <ol id="pdUy">
    <li id="IBKJ">У нас изначально есть переменная, хранящая такое же значение, как и база для возведения в степень, и отдельная переменная, изначально равная 1.</li>
    <li id="5Aal">Идем по битам сначала степени.</li>
    <li id="29ID">Если в бите стоит 1, то мы умножаем финальное число на переменную. Если 0, то пропускаем.</li>
    <li id="5s5q">После условия мы умножаем базовое число само на себя, убираем последний бит у степени (мы его использовали только что) и начинаем новую итерацию.</li>
  </ol>
  <p id="VAih">Выглядит оно следующим образом</p>
  <pre id="37aD">def binpow(base, power, mod) :
    res = 1
    base = base % mod
    while power ! = 0 :
        if power &amp; 1:
            res = res * base % mod
        base = base * base % mod
        power &gt;&gt; = 1
    
    return res;
</pre>
  <p id="Pjgd">В чем удобство данного алгоритма? Он достаточно быстрый. Для возведения в степень 19 - 10011, мы проделаем всего 5 итераций циrла, O(LogN). </p>
  <p id="OP6q">Максимально простое представление:</p>
  <p id="DNvZ">7 ^ 19 mod 1024 = 7^1 * 7^2 *7^16 - в сумме степени дают 19, и это как раз что нам надо.</p>
  <p id="nnR7">В чем же проблема данного алгоритма? Если мы будем смотреть по тактам, то легко можем понять что происходит внутри. Из-за наличия условия, где происходят самые большие вычисления, алгоритм не является безопасным на аппаратном уровне: либо два умножения (одно из которых гораздо сложнее другого) и сдвиг, либо одно простое и сдвиг.</p>
  <p id="VUZz">И тут появляется Монтгомери и предлагает свою лесенку</p>
  <p id="1Uh3"></p>
  <h3 id="9oza">Лестница Монтгомери</h3>
  <p id="vK9v"></p>
  <p id="9CjY">В чем основная идея лестницы? В том, что умножения происходят также и если условие не выполняется. Что это дает? Постоянно происходят разные вычисления, сложно понять что происходит извне (да, в последние годы были исследования уязвимостей и там находили проблемы, но нам важна идея сейчас и понимание), а также эта лесенка применяется в разных кривых как быстрый способ вычисления.</p>
  <p id="0WPi">Как выглядит код:</p>
  <pre id="qh2W">def mont_ladder(base, power, mod):
    power_bin = format(power, &#x27;b&#x27;)

    first = 1
    second = base % mod

    for i in power_bin:
        if i == &quot;0&quot;:
            second = (first * second) % mod
            first = pow(first, 2, mod)
        else:
            first = (first * second) % mod
            second = pow(second, 2, mod)

   return first
}</pre>
  <p id="KcE1">Думаю проще будет показать на примере вычислений:</p>
  <ol id="HNyf">
    <li id="UZh6">base = 7, power = 19, mod = 1024</li>
    <li id="2E55">x = 1, y = 7</li>
    <li id="5tbY">pow_bin = 10011</li>
    <li id="BHKF">заходим в цикл</li>
    <ol id="SEdf">
      <li id="BDmg">i == 1<br />x = 1 *7 mod 1024 = 7<br />y = 7 * 7 = 49</li>
      <li id="BoSC">i == 0<br />y = 7*49 mod 1024=343<br />x = 7 * 7 = 49</li>
      <li id="PoEX">i == 0<br />y = 343*49 mod 1024 = 423<br />x = 49 * 49 = 353</li>
      <li id="SeCS">i == 1<br />x = 353*423 mod 1024 = 839<br />y = 423*423 mod 1024 = 753</li>
      <li id="Kd8T">i == 1<br />x = 839*753 mod 1024 = 983<br />y = 753*753 mod 1024 = 737</li>
    </ol>
  </ol>
  <p id="uVjD">Получили x = 983, это и есть ответ. </p>
  <p id="X8aQ">7^19 = 11 398 895 185 373 143 % 1024 = 983.</p>
  <p id="TD5l"></p>
  <p id="jpuV">При всем при этом, лесенка монтгомери не всегда выдает ответ на x, порой она дает правильные значения на втором из оперируемых переменных при возведении в степень</p>
  <p id="ufJm"></p>
  <p id="9CsJ"></p>
  <h3 id="5v1N">Это все хорошо, но зачем оно нам?</h3>
  <p id="YzC9">Понадобится позже для понимания того, как происходят вычисления в эллиптических кривых, важность понимания постоянных вычислений (не пропуская вычисления если условие не совпадает, что важно для криптографии) и важность </p>

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