<?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>DEV Community: Kernel 🏴‍☠️</title>
    <description>The latest articles on DEV Community by Kernel 🏴‍☠️ (@mehdi_kernel).</description>
    <link>https://dev.to/mehdi_kernel</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%2F876751%2Fab7a7507-9664-4fe2-a4b7-6e7ee4806218.png</url>
      <title>DEV Community: Kernel 🏴‍☠️</title>
      <link>https://dev.to/mehdi_kernel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mehdi_kernel"/>
    <language>en</language>
    <item>
      <title>#2 - Introduction au développement de smartcontracts sur la blockchain Partisia</title>
      <dc:creator>Kernel 🏴‍☠️</dc:creator>
      <pubDate>Mon, 13 Jun 2022 23:23:12 +0000</pubDate>
      <link>https://dev.to/mehdi_kernel/2-introduction-au-developpement-de-smartcontracts-sur-la-blockchain-partisia-34om</link>
      <guid>https://dev.to/mehdi_kernel/2-introduction-au-developpement-de-smartcontracts-sur-la-blockchain-partisia-34om</guid>
      <description>&lt;p&gt;&lt;em&gt;Dans cette série d’articles je découvre l’écosystème Partisia Blockchain, la fameuse blockchain qui permet de développer des smartcontracts avec une part de confidentialité (une première pour une blockchain qui permet de déployer des smartcontracts).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Je vais donc documenter cette exploration sur plusieurs articles en fonction de mes découvertes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dans le premier article disponible en cliquant sur &lt;a href="https://dev.to/mehdi_kernel/1-introduction-au-developpement-de-smartcontracts-sur-la-blockchain-partisia-1n5f"&gt;ce lien&lt;/a&gt;, nous avons vu comment installer les outils nécessaires au développement, et comment déployer un smartcontract classique.&lt;/p&gt;

&lt;p&gt;Dans ce second article, nous allons entrer dans les détails d’un smart contract écrit pour Partisia en &lt;code&gt;Rust&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tout d’abord il faut savoir qu’un smartcontract se compose de 3 elements : les &lt;code&gt;states&lt;/code&gt;, les &lt;code&gt;actions&lt;/code&gt; et l’ &lt;code&gt;initializer&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ces 3 elements se déclarent avec ce qu’on appelle des macros :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;[#state]&lt;/code&gt; : Les états du contract. Peut aussi être compris comme la “base de donnée” de notre smartcontract. C’est là que nous stockerons les données.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[#action]&lt;/code&gt; : Ce sont end-points pour interagir avec notre smartcontract, à savoir modifier les states.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[#init]&lt;/code&gt; : La fonction d’initialisation du smartcontract, elle n’est lancée qu’une seule fois : au moment du déploiement du smartcontract et permet notamment d’initialiser les states.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. State
&lt;/h2&gt;

&lt;p&gt;Dans notre exemple &lt;code&gt;example-token-contract&lt;/code&gt; la state ressemble à ceci :&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="nd"&gt;#[state]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;TokenContractState&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;decimals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;total_supply&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;balances&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BTreeMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&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="n"&gt;allowed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BTreeMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BTreeMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&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;À noter qu’il est possible d’ajouter des méthodes à notre &lt;code&gt;state&lt;/code&gt; pour pouvoir servir des données plus simplement. Dans notre exemple, nous avons ajouté une implémentation à la &lt;code&gt;struct TokenContractState&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Voici à quoi ça ressemble :&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;impl&lt;/span&gt; &lt;span class="n"&gt;TokenContractState&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;balance_of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.balances&lt;/span&gt;&lt;span class="nf"&gt;.entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.or_insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;total_supply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.total_supply&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;allowance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;allowed_from_owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.allowed&lt;/span&gt;&lt;span class="nf"&gt;.entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.or_insert_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;BTreeMap&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;allowance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;allowed_from_owner&lt;/span&gt;&lt;span class="nf"&gt;.entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spender&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.or_insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;allowance&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;update_allowance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;allowed_from_owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.allowed&lt;/span&gt;&lt;span class="nf"&gt;.entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.or_insert_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;BTreeMap&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;allowed_from_owner&lt;/span&gt;&lt;span class="nf"&gt;.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&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;Pour ceux qui ne connaissent pas Rust, vous noterez que certaines lignes finissent pas &lt;code&gt;;&lt;/code&gt; et d’autres non. Le fait de ne pas terminer la ligne par un &lt;code&gt;;&lt;/code&gt; signifie simplement que l’on retourne la valeur. Ce qui nous permet d’écrire moins de code ;)&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Action
&lt;/h2&gt;

&lt;p&gt;Comme dit précédemment, les &lt;code&gt;actions&lt;/code&gt; servent à modifier nos &lt;code&gt;states&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dans notre exemple, nous avons l’action &lt;code&gt;transfer&lt;/code&gt; qui ressemble à ceci :&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="nd"&gt;#[action]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;transfer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ContractContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TokenContractState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TokenContractState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;EventGroup&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;new_state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;from_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new_state&lt;/span&gt;&lt;span class="nf"&gt;.balance_of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="py"&gt;.sender&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;o_new_from_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;from_amount&lt;/span&gt;&lt;span class="nf"&gt;.checked_sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;o_new_from_amount&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_from_amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;new_state&lt;/span&gt;&lt;span class="py"&gt;.balances&lt;/span&gt;&lt;span class="nf"&gt;.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="py"&gt;.sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_from_amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nb"&gt;None&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nd"&gt;panic!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;“&lt;span class="n"&gt;Underflow&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;transfer&lt;/span&gt; — &lt;span class="n"&gt;owner&lt;/span&gt; &lt;span class="n"&gt;did&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="n"&gt;enough&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;”&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;to_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new_state&lt;/span&gt;&lt;span class="nf"&gt;.balance_of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;new_state&lt;/span&gt;&lt;span class="py"&gt;.balances&lt;/span&gt;&lt;span class="nf"&gt;.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_amount&lt;/span&gt;&lt;span class="nf"&gt;.add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;new_state&lt;/span&gt;&lt;span class="nf"&gt;.balance_of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="py"&gt;.sender&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;new_state&lt;/span&gt;&lt;span class="py"&gt;.balances&lt;/span&gt;&lt;span class="nf"&gt;.remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="py"&gt;.sender&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;vec!&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;L’action reçoit en premier argument le &lt;code&gt;context&lt;/code&gt;, puis en second argument la &lt;code&gt;state&lt;/code&gt; non-modifiable du contract, et ensuite tous les arguments nécessaires à son execution, définis par le développeur.&lt;/p&gt;

&lt;p&gt;L’action doit aussi nécessairement retourner la nouvelle state modifiée et un vecteur d’évènements, qui sont une liste d’interactions avec d’autres contracts.&lt;/p&gt;

&lt;p&gt;On remarquera que la première instruction dans notre action est &lt;code&gt;let mut new_state = state;&lt;/code&gt;. Ici &lt;code&gt;mut&lt;/code&gt; nous permet de spécifier que &lt;code&gt;new_state&lt;/code&gt; sera &lt;code&gt;mutable&lt;/code&gt;, comprendre modifiable, et que &lt;code&gt;new_state&lt;/code&gt; se réfère à la state.&lt;/p&gt;

&lt;p&gt;C’est cette ligne qui nous permet de modifier la &lt;code&gt;new_state&lt;/code&gt; dans les lignes qui suivent, pour au final la retourner à la dernière ligne afin de pouvoir modifier la state du contrat.&lt;/p&gt;

&lt;p&gt;Finalement, étant donné que dans ce cas, nous n’interagissons pas avec d’autres smartcontract, nous retournons simplement une liste vide pour le vecteur d’évènement : &lt;code&gt;vec![]&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Init
&lt;/h2&gt;

&lt;p&gt;La macro &lt;code&gt;[#init]&lt;/code&gt; quant à elle se rapproche beaucoup de la macro &lt;code&gt;[#action]&lt;/code&gt; à la différence que c’est une action n’a pas d’argument state et que cette action n’est lancée qu’une seule fois : Lors de la création du smartcontract.&lt;/p&gt;

&lt;p&gt;Si la fonction &lt;code&gt;init&lt;/code&gt; échoue, alors le smartcontract n’est pas créé.&lt;/p&gt;

&lt;p&gt;Dans notre exemple, voici à quoi ressemble la fonction d’initialisation :&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="nd"&gt;#[init]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ContractContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;decimals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;total_supply&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TokenContractState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;EventGroup&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;balances&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;BTreeMap&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;balances&lt;/span&gt;&lt;span class="nf"&gt;.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="py"&gt;.sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total_supply&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TokenContractState&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;decimals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="py"&gt;.sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;total_supply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;balances&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;allowed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;BTreeMap&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;vec!&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;Pour en apprendre plus sur Rust, voici un lien intéressant pour les développeurs en reconversion : &lt;a href="https://www.educative.io/courses/learn-rust-from-scratch/R1GjgxmKKJw"&gt;https://www.educative.io/courses/learn-rust-from-scratch/R1GjgxmKKJw&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pour en savoir plus sur Partisia, voici le lien vers la documentation officielle : &lt;a href="https://partisiablockchain.gitlab.io/documentation/"&gt;https://partisiablockchain.gitlab.io/documentation/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et si vous voulez, vous pouvez aussi me suivre sur twitter pour des infos plus concises sur Partisia, la blockchain en général et un peu d’économie : &lt;a href="https://twitter.com/mehdi_kernel"&gt;https://twitter.com/mehdi_kernel&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>french</category>
      <category>tutorial</category>
      <category>rust</category>
    </item>
    <item>
      <title>#1 - Introduction au développement de smartcontracts sur la blockchain Partisia</title>
      <dc:creator>Kernel 🏴‍☠️</dc:creator>
      <pubDate>Mon, 13 Jun 2022 22:54:13 +0000</pubDate>
      <link>https://dev.to/mehdi_kernel/1-introduction-au-developpement-de-smartcontracts-sur-la-blockchain-partisia-1n5f</link>
      <guid>https://dev.to/mehdi_kernel/1-introduction-au-developpement-de-smartcontracts-sur-la-blockchain-partisia-1n5f</guid>
      <description>&lt;p&gt;Aujourd’hui je commence l’exploration de l’écosystème Partisia Blockchain, la fameuse blockchain qui permet de développer des smartcontracts avec une part de confidentialité (une première pour une blockchain qui permet de déployer des smartcontracts).&lt;/p&gt;

&lt;p&gt;Je vais donc documenter cette exploration sur plusieurs articles en fonction de mes découvertes.&lt;/p&gt;

&lt;p&gt;La première étape est d’installer tous les outils dont nous aurons besoin pour développer nos smartcontracts :&lt;/p&gt;

&lt;p&gt;Rust : &lt;a href="https://rustup.rs/"&gt;https://rustup.rs/&lt;/a&gt;&lt;br&gt;
Ajouter la target wasm32 à rust via ces 2 commandes :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rustup update
rustup target add wasm32-unknown-unknown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Télécharger le SDK Partisia : &lt;a href="https://partisiablockchain.gitlab.io/documentation/partisia-sdk-7.0.0.zip"&gt;https://partisiablockchain.gitlab.io/documentation/partisia-sdk-7.0.0.zip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Puis aller dans le repo &lt;code&gt;cargo-partisia-contract&lt;/code&gt; et faire les installations nécessaires via cargo (ça va être long) :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;partisia-sdk-7.0.0/cargo-partisia-contract
cargo &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--path&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si tout s’est bien passé vous devriez voir apparaitre la version de &lt;code&gt;partisia-contract&lt;/code&gt; en tapant cargo &lt;code&gt;partisia-contract —-version&lt;/code&gt; dans votre terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Félicitation, si vous en êtes arrivés là, c’est que vous avez tout installé correctement 🎉
&lt;/h2&gt;




&lt;p&gt;Maintenant que nous avons nos outils, nous allons passer à la compilation d’un smartcontract d’exemple.&lt;/p&gt;

&lt;p&gt;Dans le repo &lt;code&gt;partisia-sdk-7.0.0&lt;/code&gt; que vous avez téléchargé, vous trouverez quelques exemple de smartcontracts dans le repository contracts .&lt;/p&gt;

&lt;p&gt;On va s’intéresser au contract appelé &lt;code&gt;example-token-contract&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dans ce dossier, vous trouverez un fichier &lt;code&gt;Cargo.toml&lt;/code&gt; contenant les dépendances nécessaires à la compilation de ce smartcontract, et un dossier &lt;code&gt;src&lt;/code&gt; contenant un fichier &lt;code&gt;lib.rs&lt;/code&gt; avec le code de notre smartcontract. Nous allons nous intéresser à ce bout de code un peu plus tard.&lt;/p&gt;

&lt;p&gt;Donc dans notre dossier &lt;code&gt;example-token-contract&lt;/code&gt; on va lancer la commande :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo partisia-contract build &lt;span class="nt"&gt;--release&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ce qui va compiler le smartcontract et on va se retrouver avec un nouveau fichier &lt;code&gt;Cargo.lock&lt;/code&gt; qui est un semblant de &lt;code&gt;yarn.lock&lt;/code&gt; pour les développeurs JS, et un dossier &lt;code&gt;target&lt;/code&gt; où va se trouver l’output de notre compilation.&lt;/p&gt;

&lt;p&gt;Dans ce dossier target on aura :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;un binaire &lt;code&gt;wasm32-unknown-unknown/release/token_contract.wasm&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;une abi &lt;code&gt;wasm32-unknown-unknown/release/token_contract.abi&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce sont ces 2 fichiers dont nous aurons besoin pour déployer notre smartcontract.&lt;/p&gt;

&lt;p&gt;Une fois qu’on a ces 2 fichiers, il est possible de déployer le smartcontract en visitant &lt;a href="https://dashboard.partisiablockchain.com/wallet/upload_wasm"&gt;https://dashboard.partisiablockchain.com/wallet/upload_wasm&lt;/a&gt; ou &lt;a href="https://mpcexplorer.com/deploy-contract"&gt;https://mpcexplorer.com/deploy-contract&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Veillez à bien sélectionner &lt;code&gt;token_contract.wasm&lt;/code&gt; pour le contrat et &lt;code&gt;token_contract.abi&lt;/code&gt; pour l’ABI. Ensuite, entrer les données d’initialisation du contract : nom du token, symbol, nombre de décimales, la supply totale. Et enfin, envoyer la transaction.&lt;/p&gt;

&lt;p&gt;A noter que dans cet exemple, on déploie sur le mainnet de Partisia. Vous aurez donc besoin de MPC tokens pour payer le gas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Félicitation (bis), si vous en êtes arrivés là, c’est que vous avez déployé votre premier smartcontract sur la blockchain Partisia avec succès 🎉
&lt;/h2&gt;




&lt;p&gt;Dans de prochains articles nous verrons comment interagir avec le smartcontract, la structure des smartcontracts, comment déployer sur testnet, et bien plus encore.&lt;/p&gt;

&lt;p&gt;Pour patienter, voici une video de l’interaction avec le smartcontract depuis l’interface utilisateur 👉 &lt;a href="https://www.youtube.com/watch?v=qV2grtWDxUE"&gt;https://www.youtube.com/watch?v=qV2grtWDxUE&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Si vous souhaitez en savoir plus sur Partisia, voici le lien vers la documentation officielle : &lt;a href="https://partisiablockchain.gitlab.io/documentation/"&gt;https://partisiablockchain.gitlab.io/documentation/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et si vous voulez, vous pouvez aussi me suivre sur twitter pour des infos plus concises sur Partisia, la blockchain en général et un peu d’économie : &lt;a href="https://twitter.com/mehdi_kernel"&gt;https://twitter.com/mehdi_kernel&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>french</category>
      <category>tutorial</category>
      <category>rust</category>
    </item>
  </channel>
</rss>
