<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Laruh Development Presents</title>
    <description>The latest articles on Forem by Laruh Development Presents (@laruh).</description>
    <link>https://forem.com/laruh</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1938844%2F3fd7a7e2-a230-4f87-9557-0b3da59670c9.png</url>
      <title>Forem: Laruh Development Presents</title>
      <link>https://forem.com/laruh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/laruh"/>
    <language>en</language>
    <item>
      <title>Что нового в Rust 1.92 beta: LLVM 20 и послабление E0719</title>
      <dc:creator>Laruh Development Presents</dc:creator>
      <pubDate>Thu, 27 Nov 2025 11:43:40 +0000</pubDate>
      <link>https://forem.com/laruh/chto-novogho-v-rust-192-beta-llvm-20-i-poslablieniie-e0719-3639</link>
      <guid>https://forem.com/laruh/chto-novogho-v-rust-192-beta-llvm-20-i-poslablieniie-e0719-3639</guid>
      <description>&lt;p&gt;Смотрю, что завезли в Rust 1.92.0 beta (релиз 11 декабря 2025) &lt;a href="https://releases.rs/docs/1.92.0/" rel="noopener noreferrer"&gt;https://releases.rs/docs/1.92.0/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Что зацепило взгляд:&lt;/p&gt;

&lt;h3&gt;
  
  
  Минимальный LLVM 20
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/rust-lang/rust/pull/145071" rel="noopener noreferrer"&gt;https://github.com/rust-lang/rust/pull/145071&lt;/a&gt;&lt;br&gt;
В компиляторе подняли минимальную поддерживаемую версию внешнего LLVM до 20.&lt;/p&gt;

&lt;p&gt;Если коротко, это значит:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;собирать rustc со старым LLVM 19 уже нельзя;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;официально поддерживаются сборки с LLVM 20 и 21;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Для пользователей rustup это просто ещё один шаг вперёд по части оптимизаций и багфиксов на стороне бэкенда.&lt;/p&gt;

&lt;p&gt;Дальше улучшения в синтаксисе. &lt;/p&gt;
&lt;h3&gt;
  
  
  Allow specifying multiple bounds for same associated item, except in trait objects
&lt;/h3&gt;

&lt;p&gt;PR &lt;a href="https://github.com/rust-lang/rust/pull/146593" rel="noopener noreferrer"&gt;https://github.com/rust-lang/rust/pull/146593&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Этот PR почти полностью снимает ограничение ошибки &lt;strong&gt;E0719&lt;/strong&gt; (An associated type value was specified more than once &lt;a href="https://doc.rust-lang.org/stable/error_codes/E0719.html" rel="noopener noreferrer"&gt;https://doc.rust-lang.org/stable/error_codes/E0719.html&lt;/a&gt;) и позволяет несколько раз ограничивать один и тот же ассоциированный &lt;strong&gt;элемент трейта&lt;/strong&gt; внутри одного &lt;code&gt;T: Trait&amp;lt;…&amp;gt;&lt;/code&gt;, кроме случая с &lt;code&gt;dyn Trait&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Что раньше было нельзя&lt;/p&gt;

&lt;p&gt;Примеры из описания PR, которые раньше ломались с E0719:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// было запрещено:&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Trait&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Gat&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Gat&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Iterator&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Iterator&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Iterator&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Sync&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Trait&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ASSOC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ASSOC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Trait&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ASSOC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ASSOC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Разрешённые обходы выглядели так:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// обходы:&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Trait&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Gat&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Trait&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Gat&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Iterator&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Iterator&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Iterator&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;     &lt;span class="c1"&gt;// вместо дубля&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Iterator&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Send&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Sync&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Trait&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ASSOC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Trait&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ASSOC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Trait&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ASSOC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;То есть формально всё можно было выразить, но запись становилась более шумной.&lt;/p&gt;

&lt;p&gt;Еще примеры «до» и «после».&lt;/p&gt;

&lt;p&gt;GAT-ы (Generic Associated Types) раньше приходилось "колхозить" вот так:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// раньше приходилось писать так:&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
&lt;span class="k"&gt;where&lt;/span&gt; 
    &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Trait&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Gat&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Trait&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Gat&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c1"&gt;// а можно будет компактнее:&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
&lt;span class="k"&gt;where&lt;/span&gt; 
    &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Trait&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Gat&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Gat&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Пример с trait bounds на ассоциированный тип:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// было:&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;where&lt;/span&gt;
    &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Iterator&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Iterator&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Send&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Sync&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c1"&gt;// а можно будет так:&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;where&lt;/span&gt;
    &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Iterator&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Send&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Sync&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;По смыслу это то же самое, что:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;where&lt;/span&gt;
    &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Iterator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;Iterator&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;Iterator&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Send&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Sync&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Просто теперь можно всё это собрать в одном &lt;code&gt;Iterator&amp;lt;...&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Но для &lt;code&gt;dyn Trait&lt;/code&gt; всё ещё нельзя обойти E0719&lt;/p&gt;

&lt;p&gt;Для &lt;code&gt;dyn Iterator&amp;lt;Item = u32, Item = u32&amp;gt;&lt;/code&gt; и аналогичных &lt;code&gt;dyn Trait&amp;lt;…&amp;gt;&lt;/code&gt; ошибка &lt;strong&gt;E0719&lt;/strong&gt; остаётся. В описании PR есть ссылка на комментарий, где это объясняется:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Types like &lt;code&gt;dyn Iterator&amp;lt;Item = u32, Item = u32&amp;gt;&lt;/code&gt; will continue to be rejected, however. See #143146 (comment) &lt;a href="https://github.com/rust-lang/rust/pull/143146#issuecomment-3274421752" rel="noopener noreferrer"&gt;https://github.com/rust-lang/rust/pull/143146#issuecomment-3274421752&lt;/a&gt; for the reason why.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Если коротко, проблема в следующем:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;generic-bound’ы не создают новый «реальный» тип наподобие &lt;code&gt;dyn Iterator&amp;lt;…&amp;gt;&lt;/code&gt;, а всего лишь накладывают условия на уже существующий тип-параметр.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;А &lt;code&gt;dyn Iterator&amp;lt;…&amp;gt;&lt;/code&gt; — это уже &lt;strong&gt;конкретный тип времени выполнения&lt;/strong&gt; с vtable, layout и &lt;code&gt;TypeId&lt;/code&gt;. Внутри компилятора он хранится как «трейтовый объект + список ограничений на ассоциированные типы».&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;У &lt;code&gt;dyn Trait&lt;/code&gt; все штуки вида &lt;code&gt;Item = ...&lt;/code&gt; входят &lt;strong&gt;в само тождество типа&lt;/strong&gt;: внутренне это «трейтовый объект + список projection bounds». После PR &lt;a href="https://github.com/rust-lang/rust/pull/136458" rel="noopener noreferrer"&gt;https://github.com/rust-lang/rust/pull/136458&lt;/a&gt; компилятор &lt;strong&gt;больше не сливает дубликаты&lt;/strong&gt; этих bounds «потом», на поздних стадиях. &lt;br&gt;
 Если сейчас разрешить записи вроде  &lt;code&gt;dyn Iterator&amp;lt;Item = for&amp;lt;'a&amp;gt; fn(&amp;amp;'a ()), Item = for&amp;lt;'b&amp;gt; fn(&amp;amp;'b ())&amp;gt;&lt;/code&gt;,  то такой тип станет &lt;em&gt;другим&lt;/em&gt; по сравнению с интуитивно эквивалентным  &lt;code&gt;dyn Iterator&amp;lt;Item = for&amp;lt;'c&amp;gt; fn(&amp;amp;'c ())&amp;gt;&lt;/code&gt;, просто потому что список bounds отличается.&lt;/p&gt;

&lt;p&gt;Дополнительно это лезет в разницу между &lt;strong&gt;старым и новым trait solver’ами&lt;/strong&gt;: старый просто берёт первый кандидат для &lt;code&gt;Item&lt;/code&gt;, новый пытается учесть все и слить их, если результат совпадает. При нескольких &lt;code&gt;Item = ...&lt;/code&gt; это может привести к тонким случаям, где старый solver успешно нормализует тип, а новый внезапно видит «лишние» ограничения на лайфтаймы и объявляет неоднозначность.&lt;/p&gt;

</description>
      <category>rust</category>
    </item>
    <item>
      <title>Comprehensive Rust Resource Guide: Official Docs, Books, Cheat Sheets &amp; More</title>
      <dc:creator>Laruh Development Presents</dc:creator>
      <pubDate>Mon, 09 Dec 2024 16:41:29 +0000</pubDate>
      <link>https://forem.com/laruh/comprehensive-rust-resource-guide-official-docs-books-cheat-sheets-more-3lpg</link>
      <guid>https://forem.com/laruh/comprehensive-rust-resource-guide-official-docs-books-cheat-sheets-more-3lpg</guid>
      <description>&lt;p&gt;&lt;strong&gt;UPDATE: 🚀 Rust Resources Hub – Now on &lt;a href="https://github.com/laruh/rust-resources-hub" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt;!&lt;br&gt;
Stay up to date with the latest additions in the GitHub repo!&lt;/p&gt;




&lt;p&gt;Table of Contents&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Official Documentation by rust-lang org&lt;/li&gt;
&lt;li&gt;Open Source Books and Various Sites With Guides&lt;/li&gt;
&lt;li&gt;Exercises&lt;/li&gt;
&lt;li&gt;Podcasts&lt;/li&gt;
&lt;li&gt;Algorithms&lt;/li&gt;
&lt;li&gt;Cheat Sheets&lt;/li&gt;
&lt;li&gt;Serialization&lt;/li&gt;
&lt;li&gt;WebAssembly (Wasm)&lt;/li&gt;
&lt;li&gt;Blockchain&lt;/li&gt;
&lt;li&gt;Interview&lt;/li&gt;
&lt;li&gt;Various Rust Articles and Deep Dives&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Official Documentation by rust-lang org
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/stable/book/" rel="noopener noreferrer"&gt;Rust Book (Stable)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/nightly/book/" rel="noopener noreferrer"&gt;Rust Book (Nightly)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/reference" rel="noopener noreferrer"&gt;Rust Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/nomicon" rel="noopener noreferrer"&gt;The Rustonomicon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/rust-by-example" rel="noopener noreferrer"&gt;Rust by Example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/std/index.html#the-rust-standard-library" rel="noopener noreferrer"&gt;Rust Standard Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/cargo" rel="noopener noreferrer"&gt;Cargo Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/stable/clippy" rel="noopener noreferrer"&gt;Clippy Documentation (Stable)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/nightly/clippy" rel="noopener noreferrer"&gt;Clippy Documentation (Nightly)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/rustc/what-is-rustc.html" rel="noopener noreferrer"&gt;Rust Compiler (rustc)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/1.0.0/style/" rel="noopener noreferrer"&gt;Rust Style Guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/error_codes/E0106.html" rel="noopener noreferrer"&gt;Rust Error Codes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Open Source Books and Various Sites With Guides
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sger/RustBooks" rel="noopener noreferrer"&gt;RustBooks GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rust-lang.github.io/async-book/" rel="noopener noreferrer"&gt;Asynchronous Programming in Rust from rust-lang.github.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/PacktPublishing/Asynchronous-Programming-in-Rust/" rel="noopener noreferrer"&gt;Asynchronous Programming in Rust by Carl Fredrik Samson&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lurklurk.org/effective-rust" rel="noopener noreferrer"&gt;Effective Rust&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nnethercote.github.io/perf-book" rel="noopener noreferrer"&gt;The Rust Performance Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://rust-unofficial.github.io/patterns" rel="noopener noreferrer"&gt;Rust Design Patterns&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rust-unofficial.github.io/patterns/anti_patterns/" rel="noopener noreferrer"&gt;Anti-patterns&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://rust-lang-nursery.github.io/rust-cookbook/" rel="noopener noreferrer"&gt;Rust Cookbook&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rust-lang-nursery.github.io/rust-cookbook/cryptography.html" rel="noopener noreferrer"&gt;Rust Cookbook - Cryptography&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://rust-lang.github.io/api-guidelines" rel="noopener noreferrer"&gt;Rust API Guidelines&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rust-lang.github.io/api-guidelines/checklist.html" rel="noopener noreferrer"&gt;Checklist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;a href="https://rustc-dev-guide.rust-lang.org/" rel="noopener noreferrer"&gt;Rust Compiler Development Guide&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/rust-embedded/book" rel="noopener noreferrer"&gt;The Embedded Rust Book&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/blandger/epub-rust-books" rel="noopener noreferrer"&gt;Official and other Rust books built in EPUB format destined for local reading&lt;/a&gt; Jul 2023&lt;/li&gt;

&lt;li&gt;&lt;a href="https://metanit.com/rust/tutorial/" rel="noopener noreferrer"&gt;(Ru) Руководство по языку программирования Rust by metanit.com&lt;/a&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Exercises
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://practice.course.rs/" rel="noopener noreferrer"&gt;Rust by Practice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rust-lang/rustlings" rel="noopener noreferrer"&gt;Rustlings&lt;/a&gt; This project contains small exercises to get you used to reading and writing Rust code. This includes reading and responding to compiler messages.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rustfinity.com/practice/rust/challenges" rel="noopener noreferrer"&gt;Rustfinity - challenges&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Podcasts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://corrode.dev/podcast/" rel="noopener noreferrer"&gt;Rust in Production podcasts by corrode.dev&lt;/a&gt; Under episodes, you can find a list of links related to the discussion topics.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Algorithms
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://the-algorithms.com/language/rust" rel="noopener noreferrer"&gt;The Algorithms - Rust&lt;/a&gt; Open Source resource for learning Data Structures &amp;amp; Algorithms and their implementation in any Programming Language&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cheat Sheets
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cheats.rs/" rel="noopener noreferrer"&gt;Rust Cheatsheet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Serialization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://serde.rs/" rel="noopener noreferrer"&gt;Serde Documentation&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://serde.rs/derive.html" rel="noopener noreferrer"&gt;Derive&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  WebAssembly (Wasm)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rust-lang.org/what/wasm" rel="noopener noreferrer"&gt;Introduction to WebAssembly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://rustwasm.github.io/docs.html" rel="noopener noreferrer"&gt; Rust and WebAssembly Working Group Docs&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rustwasm.github.io/docs/book" rel="noopener noreferrer"&gt;The Rust Wasm Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rustwasm.github.io/docs/wasm-bindgen" rel="noopener noreferrer"&gt;The &lt;code&gt;wasm-bindgen&lt;/code&gt; Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rustwasm.github.io/docs/wasm-pack" rel="noopener noreferrer"&gt;The &lt;code&gt;wasm-pack&lt;/code&gt; Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rustwasm.github.io/docs/wasm-pack/tutorials/index.html" rel="noopener noreferrer"&gt;The &lt;code&gt;wasm-pack&lt;/code&gt; Book Tutorials&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Blockchain
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://book.cosmwasm.com/" rel="noopener noreferrer"&gt;CosmWasm Book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Interview
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.turing.com/interview-questions/rust" rel="noopener noreferrer"&gt;100 Rust interview questions and answers in 2024&lt;/a&gt; Updated: January 14th, 2024&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zerotomastery.io/blog/rust-interview-questions-and-answers/" rel="noopener noreferrer"&gt;53 Rust Interview Questions + Answers (Easy, Medium, Hard)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coderpad.io/interview-questions/rust-interview-questions/" rel="noopener noreferrer"&gt;Rust Interview Questions for Developers from coderpad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://flakm.github.io/posts/rust_interview_questions" rel="noopener noreferrer"&gt;Simple rust interview questions by flakm&lt;/a&gt; May 8, 2022&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/imhq/rust-interview-handbook" rel="noopener noreferrer"&gt;Rust Interview Handbook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/rust/comments/si0j6v/im_preparing_for_a_rust_interview/?rdt=42762" rel="noopener noreferrer"&gt;Reddit preparing for rust interview thread&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.usebraintrust.com/hire/interview-questions/rust-developers" rel="noopener noreferrer"&gt;Rust Developer Interview Questions from usebraintrust.com&lt;/a&gt; &amp;lt;- I dont like answers here, just keep it as questions example&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Various Rust Articles and Deep Dives
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://gencmurat.com/en/posts/smart-pointers-in-rust/" rel="noopener noreferrer"&gt;Smart Pointers in Rust: A Comprehensive Guide by Murat Genc&lt;/a&gt; 2024-07-03&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/blandger/books-futures-explained" rel="noopener noreferrer"&gt;Futures Explained in 200 Lines of Rust&lt;/a&gt; 2020-04-06: Final draft finished&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aeshirey.github.io/code/2020/12/23/arc-mutex-in-rust.html" rel="noopener noreferrer"&gt;ARC Mutex in Rust by Adam Shirey&lt;/a&gt; 2020-12-23&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cfsamsonbooks.gitbook.io/explaining-atomics-in-rust" rel="noopener noreferrer"&gt;Explaining Atomics in Rust&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cfsamson/articles-atomics-in-rust" rel="noopener noreferrer"&gt;Explaining Atomics in Rust GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gencmurat.com/en/posts/reactor-executer-pattern/" rel="noopener noreferrer"&gt;Reactor-Executor Pattern: A Deep Dive by Murat Genc&lt;/a&gt; 2024-06-11&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cfsamson/examples-minimio" rel="noopener noreferrer"&gt;An example implementation that creates an event queue based on Kqueue, Epoll and IOCP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.howtocodeit.com/articles/ultimate-guide-rust-newtypes" rel="noopener noreferrer"&gt;The ultimate guide to Rust newtypes by howtocodeit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.howtocodeit.com/articles/master-hexagonal-architecture-rust" rel="noopener noreferrer"&gt;Master hexagonal architecture in Rust by howtocodeit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arindas.hashnode.dev/implementing-a-load-balanced-thread-pool-in-rust" rel="noopener noreferrer"&gt;Implementing a load-balanced thread pool in Rust&lt;/a&gt; Feb 3, 2022&lt;/li&gt;
&lt;li&gt;&lt;a href="https://habr.com/ru/companies/timeweb/articles/761398/" rel="noopener noreferrer"&gt;Ru translation of the above article&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.polybdenum.com/2024/12/21/four-limitations-of-rust-s-borrow-checker.html" rel="noopener noreferrer"&gt;Four limitations of Rust's borrow checker&lt;/a&gt; Dec 21, 2024&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>rust</category>
      <category>programminglanguages</category>
      <category>developersguide</category>
    </item>
    <item>
      <title>Заметка из жизни: пример работы тейкера в обновленном атомарном свопе</title>
      <dc:creator>Laruh Development Presents</dc:creator>
      <pubDate>Wed, 04 Dec 2024 16:04:53 +0000</pubDate>
      <link>https://forem.com/laruh/zamietka-iz-zhizni-primier-raboty-tieikiera-v-obnovliennom-atomarnom-svopie-544g</link>
      <guid>https://forem.com/laruh/zamietka-iz-zhizni-primier-raboty-tieikiera-v-obnovliennom-atomarnom-svopie-544g</guid>
      <description>&lt;p&gt;В предыдущем посте &lt;a href="https://dev.to/laruh/chto-takoie-atomarnyie-svopy-3p9o"&gt;Что такое атомарные свопы?&lt;/a&gt; описан один из возможных вариантов реализации протокола атомарного свопа. Этот протокол был разработан и реализован командой &lt;a href="https://komodoplatform.com/" rel="noopener noreferrer"&gt;Komodo Platform&lt;/a&gt;. Если интересно, можете скачать приложение или сбилдить проект из исходного кода и потестить.&lt;/p&gt;

&lt;p&gt;Сейчас идет активная работа над новой версией протокола атомарного свопа — &lt;strong&gt;trading protocol upgrade v2&lt;/strong&gt; (&lt;strong&gt;TPU v2&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;На текущий момент &lt;strong&gt;TPU v2&lt;/strong&gt; поддерживает атомарные свопы для UTXO-монет (в разработке, еще не в продакшене). Это значит, что уже можно обменивать пары монет формата &lt;code&gt;UTXO&amp;lt;-&amp;gt;UTXO&lt;/code&gt; (монета мейкера &amp;lt;-&amp;gt; монета тейкера). Поддержка для EVM-совместимых монет также находится в разработке и появится в ближайшее время.&lt;/p&gt;

&lt;p&gt;Хочу показать &lt;strong&gt;логи&lt;/strong&gt; примера работы &lt;strong&gt;tpu v2&lt;/strong&gt; на стороне тэйкера для пар:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;MARTY &amp;lt;-&amp;gt; SEPOLIA&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SEPOLIA &amp;lt;-&amp;gt; MARTY&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;MARTY&lt;/strong&gt; — это UTXO-монета. &lt;strong&gt;SEPOLIA&lt;/strong&gt; — это монета EVM-совместимой сети.&lt;/p&gt;

&lt;p&gt;Этот пост не является полноценной статьей с детальным разбором процесса — такой материал будет позже (когда-нибудь в прекрасном будущем). Сейчас просто показываю. Рекомендую сначала прочитать предыдущий пост, а затем вернуться сюда.&lt;/p&gt;

&lt;p&gt;Хочу дать пару вводных вопросов на подумать:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Кто первым инициирует своп: мейкер или тейкер?&lt;/li&gt;
&lt;li&gt;Отправляется ли DEX fee отдельной транзакцией? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Помните ниже приведены &lt;strong&gt;логи&lt;/strong&gt; со стороны пользователя, который выступает в роли &lt;strong&gt;тейкера&lt;/strong&gt;. В первом примере основная монета тейкера — EVM-совместимая, а во втором — UTXO.&lt;/p&gt;

&lt;p&gt;Итак &lt;code&gt;MARTY/SEPOLIA&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;· 2024-12-04 12:57:15 +0700 [] lp_ordermatch:3255] Entering the taker_swap_loop MARTY/SEPOLIA with uuid: 26bbcbbb-9d5b-42e0-ba7d-775220dd3be1
04 05:57:17, mm2_main::lp_swap::taker_swap_v2:991] INFO Taker swap 26bbcbbb-9d5b-42e0-ba7d-775220dd3be1 has successfully started
04 05:57:19, coins::eth:2795] INFO get_gas_price…
04 05:57:21, coins::eth:2767] INFO get_addr_nonce…
04 05:57:21, coins::eth:2805] INFO send_raw_transaction…
04 05:57:22, coins::eth:2812] INFO wait_for_tx_appears_on_rpc…
04 05:57:26, mm2_main::lp_swap::taker_swap_v2:1257] INFO Sent taker funding SEPOLIA tx c32dff86aaf180a9ff56bbe682293a6cf4def88bc0d9803c6802b1dc106065e1 during swap 26bbcbbb-9d5b-42e0-ba7d-775220dd3be1
04 05:57:27, coins::utxo::rpc_clients:130] INFO Waiting for tx 9bbe8789bda3fc0870648b1264a16eda0189c8c52f1a9a42e047c5621a2e7e82 confirmations, now 0, required 1, requires_notarization false
04 05:57:37, coins::utxo::rpc_clients:130] INFO Waiting for tx 9bbe8789bda3fc0870648b1264a16eda0189c8c52f1a9a42e047c5621a2e7e82 confirmations, now 0, required 1, requires_notarization false
04 05:57:48, coins::eth:2795] INFO get_gas_price…
04 05:57:49, coins::eth:2767] INFO get_addr_nonce…
04 05:57:50, coins::eth:2805] INFO send_raw_transaction…
04 05:57:51, coins::eth:2812] INFO wait_for_tx_appears_on_rpc…
04 05:57:56, mm2_main::lp_swap::taker_swap_v2:2023] INFO Sent taker funding spend (taker payment spend) SEPOLIA tx 1ed29e7cd56092647a57e1b7fcc80b7bb2933b17a6c4f268a1df18f1a79f3340 during swap 26bbcbbb-9d5b-42e0-ba7d-775220dd3be1
04 05:58:15, mm2_main::lp_swap::taker_swap_v2:1717] INFO Found taker payment spend SEPOLIA tx 9b234933d8b0f720f233689eae28ca274907a50820e320f116bd9f417d934e40 during swap 26bbcbbb-9d5b-42e0-ba7d-775220dd3be1
04 05:58:15, mm2_main::lp_swap::taker_swap_v2:2119] INFO Spent maker payment MARTY tx a8005fc205fd6e374bb6b70eee47bfad16cea2b1b03c8f2225f2c95b888505f9 during swap 26bbcbbb-9d5b-42e0-ba7d-775220dd3be1
04 05:58:15, coins::utxo::rpc_clients:130] INFO Waiting for tx a8005fc205fd6e374bb6b70eee47bfad16cea2b1b03c8f2225f2c95b888505f9 confirmations, now 0, required 1, requires_notarization false
04 05:58:26, coins::utxo::rpc_clients:130] INFO Waiting for tx a8005fc205fd6e374bb6b70eee47bfad16cea2b1b03c8f2225f2c95b888505f9 confirmations, now 0, required 1, requires_notarization false
04 05:58:36, mm2_main::lp_swap::taker_swap_v2:2355] INFO Swap 26bbcbbb-9d5b-42e0-ba7d-775220dd3be1 has been completed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;SEPOLIA/MARTY&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;· 2024-12-04 13:23:11 +0700 [] lp_ordermatch:3255] Entering the taker_swap_loop SEPOLIA/MARTY with uuid: 9a56a3e8-a54a-49b8-a65d-86593e77d504
04 06:23:14, mm2_main::lp_swap::taker_swap_v2:991] INFO Taker swap 9a56a3e8-a54a-49b8-a65d-86593e77d504 has successfully started
04 06:23:16, mm2_main::lp_swap::taker_swap_v2:1257] INFO Sent taker funding MARTY tx 9ff980cfa9574d9280ee9fc1f686ad4b60f5f5ad851bfa2314de14eacee59f62 during swap 9a56a3e8-a54a-49b8-a65d-86593e77d504
+--- 04 06:23:24 -------
| (0:00/43:06) [SEPOLIA] Waiting for confirmations…
· 2024-12-04 13:23:47 +0700 [SEPOLIA] Waiting for confirmations… Confirmed.
04 06:23:47, mm2_main::lp_swap::taker_swap_v2:2023] INFO Sent taker funding spend (taker payment spend) MARTY tx 8501c52432a4f9cd27090841357ded67c6a948f01c1b67bd2ca4b0935a2496d0 during swap 9a56a3e8-a54a-49b8-a65d-86593e77d504
04 06:24:18, mm2_main::lp_swap::taker_swap_v2:1717] INFO Found taker payment spend MARTY tx c3ac45d45cac571068a6237bc8d976195713949b424a95914ba3d2d7d5f04461 during swap 9a56a3e8-a54a-49b8-a65d-86593e77d504
04 06:24:18, coins::eth:2795] INFO get_gas_price…
04 06:24:19, coins::eth:2767] INFO get_addr_nonce…
04 06:24:20, coins::eth:2805] INFO send_raw_transaction…
04 06:24:21, coins::eth:2812] INFO wait_for_tx_appears_on_rpc…
04 06:24:24, mm2_main::lp_swap::taker_swap_v2:2119] INFO Spent maker payment SEPOLIA tx 0bfb6a18f699e12b3063641a64565f53134798610d46b32f9fb63d390630611b during swap 9a56a3e8-a54a-49b8-a65d-86593e77d504
+--- 04 06:24:25 -------
| (0:00/518:46) [SEPOLIA] Waiting for confirmations…
+--- 04 06:24:48 -------
| (0:23/518:46) [SEPOLIA] Waiting for confirmations…
· 2024-12-04 13:24:58 +0700 [SEPOLIA] Waiting for confirmations… Confirmed.
04 06:24:58, mm2_main::lp_swap::taker_swap_v2:2355] INFO Swap 9a56a3e8-a54a-49b8-a65d-86593e77d504 has been complete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>atomicswaps</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>What Are Atomic Swaps?</title>
      <dc:creator>Laruh Development Presents</dc:creator>
      <pubDate>Fri, 16 Aug 2024 16:19:58 +0000</pubDate>
      <link>https://forem.com/laruh/what-are-atomic-swaps-4gkh</link>
      <guid>https://forem.com/laruh/what-are-atomic-swaps-4gkh</guid>
      <description>&lt;h3&gt;
  
  
  Definition
&lt;/h3&gt;

&lt;p&gt;An atomic swap is a cryptocurrency trade that occurs directly between two users, without any intermediaries. These swaps are described as "atomic" because the trade either fully completes—where both parties receive the agreed assets—or fails entirely, with each party retaining their original funds. &lt;/p&gt;

&lt;p&gt;Atomic swaps are executed wallet-to-wallet in a fully peer-to-peer (P2P) manner, ensuring that both traders maintain control of their private keys throughout the entire process, making the exchange significantly more secure than trading on centralized platforms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Introduction to Participants
&lt;/h3&gt;

&lt;p&gt;In an atomic swap, there are two main participants: the &lt;strong&gt;Maker&lt;/strong&gt; (liquidity provider) and the &lt;strong&gt;Taker&lt;/strong&gt; (liquidity receiver). The Maker holds one type of cryptocurrency, while the Taker holds another. The atomic swap process enables them to securely exchange these assets in a decentralized manner without relying on intermediaries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step-by-Step Process
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 0: Market Maker Posts Trade Order&lt;/strong&gt;&lt;br&gt;
Before the swap begins, the Maker posts a trade order on the platform. This step, although not technically part of the atomic swap process, is essential for initiating the swap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Taker Initiates the Swap&lt;/strong&gt;&lt;br&gt;
The atomic swap process begins when the Taker sees the Maker’s offer and accepts it. The Taker pays a protocol fee known as the &lt;strong&gt;DEX fee&lt;/strong&gt;. This fee ensures that the Taker is serious about the trade and prevents spamming of the network. Once the DEX fee is paid, the atomic swap officially starts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Maker Sends Payment (Maker Payment)&lt;/strong&gt;&lt;br&gt;
The Maker then generates a 32-byte secret and creates a hash of this secret. This hash is shared with the Taker, but the secret itself remains unknown to the Taker. The Maker sends the Maker Payment to a secure, temporary holding address. The nature of this address depends on the type of blockchain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;For UTXO-based blockchains (like Bitcoin)&lt;/strong&gt;: The payment is sent to a &lt;strong&gt;P2SH (Pay-to-Script-Hash) address&lt;/strong&gt;. This address is both hash-locked and time-locked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For ETH/ERC20 blockchains&lt;/strong&gt;: The payment is sent to an &lt;strong&gt;etomic-swap smart contract&lt;/strong&gt; that similarly locks the payment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Maker Payment is time-locked to ensure that if the swap is not completed within a set time frame (e.g., 4 hours and 20 minutes for Bitcoin), the Maker can reclaim their funds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Taker Sends Payment (Taker Payment)&lt;/strong&gt;&lt;br&gt;
After seeing that the Maker has sent the Maker Payment, the Taker sends their payment to a similar secure, temporary holding address. The Taker Payment is also hash-locked using the same hash provided by the Maker and time-locked, but with a shorter duration (typically half of the Maker’s time lock).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;For UTXO-based blockchains&lt;/strong&gt;: The Taker Payment is sent to a &lt;strong&gt;P2SH hash/time locked output&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For ETH/ERC20 blockchains&lt;/strong&gt;: The Taker Payment is sent to an &lt;strong&gt;etomic-swap smart contract&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This step ensures that if the Maker does not proceed with the next step, the Taker can reclaim their funds once the shorter time lock expires.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Maker Claims Taker Payment&lt;/strong&gt;&lt;br&gt;
The Maker sees that the Taker has sent the Taker Payment. To claim it, the Maker reveals the 32-byte secret, which is then broadcast to the blockchain network. This action allows the Maker to unlock and transfer the Taker Payment to their own address. Once the secret is revealed, it becomes publicly visible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Taker Claims Maker Payment&lt;/strong&gt;&lt;br&gt;
Finally, the Taker, having observed that the Maker has revealed the secret by claiming the Taker Payment, uses the same secret to unlock the Maker Payment. The Taker then transfers the Maker Payment to their own address, completing the swap.&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;This atomic swap process ensures a secure and trustless exchange of assets between the Maker and the Taker. The use of cryptographic mechanisms such as hash locks and time locks (HTLC protocol) guarantees that the swap will either be completed as agreed, or both parties will retain their original assets if the swap fails. The process operates in a decentralized manner, with no intermediaries involved, making it a highly secure method for peer-to-peer cryptocurrency exchanges.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/laruh/chto-takoie-atomarnyie-svopy-3p9o"&gt;ru version&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>atomicswaps</category>
    </item>
    <item>
      <title>Что такое атомарные свопы?</title>
      <dc:creator>Laruh Development Presents</dc:creator>
      <pubDate>Fri, 16 Aug 2024 16:14:22 +0000</pubDate>
      <link>https://forem.com/laruh/chto-takoie-atomarnyie-svopy-3p9o</link>
      <guid>https://forem.com/laruh/chto-takoie-atomarnyie-svopy-3p9o</guid>
      <description>&lt;p&gt;Атомарный своп (Atomic Swap) — это прямой обмен криптовалютой между двумя пользователями без участия посредников. Такие свопы называются "атомарными" потому, что сделка либо полностью завершается, и обе стороны получают согласованные активы, либо не происходит вовсе, и каждая сторона сохраняет свои первоначальные средства.&lt;/p&gt;

&lt;p&gt;Атомарные свопы выполняются напрямую между кошельками в полностью одноранговом (P2P) формате, что гарантирует, что оба участника сохраняют контроль над своими приватными ключами на протяжении всего процесса. Это делает обмен значительно более безопасным по сравнению с торговлей на централизованных платформах.&lt;/p&gt;

&lt;h3&gt;
  
  
  Кто участвует?
&lt;/h3&gt;

&lt;p&gt;В атомарном свопе участвуют две стороны: &lt;strong&gt;Maker&lt;/strong&gt; (поставщик ликвидности) и &lt;strong&gt;Taker&lt;/strong&gt; (получатель ликвидности). Maker владеет одной криптовалютой, а Taker — другой. Процесс атомарного свопа позволяет им безопасно обмениваться этими активами в децентрализованной среде, без необходимости в посредниках.&lt;/p&gt;

&lt;h3&gt;
  
  
  А вот теперь разберем пример выполнения Атомарного протокола
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Шаг 0: Размещение торгового ордера Maker-ом&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Перед началом свопа Maker размещает торговый ордер на платформе. Этот шаг, хотя и не является частью самого процесса атомарного свопа, необходим для его инициирования.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Шаг 1: Инициация свопа Taker-ом&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Процесс атомарного свопа начинается, когда Taker видит предложение от Maker-а и решает его принять. Taker оплачивает протокольный сбор, известный как &lt;strong&gt;DEX fee&lt;/strong&gt;. Этот сбор гарантирует, что Taker серьезно относится к сделке и предотвращает спам в сети. После оплаты DEX fee процесс атомарного свопа официально начинается.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Шаг 2: Отправка платежа Maker-ом (Maker Payment)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Затем Maker генерирует 32-байтный секрет и создает его хеш. Этот хеш передается Taker-у, однако сам секрет остается неизвестным для Taker-а. Maker отправляет свой платеж (Maker Payment) на безопасный временный адрес хранения. Тип этого адреса зависит от типа блокчейна:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Для блокчейнов на основе UTXO (например, Bitcoin)&lt;/strong&gt;: Платеж отправляется на адрес &lt;strong&gt;P2SH (Pay-to-Script-Hash)&lt;/strong&gt;. Этот адрес защищен хешем и имеет временную блокировку.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Для блокчейнов ETH/ERC20&lt;/strong&gt;: Платеж отправляется на &lt;strong&gt;etomic-swap смарт-контракт&lt;/strong&gt;, который аналогично блокирует платеж.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Платеж Maker-а имеет временную блокировку, которая гарантирует, что если своп не будет завершен в течение определенного периода времени (например, 4 часа и 20 минут для Bitcoin), Maker сможет вернуть свои средства.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Шаг 3: Отправка платежа Taker-ом (Taker Payment)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;После того как Taker видит, что Maker отправил Maker Payment, Taker отправляет свой платеж на аналогичный безопасный временный адрес хранения. Платеж Taker-а также защищен хешем, предоставленным Maker-ом, и имеет временную блокировку, но с более короткой продолжительностью (обычно половина времени блокировки платежа Maker-а).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Для блокчейнов на основе UTXO&lt;/strong&gt;: Платеж Taker-а отправляется на &lt;strong&gt;P2SH адрес с временной блокировкой&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Для блокчейнов ETH/ERC20&lt;/strong&gt;: Платеж Taker-а отправляется на &lt;strong&gt;etomic-swap смарт-контракт&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Этот шаг гарантирует, что если Maker не продолжит своп, Taker сможет вернуть свои средства после истечения короткого времени блокировки.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Шаг 4: Присвоение платежа Taker-а Maker-ом&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Maker видит, что Taker отправил Taker Payment. Чтобы получить его, Maker раскрывает 32-байтный секрет, который затем передается в сеть блокчейна. Это действие позволяет Maker-у разблокировать и перевести Taker Payment на свой адрес. После раскрытия секрет становится общедоступным.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Шаг 5: Присвоение платежа Maker-а Taker-ом&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Наконец, Taker, заметив, что Maker раскрыл секрет (revealed the secret), чтобы получить Taker Payment, использует этот же секрет для разблокировки Maker Payment. Затем Taker переводит Maker Payment на свой адрес, завершая своп.&lt;/p&gt;

&lt;p&gt;Этот пример протокола атомарного свопа обеспечивает безопасный и децентрализованный обмен активами между Maker-ом и Taker-ом. Использование криптографических механизмов, таких как hash lock и time lock (HTLC protocol), гарантирует, что либо своп будет завершен в соответствии с договоренностью, либо обе стороны сохранят свои исходные активы. Процесс полностью децентрализован и не требует участия посредников, что делает его безопасным методом для одноранговых обменов криптовалют.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/laruh/what-are-atomic-swaps-4gkh"&gt;eng version&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>atomicswaps</category>
    </item>
  </channel>
</rss>
