<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Noah (Noah)</title>
    <link>https://soldev.cn/Noah</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>探索 Solana 与 合约核心概念</title>
      <description>&lt;h2 id="Solana 介绍"&gt;Solana 介绍&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Solana 是一条高性能的 L1 公链&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Proof of History&lt;/code&gt; (PoH)

&lt;ul&gt;
&lt;li&gt;用于在不信任彼此的计算机之间进行时间同步&lt;/li&gt;
&lt;li&gt;比没有时钟的区块链快好多倍 (1k, 10k)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;部署到 Solana 区块链上的代码称为 program(合约)

&lt;ul&gt;
&lt;li&gt;要与 program 交互，您需要从客户端在区块链上发送一笔 Transaction&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;部署上去的合约通过 sdk 或者 cli 进行通信&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;通过 &lt;code&gt;sdk&lt;/code&gt; 编写 &lt;code&gt;dapp&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://i.imgur.com/KXJrxF3.png" title="" alt="Untitled"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="Solana 核心概念"&gt;Solana 核心概念&lt;/h2&gt;&lt;h3 id="Account"&gt;Account&lt;/h3&gt;&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="cd"&gt;/// lamports in the account&lt;/span&gt;
        &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;lamports&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="cd"&gt;/// data held in this account&lt;/span&gt;
        &lt;span class="nd"&gt;#[serde(with&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"serde_bytes"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
        &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;data&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="nb"&gt;u8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="cd"&gt;/// the program that owns this account. If executable, the program that loads this account.&lt;/span&gt;
        &lt;span class="k"&gt;pub&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;Pubkey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="cd"&gt;/// this account's data contains a loaded program (and is now read-only)&lt;/span&gt;
        &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;executable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="cd"&gt;/// the epoch at which this account will next owe rent&lt;/span&gt;
        &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;rent_epoch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Epoch&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;h3 id="账号和签名"&gt;账号和签名&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;我们用户理解的&lt;code&gt;账号&lt;/code&gt;，就是一串&lt;code&gt;Ed25519的私钥&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;助记词 → 随机数种子 → 私钥&lt;/li&gt;
&lt;li&gt;而&lt;code&gt;用户账号的地址&lt;/code&gt;, 则是这私钥对应的&lt;code&gt;公钥&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;公钥和私钥放一起，就是所谓的 &lt;code&gt;key-pair&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;钱包 Account &lt;code&gt;公钥 + 密码&lt;/code&gt; 得到 &lt;code&gt;私钥&lt;/code&gt;, 再用私钥&lt;code&gt;操作 Account&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="交易(Transaction)"&gt;交易 (Transaction)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;交易就是链外数据和链上数据产生的一次&lt;strong&gt;交互&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;交易是&lt;strong&gt;对多个交易&lt;code&gt;指令&lt;/code&gt;的打包&lt;/strong&gt;，所以起内容主要就是各个交易指令，以及相应指令对应的&lt;code&gt;发起人&lt;/code&gt;和&lt;code&gt;签名&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Transaction 定义：Code&lt;/p&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="cd"&gt;/// The message header, identifying signed and read-only `account_keys`.&lt;/span&gt;
        &lt;span class="cd"&gt;/// Header values only describe static `account_keys`, they do not describe&lt;/span&gt;
        &lt;span class="cd"&gt;/// any additional account keys loaded via address table lookups.&lt;/span&gt;
        &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MessageHeader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

        &lt;span class="cd"&gt;/// List of accounts loaded by this transaction.&lt;/span&gt;
        &lt;span class="nd"&gt;#[serde(with&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"short_vec"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
        &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;account_keys&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;Pubkey&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

        &lt;span class="cd"&gt;/// The blockhash of a recent block.&lt;/span&gt;
        &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;recent_blockhash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

        &lt;span class="cd"&gt;/// Instructions that invoke a designated program, are executed in sequence,&lt;/span&gt;
        &lt;span class="cd"&gt;/// and committed in one atomic transaction if all succeed.&lt;/span&gt;
        &lt;span class="cd"&gt;///&lt;/span&gt;
        &lt;span class="cd"&gt;/// # Notes&lt;/span&gt;
        &lt;span class="cd"&gt;///&lt;/span&gt;
        &lt;span class="cd"&gt;/// Program indexes must index into the list of message `account_keys` because&lt;/span&gt;
        &lt;span class="cd"&gt;/// program id's cannot be dynamically loaded from a lookup table.&lt;/span&gt;
        &lt;span class="cd"&gt;///&lt;/span&gt;
        &lt;span class="cd"&gt;/// Account indexes must index into the list of addresses&lt;/span&gt;
        &lt;span class="cd"&gt;/// constructed from the concatenation of three key lists:&lt;/span&gt;
        &lt;span class="cd"&gt;///   1) message `account_keys`&lt;/span&gt;
        &lt;span class="cd"&gt;///   2) ordered list of keys loaded from `writable` lookup table indexes&lt;/span&gt;
        &lt;span class="cd"&gt;///   3) ordered list of keys loaded from `readable` lookup table indexes&lt;/span&gt;
        &lt;span class="nd"&gt;#[serde(with&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"short_vec"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
        &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;instructions&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;CompiledInstruction&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

        &lt;span class="cd"&gt;/// List of address table lookups used to load additional accounts&lt;/span&gt;
        &lt;span class="cd"&gt;/// for this transaction.&lt;/span&gt;
        &lt;span class="nd"&gt;#[serde(with&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"short_vec"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
        &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;address_table_lookups&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;MessageAddressTableLookup&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;pub&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;VersionedMessage&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;Legacy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LegacyMessage&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nf"&gt;V0&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Message&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;struct&lt;/span&gt; &lt;span class="n"&gt;VersionedTransaction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="cd"&gt;/// List of signatures&lt;/span&gt;
        &lt;span class="nd"&gt;#[serde(with&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"short_vec"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
        &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;signatures&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;Signature&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="cd"&gt;/// Message to sign.&lt;/span&gt;
        &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;VersionedMessage&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;/li&gt;
&lt;/ul&gt;
&lt;h3 id="交易指令"&gt;交易指令&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;交易指令 (Instruction) 定义：Code&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;需要 &lt;code&gt;程序 id&lt;/code&gt;, &lt;code&gt;account 资源&lt;/code&gt;, &lt;code&gt;data 数据&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;CompiledInstruction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="cd"&gt;/// Index into the transaction keys array indicating the program account that executes this instruction.&lt;/span&gt;
        &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;program_id_index&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="cd"&gt;/// Ordered indices into the transaction keys array indicating which accounts to pass to the program.&lt;/span&gt;
        &lt;span class="nd"&gt;#[serde(with&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"short_vec"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
        &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;accounts&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="nb"&gt;u8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="cd"&gt;/// The program input data.&lt;/span&gt;
        &lt;span class="nd"&gt;#[serde(with&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"short_vec"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
        &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;data&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="nb"&gt;u8&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;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="合约"&gt;合约&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;系统合约

&lt;ul&gt;
&lt;li&gt;系统合约是由节点在部署的时候生成的，普通用户无法更新，他们像普通合约一样，可以被其他合约或者 RPC 进行调用&lt;/li&gt;
&lt;li&gt;常见的系统合约

&lt;ul&gt;
&lt;li&gt;System Program: 创建账号，转账等作用&lt;/li&gt;
&lt;li&gt;BPF Loader Program: 部署和更新合约&lt;/li&gt;
&lt;li&gt;Vote program: 创建并管理用户 POS 代理投票的状态和奖励&lt;/li&gt;
&lt;li&gt;….&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;普通合约

&lt;ul&gt;
&lt;li&gt;普通合约是由用户开发并部署，Solana 官方也有一些官方开发的合约，如 Token、ATA 账号等合约&lt;/li&gt;
&lt;li&gt;不同于有些公链，&lt;strong&gt;Solana 上的合约是可以被更新的，也可以被销毁&lt;/strong&gt;。并且当销毁的时候，用于存储代码的 Account 所消耗的资源也会&lt;strong&gt;归还给部署者&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="合约与 Account"&gt;合约与 Account&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在上面的 Account 介绍中，我们有个 owner 的成员，这个就表示这个 Account 是被哪个合约管理的，或者说哪个 合约可以对这个 Account 进行读写，类似 Linux 操作系统中，文件属于哪个用户&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;一般合约&lt;/code&gt;，他的 Owner 都是&lt;code&gt;BPF Loader&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;存放我们代币余额的内容的 owner 都是&lt;code&gt;Token合约&lt;/code&gt; → &lt;strong&gt;&lt;code&gt;SPL Token Program&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="租约"&gt;租约&lt;/h3&gt;
&lt;p&gt;Solana 区块链引入了一种独特的资金模型来处理账户存储空间的费用，称为“租金”（&lt;code&gt;Rent&lt;/code&gt;）&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;交易费用 gas fee 和 rent 是两个东西，交易费是为了处理网络上的交易或指令，如转账、执行智能合约操作等&lt;/li&gt;
&lt;li&gt;租金率

&lt;ul&gt;
&lt;li&gt;Solana 租金率是在网络范围内设置的，主要基于每年每字节设置的 LAMPORTS。目前，租金率为静态金额并存储在 Rent 系统变量中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;租金豁免

&lt;ul&gt;
&lt;li&gt;保持最低 LAMPORT 余额超过 2 年租金的账户被视为“免租金”，不会产生租金&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;垃圾收集

&lt;ul&gt;
&lt;li&gt;未保持租金豁免状态或余额不足以支付租金的帐户将通过称为垃圾收集的过程从网络中删除&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;永久存储的条件

&lt;ul&gt;
&lt;li&gt;要使账户在 Solana 上永久存储，&lt;strong&gt;你需要为该账户豁免租金，即一次性存入足够的 LAMPORTS&lt;/strong&gt;。仅支付交易费用而不关注租金，不能保证账户及其数据的永久存储&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="SPL Token(代币)"&gt;SPL Token(代币)&lt;/h2&gt;
&lt;p&gt;在以太坊中，普通代币被一个叫 ERC20 的提案定了规范，可以认为普通代币合约统一叫做 ERC20 代币，&lt;strong&gt;在 Solana 中，这个 ERC20 代币就是 SPL 代币&lt;/strong&gt;&lt;/p&gt;</description>
      <author>Noah</author>
      <pubDate>Tue, 28 May 2024 23:36:00 +0800</pubDate>
      <link>https://soldev.cn/topics/13</link>
      <guid>https://soldev.cn/topics/13</guid>
    </item>
    <item>
      <title>Solana &amp; Anchor </title>
      <description>&lt;h2 id="Anchor"&gt;Anchor&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;导入 anchor&lt;/p&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;anchor_lang&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;prelude&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;declare_id!("public_key");&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;#[program]&lt;/code&gt; 宏创建我们的 program(合约)&lt;/p&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[program]&lt;/span&gt;
&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;hello_world&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&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;hello&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;Context&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Hello&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;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;Ok&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;/li&gt;
&lt;li&gt;
&lt;p&gt;Rust &lt;code&gt;println!&lt;/code&gt; → Anchor &lt;code&gt;msg!&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;msg!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;给结构体派生 &lt;code&gt;[derive(Accounts)]&lt;/code&gt;  来定义 Account&lt;/p&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[derive(Accounts)]&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;Hello&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Context&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;build &amp;amp; deploy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IDL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;anchor_spl&lt;/code&gt; &amp;amp; &lt;code&gt;mpl_token_metadata&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;与 token program 和 token_metadata program 交互&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;anchor_spl&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;
    &lt;span class="nn"&gt;associated_token&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;AssociatedToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nn"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;create_metadata_accounts_v3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CreateMetadataAccountsV3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Metadata&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nn"&gt;token&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;burn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mint_to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Burn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MintTo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TokenAccount&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;mpl_token_metadata&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="nn"&gt;pda&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;find_metadata_account&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;state&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;DataV2&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;solana_program&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;pubkey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;pubkey&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Pubkey&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="Client SDK"&gt;Client SDK&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Rust&lt;/li&gt;
&lt;li&gt;TypeScript

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/package/@coral-xyz/anchor" rel="nofollow" target="_blank" title=""&gt;&lt;/a&gt;&lt;a href="/coral-xyz" class="user-mention" title="@coral-xyz"&gt;&lt;i&gt;@&lt;/i&gt;coral-xyz&lt;/a&gt;/anchor library&lt;/li&gt;
&lt;li&gt;为了与我们的链上程序进行交互，我们必须创建一个交易并通过 &lt;code&gt;RPC&lt;/code&gt; 端点将其发送到 Solana 集群&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="Anchor CLI"&gt;Anchor CLI&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;anchor build&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="Solana CLI"&gt;Solana CLI&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;solana airdrop 5&lt;/li&gt;
&lt;li&gt;solana config set --url devnet&lt;/li&gt;
&lt;li&gt;solana config get&lt;/li&gt;
&lt;li&gt;solana balance&lt;/li&gt;
&lt;li&gt;solana confirm -v 
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>Noah</author>
      <pubDate>Tue, 28 May 2024 23:21:50 +0800</pubDate>
      <link>https://soldev.cn/topics/12</link>
      <guid>https://soldev.cn/topics/12</guid>
    </item>
  </channel>
</rss>
