<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Fifi</title>
    <link>https://soldev.cn/Fifi</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Solana，皇帝的新衣</title>
      <description>&lt;p&gt;原文：&lt;a href="https://mp.weixin.qq.com/s/KM5w-dqH1SSYjxmKAOtcIQ" rel="nofollow" target="_blank"&gt;https://mp.weixin.qq.com/s/KM5w-dqH1SSYjxmKAOtcIQ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;发表日期：&lt;code&gt;2024年07月31日&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;早在 23 年底，针对 Messari 研报唱衰 ETH、唱多 SOL，教链就曾一针见血地指出，这是华尔街资本在 2022 年 FTX 暴雷被埋之后的自救行动之一环。何故？因为他们这些机构，当初被长着白皮、天然招他们信任的 SBF（FTX 创办人）给忽悠进了套，重仓了 Solana，结果 FTX（SBF 开办的交易所）被 CZ（币安赵长鹏）趁着 2022 年熊市一波嘴炮直接带走，直接导致“FTX 系”的诸多资产鸡飞蛋打！&lt;/p&gt;

&lt;p&gt;就说这诸多套牢资产中的一个，Solana，从 2021 年 10 月最高峰近 260 刀的高位，直接给干到了 2022 年 12 月不到 8 刀！最大跌幅高达 97%！&lt;/p&gt;

&lt;p&gt;这就让这帮被套死的美机构资本婶可忍叔不可忍。他们马上拿出了两个对策：&lt;/p&gt;

&lt;p&gt;第一，开展报复行动。利用美国资本影响政治的体制，推动司法部、CFTC、财政部联合执法，把 CZ 给“请”到美国，罚款判刑。CZ 被迫离开自己一手创办的 Binance。Binance 被美财政部监管。这是去年（2023 年）11 月份的事了。1 年不到就大仇得报，深刻体现了资本主义制度的“先进性” —— 老板（资本）一发话，员工（美政府）执行力那真是杠杠滴！此一段江湖恩怨，暂且不表。&lt;/p&gt;

&lt;p&gt;第二，开展自救行动。怎么自救？当然就是联合坐庄，炮制利好，拉升币价咯。华尔街资本炮制的策略，就是把以太坊头上公链之王的皇冠，加冕给 Solana。到今年（2024 年）3 月份，趁着那一波的山寨潮，SOL 已经成功飙升至 210 刀，相比于 2022 年 12 月不到 8 刀，上涨 25 倍之多。而同期 ETH 仅从 2022 年底 1070 刀涨至 2024 年 3 月 4090 刀，涨幅仅有 4 倍左右。&lt;/p&gt;

&lt;p&gt;大家不妨回忆一下，为什么网上忽然很少有人谈 Solana 根本就不是去中心化的区块链，因为它最核心处需要一个中心化的定序器才能工作？为什么 Maker 的创始人 Rune Christensen 去年要和以太坊创始人 Vitalik Buterin 对线叫板，说 Solana 比以太坊更好？为什么头部加密投研机构 Messari 去年研报要明牌唱衰以太坊 (ETH)、唱多 SOL？为什么推特等平台上开始盛行“Solana 超越以太坊”（SOL flips ETH）的言论？&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/0da2beb7-c759-423a-9152-8957f2181cb4.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;时至今日，2024 年 7 月最后一天，Solana 已跻身加密市值榜单前 5，市值近 840 亿刀。而以太坊的市值则超 3960 亿刀。虽然体量上还有一个数量级的差距，但是市场中已经有很多人、很多声音，在鼓动不明觉厉的韭菜们，去相信“Solana 就是下一个以太坊”、“Solana 必将超越以太坊”这样的故事了。&lt;/p&gt;

&lt;p&gt;记住，在金融市场，你看到的，往往都是别人想让你看到的。表象的虚假程度，往往和看好之声的响亮程度成正比。Solana，是否真的具备超越以太坊的潜力，是不是有可能成为下一个公链之王？或者相反，Solana 的繁荣是不是人为炮制的假象，是不是皇帝的新衣呢？&lt;/p&gt;

&lt;p&gt;下面，教链编译 Flip Research 的研究报告《SOL - 皇帝的新衣》，与大家分享一下，作为启发。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;最近，我的推特时间线上充斥着 SOL 的看牛帖子，中间还夹杂着模因币的骗局。我开始相信，模因币超级周期是真实存在的，Solana 将超越以太坊，成为主要的 L1（一层链）。但后来我开始挖掘数据，结果至少可以说是令人担忧的…… 在这篇文章中，我介绍了我的发现，以及为什么 Solana 可能是一个“纸牌屋”（指资本和权力的游戏）。&lt;/p&gt;

&lt;p&gt;首先让我们看看网友 Nachi 简明扼要地阐述看好 SOL 的观点：&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/9641936f-1bfa-4fe7-9dd3-99e4f58c4444.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;【教链注：网友 Nachi 看牛 SOL 的言论主要是这样的：&lt;/p&gt;

&lt;p&gt;我看到 BanklessHQ 最近关于$SOL 比$ETH 折价 83% 的报道，完全震惊于 Solana 与 ETH 的定价失误，甚至 Solana 是我最大的头寸 &lt;/p&gt;

&lt;p&gt;根据第二季度的表现，Solana 有&lt;/p&gt;

&lt;p&gt;50% 的 ETH+L2 用户&lt;br&gt;
27% 的 ETH+L2 费用&lt;br&gt;
36% 的 DEX 交易量&lt;br&gt;
占 ETH+L2 稳定币交易量的 190&lt;/p&gt;

&lt;p&gt;今天，SOL 的 DEX 交易量超过了 ETH 的交易量。即使把 ETH+L2 计算在内，它也在短短几周内从 36% 上升到了 57%&lt;/p&gt;

&lt;p&gt;SOL 的 DEX 交易量迟早会翻转 ETH+L2s 和模因币，而模因币是本周期最好的 PMF（教链注：指契合市场需求的产品），还有其他指标&lt;/p&gt;

&lt;p&gt;但是，SOL 的市值仍然只有 ETH 市值的 20%，而且还在快速增长，这在传统估值中完全是弱智的，再加上像 Firedancer 这样的催化剂，以及明年初可能获得的 ETF 批准。&lt;/p&gt;

&lt;p&gt;……】&lt;/p&gt;

&lt;p&gt;关于对比 ETH+L2 的指标，有四个不同的维度：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;用户群比例高&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;按比例收取更高的费用&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DEX 交易量大&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;稳定币交易量所占比例明显更高&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;一、用户群比较：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;以下是 ETH 主网与 SOL 的对比（仅对比主网，因为绝大多数费用都来自 Dencun 之后的主网，来源：tokenterminal）：&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/eff3f2c1-18a7-4be2-9bde-84573cd9a02b.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;ETH 用户基数 + 链上交易数 (tx)&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/bba3acf9-cec0-43b2-be74-26977b55cb00.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;SOL 用户基数 + 链上交易数 (tx)&lt;/p&gt;

&lt;p&gt;从表面上看，SOL 的数据很不错，日活跃用户（DAU）超过 130 万，而 ETH 为 37.63 万。然而，当我们将 tx 计数加入其中时，我发现了一些奇怪的现象。&lt;/p&gt;

&lt;p&gt;例如，7 月 26 日星期五，ETH 有 110 万次交易，而 DAU 为 37.63 万，大约每个用户每天有 2.92 次交易。而 SOL 的交易数为 2.822 亿次，DAU 则为 130 万，每用户每天的交易数高达 217 次。&lt;/p&gt;

&lt;p&gt;我想，这可能是由于低费用允许更多的交易、更频繁的复合头寸、更多的套利机器人活动等。因此，我将其与另一个受欢迎的链 Arbitrum 进行了比较。然而，Arb 在同一天的用户访问量仅为 4.46 次。再看看其他链，结果也差不多：&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/2f6cd305-4cc0-4f78-9dc3-66ec0d4d4071.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;鉴于用户数量高于 ETH，我对照谷歌趋势进行了检查，谷歌趋势应该与每用户价值相当无关：&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/8f1b051f-0976-496f-b0f6-e74211e0cfcb.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;ETH 一直与 SOL 持平或领先。考虑到 DAU 的差异，再加上所有围绕 SOL 模因币趋势的炒作，这并不是我所期望的。这到底是怎么回事？&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/39fadf2b-0423-4f76-a8fa-bbcd9dcb4c59.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;图中字幕：暴富的秘诀都写在《刑法》里。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;二、DEX 交易量分析&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;要了解交易数量的差异，看看 Raydium 的 LPs 会有所启发。即使是第一眼，也能明显看出不对劲：&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/acea8fd7-d25c-4aff-af23-89cf8f0aa733.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;起初，我以为这只是在蜜罐 LP 上进行低流动性的洗盘交易，以吸引零星的模因币傻缺 (degen)，但从图表上看，情况要糟糕得多：&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/ed30796b-d2ae-4732-a5b9-5be4757dee59.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;每一个低流动性池都是一个仅在过去 24 小时内就抽毯子跑路 (rug) 的项目。就 MBGA 而言，在过去 24 小时内，Raydium 上有 4.6 万笔交易、1080 万美元的交易量、2845 个不同钱包的买入/卖出以及超过 2.8 万美元的手续费。(请注意，类似规模的合法 LP $MEW 只产生了 1.12 万笔交易）。&lt;/p&gt;

&lt;p&gt;纵观所涉及的钱包，绝大多数似乎都是同一网络中的机器人，交易量数以万计。它们独立生成虚假交易量，随机产生 SOL 数量和交易次数，直到项目出现问题，然后再进入下一个项目。&lt;/p&gt;

&lt;p&gt;在过去 24 小时内，Raydium 的标准 LP 上有超过 50 个交易量大于 250 万美元的项目，总共产生了超过 2 亿美元的交易量和超过 50 万美元的费用。Orca 和 Meteora 上的交易量似乎要少得多，而我在 Uniswap (ETH) 上很难找到这些跑路项目的任何有意义的交易量。&lt;/p&gt;

&lt;p&gt;很明显，Solana 上的项目跑路存在着巨大的问题，并产生了各种影响：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;考虑到异常高的交易与用户比率，以及链上的洗币交易/洗币数量，似乎绝大多数交易都是非自然的。在主要的以太坊 L2 上，最高的日交易用户比是 Blast 上的 15.0 倍（该平台的手续费同样很低，而且用户都在使用 Blast S2）。作为一个粗略的比较，如果我们假设真实的 SOL 交易 - 用户比率与 Blast 相似，这将意味着 Solana 上超过 93% 的交易（推而广之，费用）都是非自然的。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;这些骗局运行的唯一原因就是有利可图。因此，用户损失的金额肯定至少等于产生的费用 + 交易成本，每天高达数百万美元。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;一旦部署这些骗局变得无利可图（即实际用户厌倦了赔钱），你就会发现大部分交易量和费用收入都会下降。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;由此看来，用户、真实费用和 DEX 交易量都被严重夸大了。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我不是唯一得出这些结论的人，gphummer 最近也发了类似的帖子：&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/9bec88ca-c2b0-4868-a1a5-9ddd422ac014.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;【教链注：网友 ghpummer 说的是：很多所谓的“研究人员”都在吹嘘，SOL 在 DEX 交易量中超过了 ETH。让我们深入了解一下。这些数字令人难以置信地可疑，暗示着刷量/营销欺骗，对于一个最初在 SBF 的帮助下流行起来的链来说，这并不奇怪。】&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;三、Solana 上的 MEV&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Solana 上的 MEV（矿工提取价值）处于一个独特的位置。与以太坊不同，它没有内置的内存池；相反，像 jitoo_sol 这样的玩家创建了（现已废弃）协议外基础设施来模拟内存池功能，从而为 MEV 提供了机会，如抢跑 (front-running)、三明治攻击 (sandwich attacks) 等。Helius Labs 在这里详细介绍了 MEV：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.helius.dev/blog/solana-mev-an-introduction" rel="nofollow" target="_blank"&gt;https://www.helius.dev/blog/solana-mev-an-introduction&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Solana 的问题在于，交易的绝大多数代币都是超高波动性、低流动性的模因币，交易者往往要设置大于 10% 的滑点才能成功执行交易。这为 MEV 获取价值提供了一个油水很大的攻击面：&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/16e9b89d-6370-46c6-a80f-a678e1feec4b.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;【教链注：网友 Ben 说的是：在过去的 1-2 个月里，Solana 上臭名昭著的三明治机器人 arsc 已经赚取了 3000 多万美元🤯！】&lt;/p&gt;

&lt;p&gt;如果我们看看区块空间的盈利能力，就会发现现在大部分价值都来自 MEV 的油水：&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/660b82ac-116f-4d61-a76e-baed0a86906e.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;【教链注：网友 Dan Smith 说的是：Solana 昨天共产生了 550 万美元的费用，是过去三个月中最高的一次 &lt;/p&gt;

&lt;p&gt;58% 的价值来自 MEV 提示，37% 来自优先交易费&lt;/p&gt;

&lt;p&gt;大部分活动来自现货 DEX 交易】&lt;/p&gt;

&lt;p&gt;虽然这是严格意义上的“真实”价值，但 MEV 只有在有利可图时才会进行，也就是说，只要散户继续“梭哈”模因币（并净亏损），MEV 就会进行。一旦模因币开始降温，MEV 费用收入也将随之崩溃。&lt;/p&gt;

&lt;p&gt;我看到许多 SOL 帖子都在谈论最终会如何转向 $JUP、$JTO 等基础设施投资。这很有可能，但值得注意的是，这些代币的波动性更低、流动性更高，根本无法提供相同的 MEV 机会。&lt;/p&gt;

&lt;p&gt;老练的玩家有动力建立最好的基础架构来利用这种情况。在我的调查过程中，一些消息来源提到了这些玩家投资控制内存池空间，然后将权限出售给第三方的传言。但我无法证实这一信息。&lt;/p&gt;

&lt;p&gt;这其中存在一些明显反常的激励机制 —— 通过将尽可能多的模因币活动转移到 SOL，可以让老谋深算的人继续从 MEV、上面谈到的模因币内幕交易以及 SOL 的价格升值中获利。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;四、稳定币&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;说到稳定币的交易量+TVL（总锁定金额），还有一个奇怪的现象。交易量明显高于 ETH，但当我们查看 DefiLlama 的稳定币数据时，ETH 有 800 亿美元的稳定 TVL，而 SOL 只有 32 亿美元。&lt;/p&gt;

&lt;p&gt;我认为，稳定币（以及更广泛的）TVL 是一个比低费用平台上的交易量/手续费更不容易出老千的指标，它显示了游戏中的参与者有多少。&lt;/p&gt;

&lt;p&gt;稳定币的交易量动态凸显了这一点 —— WazzCrypto 指出，一旦 CFTC 宣布他们正在调查 Jump，交易量就会突然下降：&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/5b1e2b21-a20b-4bbb-a455-d28baf89ca79.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;【教链注：网友 Wazz 说的是：自从 Jump 被美国商品期货交易委员会（CFTC）调查以来，Solana 稳定币交易量的图表就成了字面意义上的一条水平线。这是一个很大的谜，是什么造成了这种情况...】&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;五、韭菜价值提取&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;除了跑路和 MEV，散户的前景依然暗淡。名流们选择 Solana 作为他们的首选链，结果并不乐观：&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/67a8ecc3-ef54-4873-b544-6871c0abd0a2.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;【教链注：此表展示了 Solana 上发行的“名人币”的惊人跌幅】&lt;/p&gt;

&lt;p&gt;Andrew Tate 的“DADDY”是表现最好的名人币，回报率为 -73%。&lt;/p&gt;

&lt;p&gt;在推特上快速搜索一下，就能发现内幕交易猖獗、开发者向买家倾销代币的证据：&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/021a0808-435c-4c74-9c3f-a1b92abaaa6c.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;也许有人会这样反问：但是，我的推特时间线上都是在 Solana 上交易模因币赚了几百万的人。这和你说的有什么关系？&lt;/p&gt;

&lt;p&gt;我根本不相信 KOL 在推特上发表的帖子能代表更广泛的用户群。在当前的狂热下，他们很容易进入一个生态位，推销他们的代币，从他们的追随者身上获利，然后重复一遍又一遍。这里绝对有幸存者偏差在起作用 —— 赢家的声音远大于输家，造成了对现实的扭曲认知。&lt;/p&gt;

&lt;p&gt;客观地说，散户每天都会被骗子、开发者、内部人士、MEV、KOL 折腾走数百万，而这还没有考虑到他们在 Solana 上交易的大部分东西都是没有任何真材实料支持的模因币。很难反驳这样一个事实，即大多数模因币最终都会走向与$boden 相同的道路（即：归零）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;六、附加考虑&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;市场是善变的，当情绪发生变化时，买家曾经视而不见的因素就会成为焦点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;链稳定性差，经常出现中断&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;交易失败率高&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;无法阅读的区块浏览器&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;开发门槛高，Rust 对用户的友好程度远不如 Solidity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;与 EVM 相比，互操作性差。我认为，让多个可互操作的链相互竞争，而不是受制于一个单一的（相当集中的）链，是更健康的做法。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;从监管和需求角度看，ETF 的可能性都很低。这篇文章本身就强调了为什么在 Solana 目前的状态下，机构需求会很低。malekanoms 还强调了一些我认为与传统金融相关的观点（加上 0xmert 的反驳）：&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/77813340-360b-4302-b863-bb2e6b76215a.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;【教链注：网友 Omid Malekan 说的是：&lt;/p&gt;

&lt;p&gt;ETH 是加密货币中的优质流动资产 (HQLA)&lt;/p&gt;

&lt;p&gt;为了迎接 ETH ETF 的推出，我写了一篇小论文，解释什么是 HQLA，为什么我们需要一个数字原生的 HQLA，以及为什么 ETH 是最有可能的候选资产。我的分析将其与 BTC 和 SOL 进行了比较。&lt;/p&gt;

&lt;p&gt;以下是摘要：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;为什么是 HQLA？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HQLA 是传统金融的一个概念，用于银行监管。它指的是那些几乎具有公认价值和深度流动性的资产 —— 银行可以安全持有并在紧要关头出售而不影响市场的资产。我将这一概念不严格地应用于加密货币，因为这种资产是我们可以用来建立一个全新的去中心化金融体系的。&lt;/p&gt;

&lt;p&gt;原生数字 HQLA 意味着更好的去中心化稳定币、更安全的信贷和更可信的衍生品。我的分析解释了为什么这不可能是一个 dApp 代币、集中发行的稳定币/RWA 或 L2 代币。最佳候选者是 L1 的原生币。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;为什么不是比特币？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;BTC 是加密货币中最有价值、流动性最强的资产，但你却不能用它做很多事。链上没有原生 DeFi 或替代资产，比如稳定币。将其用作抵押品的唯一方法是托管或桥接到另一条链上，而这两种方法都会带来新的风险，在某种程度上有违初衷。&lt;/p&gt;

&lt;p&gt;也许随着新契约或 L2 的出台，情况会有所改变，但我对此持怀疑态度。BTC 的灵魂在于实现另一个目的，即成为传统金融的 HQLA。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ETH 与 SOL 之争&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Solana 网络有许多吸引人的特性。但这与 SOL（资产）是两码事。从经济学角度来看，SOL 的基本面较弱，因此是一种中等质量的资产。&lt;/p&gt;

&lt;p&gt;首先，SOL 的所有权很集中，这要归功于它的年轻、多轮风险投资、对实验室和基金会的拨款，以及它以质押方式（即 PoS）上线的事实。集中会降低流动性。ETH 在几年前进行了适度的融资，只给了基金会和创始人少量资金（按当前标准），并且在合并前有多年的 PoW（工作量证明，即算力挖矿）。&lt;/p&gt;

&lt;p&gt;其次，SOL 的通胀率相对较高，超过 5%。通胀率最终会下降，但在通胀率稳定在 1.5% 之前，供应量将增长 25%。在此期间，SOL 在 DeFi 的资本成本会很高。&lt;/p&gt;

&lt;p&gt;DeFi 总是倾向于使用原生资产 —— LST（流动性质押代币）本身会带来风险 —— 但在 DeFi 中使用原生 SOL 意味着放弃高额质押收益。DeFi 要吸引资本，就必须与质押 (staking) 相竞争。&lt;/p&gt;

&lt;p&gt;这意味着 SOL 的名义利率很高。另一方面，ETH 则接近通货紧缩，其名义利率接近于零。你已经可以在行动中看到这一点：目前，在 Kamino 上借入 SOL 的成本几乎是在 AAVE 上借入 ETH 的三倍。&lt;/p&gt;

&lt;p&gt;第三，高名义利率会导致更多的质押。为了避免稀释，SOL 的所有者如果不质押，那就太傻了，但这会阻碍流动性。Solana 的质押参与率是以太坊的两倍多。以太坊持有者不会因为不质押而错过太多机会。这意味着市场上自由流通的 ETH 总比 SOL 多。&lt;/p&gt;

&lt;p&gt;更糟的是，Solana 的 LST 生态系统支离破碎。流动性质押代币不如 HQLAs 吸引人，但人们确实在使用它们，以太坊 DeFi 中就有大量的 Lido stETH。集中于单一 LST 可能不利于链的安全性，但反过来却有利于 DeFi。这意味着可能被认为“大到不能倒”的资产有了更多的流动性。&lt;/p&gt;

&lt;p&gt;第四，也许与直觉相反，Solana 的交易费用很低。这可能对用户有利，但对 SOL 的基本面不利 —— 费用是用户的成本，但也是质押者的收入。低费用意味着支付给质押者的大部分回报必须来自新币发行，也就是贬值。&lt;/p&gt;

&lt;p&gt;发行量和费用之间的相互作用决定了加密资产的实际利率（MEV 也起作用，但不包括在我的分析中）。&lt;/p&gt;

&lt;p&gt;ETH 的发行量很低，而手续费却很高，几乎所有的手续费都归质押者所有。这意味着它的实际收益率为正。在这方面，它甚至比比特币更好。比特币也具有很低的发行量和很高的手续费，但两者都归矿工所有，而不是持币者。&lt;/p&gt;

&lt;p&gt;SOL 的实际收益率几乎为负。除了活动高峰期，几乎所有的收益都来自于货币供应量的增加。&lt;/p&gt;

&lt;p&gt;ETH 也有燃烧机制。这增加了它的正实际收益率，同时也将价值返还给非质押者，从而降低了质押动机，降低了质押参与率，导致了更多的流动性。Solana 曾有燃烧机制，但后来决定取消。&lt;/p&gt;

&lt;p&gt;最后，以太坊的高额费用意味着 ETH 具有更高的便利收益率：用户会希望始终持有一些 ETH（而不质押）来支付未来的上链 gas 费用，从而增加 ETH 的可用供应量。&lt;/p&gt;

&lt;p&gt;ETH 比 SOL 具有更好的货币属性，而货币属性对于成为 HQLA 非常重要。&lt;/p&gt;

&lt;p&gt;这是一个复杂的论证，其中有许多变动的部分，但 SOL 在 Solana 的成功中缺乏重要性，这妨碍了它作为建立在其基础上的终极资产的资格。&lt;/p&gt;

&lt;p&gt;你甚至可以在 Solana 文化中看到这一点。连 aeyakovenko 都认为加密经济的安全性只是一种模因。但如果这是真的，那么链的代币的基础也就成了模因。&lt;/p&gt;

&lt;p&gt;安全-&amp;gt;币值-&amp;gt;安全的循环逻辑是任何加密货币的最终价值来源。这是中本聪最伟大的洞察力。&lt;/p&gt;

&lt;p&gt;这并不意味着 SOL 不能升值，甚至不能跑赢 ETH，因为目前在加密货币中，模因和声势比基本面更重要。&lt;/p&gt;

&lt;p&gt;但是，在以全新资产为基础重新构建的金融体系中，这些动态降低了 SOL 的重要性。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ETH 是加密货币中的 HQLA&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;随着市场慢慢意识到这一点，它作为 DeFi 币的增长速度可能会与 SOL 不相称，并有可能在某一天在价值和地位上超越比特币。金融领域的赢家通吃倾向非常强烈。&lt;/p&gt;

&lt;p&gt;本分析是思想的前沿，因此欢迎所有评论、提问和反驳。以下是完整的分析：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://omid-malekan.medium.com/eth-is-the-high-quality-liquid-asset-of-crypto-4d27ee77c127" rel="nofollow" target="_blank"&gt;https://omid-malekan.medium.com/eth-is-the-high-quality-liquid-asset-of-crypto-4d27ee77c127&lt;/a&gt; 】&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;最高增发 67,000 SOL/天（1240 万美元）&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;FTX 遗产里仍锁定着 4100 万 SOL（76 亿美元）。750 万 SOL（14 亿美元）将于 2025 年 3 月解锁，在 2028 年之前，每月还将解锁 6.09 万 SOL（1.13 亿美元）。大多数代币似乎是以约 64 美元/个的价格购买的。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;七、结论&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;与往常一样，卖镐和铲子的人从 Solana 模因币的繁荣中获利，而投机者却被洗劫一空，而且往往是在不知情的情况下。&lt;/p&gt;

&lt;p&gt;我认为，通常引用的 SOL 指标被严重夸大了。此外，绝大多数自然用户在链上的资金正在快速流失。我们目前正处于狂热阶段，散户的资金流入仍然超过了这些老练玩家的资金流出，从而产生了正面的观感。一旦用户对持续的损失感到疲倦，许多指标就会迅速崩溃。&lt;/p&gt;

&lt;p&gt;如上所述，SOL 还面临着一些基本面的不利因素，一旦情绪转向，这些因素就会凸显出来。任何价格上涨都会加剧通胀压力/解锁。&lt;/p&gt;

&lt;p&gt;归根结底，我认为从基本面的角度来看，SOL 的估值过高，虽然现有的情绪和势头很可能在短期内推动价格上涨，但长期的情况却更加不确定。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;免责声明：虽然我过去曾在不同时期持有 SOL，但目前并不持有 SOL 的实质性头寸。我在上文提出的许多观点都是我个人的推测，并非事实。我的假设和结论很可能是错误的。这不是财务建议，请务必自行调研。&lt;/em&gt;&lt;/p&gt;</description>
      <author>Fifi</author>
      <pubDate>Thu, 08 Aug 2024 12:20:11 +0800</pubDate>
      <link>https://soldev.cn/topics/61</link>
      <guid>https://soldev.cn/topics/61</guid>
    </item>
    <item>
      <title>重新理解 DePIN：一个实体论的角度</title>
      <description>&lt;p&gt;原文：&lt;a href="https://mp.weixin.qq.com/s/VUsMgxDRlSnOpWutkmLtYQ" rel="nofollow" target="_blank"&gt;https://mp.weixin.qq.com/s/VUsMgxDRlSnOpWutkmLtYQ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;作者：&lt;code&gt;Spike&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/ce878d03-d8be-49f9-8a72-49f13c0749b9.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;以往我们从比特币开始论述 DePIN 的发展史，但是以太坊转为 PoS 后整个加密世界呈现极端割裂的现状，一方面，比特币为代表的 PoW 模式纵有千般好，但是不可否认的现状也存在许久——绝大多数的链上活动，如 DeFi、NFT、GameFi 都发生在 EVM 生态之上。&lt;/p&gt;

&lt;p&gt;另一方面，硬件设备的虚拟化并非是 Web3 独有的趋向，绝大多数的底层物理硬件，如光纤、服务器，都离终端用户相当遥远，甚至于现实工业体系，其所承载的就业比例也不如服务业，即使我国如此强调工业和实业的重要性，第三产业的就业人数也占据了 48%（2021 年），解决了近半数人口的就业问题。&lt;/p&gt;

&lt;p&gt;因此在以太坊分叉之际，PoW 的信徒最终败北，除了比特币之外，几乎一无所存，但是在笔者看来，仍旧留存了两个希望的火种，&lt;strong&gt;其一是基于硬件的需求&lt;/strong&gt;，如存储、GPU 利用平台，总是需要足够冗余的存量资源才能存在额外的激励创造空间；&lt;strong&gt;其二是基于需求的硬件导向&lt;/strong&gt;，也就是 DePIN，此类业务总是需要硬件来承接业务需求。&lt;/p&gt;

&lt;p&gt;存储平台，如 Arweave 的逻辑建立在以下两点之上：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;世界的存储空间总量是远超实际需求的，并且可以被纳入统一的激励网络之内；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;对于矿工而言，兼顾效率和公平的激励模式就是工作量证明，因为数据量是客观的评价指标。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;当然，在实际运行中，音视频数据或者更具特殊性的数据会获得更多的激励权重，但是在总体上，追求更多客观数据存储量是矿工的目标，甚至可以基于此建立额外的激励机制，如 $U 便是基于存储费用二次发行的代币，用以直接鼓励用户上传数据。&lt;/p&gt;

&lt;p&gt;而第二类便是基于需求的硬件，也就是本来不存在此类硬件设备，或者说其用途本非 DePIN，但是因为在业务需求中产生了对硬件的强烈需求，因此最终需要建立在硬件上开展业务。&lt;/p&gt;

&lt;p&gt;以智能插座 Starpower 为例，在虚拟电厂（VPP）概念之下，传统的、中心化的发电将转移或分散至新兴的、分布式的能源模式，而在 Web3 模式中，用户转移至分布式能源提供商，不仅可减轻化石能源消耗，并且可以获得 $STAR 代币，而在足够强烈的用户意愿和庞大的用户规模下，其代币经济价值可获得长期的保持。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/d5f30f68-70c8-47f8-9279-1bd3b95466e2.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;换言之，在 DePIN 的叙事逻辑下，更接近于传统的商业售卖机制，用户购买的插座本身是一种日常化的、大众的需求，而在此基础上叠加 Web3 相关功能，便从一开始具备足够的承压池。&lt;/p&gt;
&lt;h2 id="以太坊之后，DePIN 便是唯一实体"&gt;以太坊之后，DePIN 便是唯一实体&lt;/h2&gt;
&lt;p&gt;严格意义而言，比特币才是最大的物理硬件支持方，全球至少有数百万级的矿机曾经或正在参与网络的运行，但是比特币缺乏足够的外溢性，其用途只能用于矿工，而无法提供应用价值。&lt;/p&gt;
&lt;h2 id="而 DePIN 在承担自身业务需求之外，实际上还承担着区块链和现实物理世界的链接作用。"&gt;而 DePIN 在承担自身业务需求之外，实际上还承担着区块链和现实物理世界的链接作用。&lt;/h2&gt;
&lt;p&gt;DePIN 是指将物理设备与区块链技术相结合，实现去中心化的管理和控制。传统的物理设备通常由中心化的实体或组织控制和管理，而 DePIN 通过区块链的分布式账本和智能合约技术，使设备的控制和管理变得去中心化、透明和可信。&lt;/p&gt;

&lt;p&gt;传统上，DePIN 的实现方式是将物理设备的信息和控制权记录在区块链上，通过智能合约实现设备的自动化管理和控制。这样一来，无论是设备的所有者、用户还是其他相关方，都可以通过区块链上的共识机制来验证设备的状态和操作。同时，由于区块链的不可篡改性和去中心化特性，DePIN 可以有效防止设备数据的篡改和操纵，提高设备的安全性和可靠性。&lt;/p&gt;

&lt;p&gt;而从实体论的角度出发，世界必须被切分为可观测的世界和不可观测的世界，这两个部分相互对立，无法协调，只有在这种划分模式下，最基本的实体才有可能被确认，随后被认识和讨论。&lt;/p&gt;

&lt;p&gt;PoW 机制实际上也是如此，以比特币为例，电力需要经过矿机才能被转化为比特币，而电力消耗是被广泛承认的物质消耗过程，DePIN 也是如此，数据总是需要经过特殊的硬件才能被区块链所采纳。&lt;/p&gt;

&lt;p&gt;但是 PoS 并非如此，以太坊中的数据是一种计算后的表示，其实际运行并无真正的硬件设备相对应，用户不需要特定设备才能使用，开发者也无需投入专用硬件才能接入网络，甚至是矿工群体本身——维护网络运行的专业人群，也化身为质押代币提供者，而失去了专业分工的必要性。&lt;/p&gt;

&lt;p&gt;从广泛意义上而言，目前以太坊等 PoS 链占据了绝大多数的 TVL，PoW 模式除比特币之外，Arweave、Filecoin 等占比较低，如果这种情况持续下去，区块链将缺乏足够的物理层，成为 Web2 框架的一部分，而无法真正建立起自身的抗审查性。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/652ec0bc-87f3-4b03-8d7b-c79b09c3e9df.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;如果底层硬件缺乏足够的保有量，那么其上的去中心化与否都将失去意义。PoW 的重要性，并非是耗电量高可以抹除的，在比特币之外，大部分 DePIN 模式都以节能为主要目标。&lt;/p&gt;

&lt;p&gt;除此之外，如果直接将区块链网络架构在现有网络设施上，还会存在以下问题：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据缺乏通用性&lt;/strong&gt;。传统物理设备通常由不同的制造商和供应商提供，这导致了设备之间的互操作性问题。例如，不同设备之间的数据传输和共享可能会受到限制，从而降低了设备的效率和灵活性。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;侵犯用户隐私&lt;/strong&gt;。传统物理设备通常需要用户提供个人和敏感数据，例如身份信息、财务信息等。由于中心化的管理，用户的数据可能会被滥用或泄露，从而导致数据隐私的问题。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据缺乏可用性&lt;/strong&gt;。传统物理设备需要用户对设备提供的数据和信息进行信任。然而，由于中心化的控制和管理，用户无法验证这些数据的真实性和完整性。这可能导致用户对设备的信任度降低。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;系统缺乏健壮性&lt;/strong&gt;。传统物理设备通常由中心化的机构或组织控制和管理，这导致了数据的单点故障和潜在的安全风险。例如，如果一个中心化的物理设备被攻击或故障，整个系统可能会瘫痪。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;目前来看，PoS 机制具备更强的能源友好性，以及极强的扩容能力，只要不超越底层硬件的物理限制，那么 PoS 的扩容能力可以持续提升，比如 L2/L3---LN 层，通过 restaking（再质押）机制，的确可以保证网络的安全性。&lt;/p&gt;

&lt;p&gt;但是 DePIN 的价值取向仍旧具备重要意义，安全和去中心化依然依赖于物理硬件，如前所述，DePIN 的安全程度取决于硬件设备，而硬件设备可以具备足够的分散性，尤其是智能插座等产品，理论上可以遍及全球各户人家，而无需考虑集中度问题。&lt;/p&gt;

&lt;p&gt;本质上，DePIN 是在解决数据来源和可信性问题，其和 PoS 并非对立关系，更多是一种补齐，在比特币和以太坊代表的区块链发展模式之争之外，还有 DePIN 的折中选择。&lt;/p&gt;

&lt;p&gt;其运作逻辑可以归纳为，DePIN 依赖硬件设备产生数据，数据上传后可进入 PoS 搭建经济模型，进一步而言，数据可存储至 Arweave，数据在硬盘中保存，完成数据和经济价值的双重流转。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/ede66b9e-0f37-4c3a-95d5-d6f015030742.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;另外，&lt;strong&gt;DePIN 的设备价格远逊于比特币和以太坊质押成本&lt;/strong&gt;，Starpower 等设备售卖价格在数百元美元级别，而比特币矿机和 32 个 ETH 价格在数万级别，如果参与各类云挖矿或者 LSD 协议，则又会失去对硬件设备的控制权。&lt;/p&gt;

&lt;p&gt;本质上，DePIN 是控制权民主化的最优解，以较低廉的价格实现，而非以理论上的可行掩盖不可实操性。&lt;/p&gt;

&lt;p&gt;可以总结以下，DePIN 对于区块链的意义有三点：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;去中心化控制：&lt;/strong&gt;DePIN 通过区块链技术将设备的控制权分散给多个参与方，实现去中心化的管理和控制。这样一来，不仅可以提高设备的灵活性和响应速度，还可以防止单点故障和单点攻击，提高设备的可靠性和安全性。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据可信性：&lt;/strong&gt;DePIN 将设备的信息和操作记录在区块链上，实现了信息的透明和可追溯。任何人都可以通过区块链上的共识机制来验证设备的状态和操作，保证设备的可信性和公正性。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;永久安全：&lt;/strong&gt;DePIN 利用区块链的不可篡改性和去中心化特性，防止设备数据的篡改和操纵。设备的数据和操作记录都被加密和分布存储在区块链上，只有授权的参与方才能访问和修改数据，提高设备的数据安全性。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="DePIN 新思路：日常化和客观性"&gt;DePIN 新思路：日常化和客观性&lt;/h2&gt;
&lt;p&gt;DePIN 重新构建数据的客观性，这和前文提到的 Arweave 原理是一致的，具体而言，需要以下手段去组织客观性的数据，从数据的生产，数据的流转以及最终的存储。&lt;/p&gt;

&lt;p&gt;DePIN 在区块链中的重要性之一是提高数据安全性。传统的中心化架构中，数据存储在集中的服务器上，这使得数据容易受到黑客攻击或数据泄露的风险。而 DePIN 的引入可以将数据存储和处理分散到多个节点上，从而降低了单点故障的风险，并增加了数据的安全性。&lt;/p&gt;

&lt;p&gt;通过使用 DePIN，&lt;strong&gt;数据可以被分散存储在多个设备上，每个设备只存储部分数据，这样即使某个设备被攻击或故障，其他设备仍然可以继续提供服务&lt;/strong&gt;。同时，DePIN 还可以使用加密技术来保护数据的隐私和完整性，确保数据在传输和存储过程中不被篡改或泄露。&lt;/p&gt;

&lt;p&gt;另外，DePIN 还可以通过使用区块链技术来实现数据的透明性和不可篡改性。Arweave 是一个公开的分布式账本，所有的交易和数据都被记录在链上，并且不可篡改。通过将数据存储在  Arweave 等区块链上，可以确保数据的完整性和可追溯性，防止数据被篡改或伪造。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;综上所述，DePIN 在区块链中的重要性之一是提高数据安全性，进而构建数据生产的客观性。&lt;/strong&gt;通过分散存储和加密保护数据，以及利用区块链技术实现数据的透明性和不可篡改性，可以有效地提高数据的安全性，保护用户的隐私和权益。&lt;/p&gt;

&lt;p&gt;除此之外，DePIN 的重要性在于它能够增加区块链系统的可信度和透明度。传统的中心化系统存在着信息不对称和信任问题，而 DePIN 的数据流转完全在链上，通过避免自建网络的脆弱性，比如，Starpower 的数据将会广播至 Arweave 之上。&lt;/p&gt;

&lt;p&gt;DePIN 能够提供更加可靠的数据来源。在传统的中心化系统中，数据往往由单一的机构或个人控制和管理，这容易导致数据的篡改和伪造。而在去中心化的系统中，物理设备的数据被多个节点共享和验证，确保了数据的真实性和完整性。例如，在 Starpower 的数据管理中，通过将物理设备与区块链绑定，可以实现对物流信息的实时追踪和验证，确保数据的准确性和可信度。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/1df984d7-84ac-44d7-9916-21149bdfcc6b.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;DePIN 可以提高系统运转的透明度。在传统的 DePIN 系统设计中，用户往往无法获得完整的信息和数据流动路径，导致信息的不透明和不可追溯。而 Arweave 实现的去中心化的系统通过将物理设备的数据记录在区块链上，实现了信息的公开和可追溯性。用户可以通过区块链浏览器等工具查看和验证数据的流动路径，确保数据的透明性和可追溯性。例如，在虚拟电厂领域，Starpower 是第一个通过将物理设备与 Arweave 进行绑定，可以实现对插座溯源数据的公开和透明，让用户能够了解数据的生产和流通过程。&lt;/p&gt;

&lt;p&gt;综上所述，&lt;strong&gt;DePIN 的重要性在于它能够增加区块链系统的可信度和透明度&lt;/strong&gt;。通过提供可靠的数据来源和实现信息的公开和可追溯性，DePIN 为区块链系统的应用提供了更加可信和透明的基础。&lt;/p&gt;

&lt;p&gt;最后，DePIN 在区块链中的重要性体现在降低中心化风险方面，数据在 Arweave 之上会存在 1000 个左右的备份。传统的中心化系统存在单点故障的风险，一旦中心节点发生故障或被攻击，整个系统将面临瘫痪的风险。而 DePIN 的引入 Arweave 进行数据永存可以分散系统的风险，提高系统的可靠性和稳定性。&lt;/p&gt;

&lt;p&gt;通过将物理设备分散到不同的地理位置和不同的参与方手中，DePIN 可以避免单一节点的故障对整个系统的影响。即使某个节点发生故障，其他节点仍然可以继续运行和提供服务，从而保证了系统的连续性和可用性。&lt;/p&gt;

&lt;p&gt;此外，DePIN 还可以降低系统被攻击的风险。在传统的中心化系统中，攻击者只需要攻击中心节点就能够瘫痪整个系统。而在去中心化系统中，攻击者需要同时攻击多个节点才能对系统造成严重影响，增加了攻击的难度和成本。&lt;/p&gt;

&lt;p&gt;DePIN 在区块链中的重要性体现在降低中心化风险各个方面。通过分散设备和权力，可以提高系统的可靠性、稳定性和安全性，从而更好地保护用户的数据和资产。&lt;/p&gt;
&lt;h2 id="everVision 技术堆栈：DePIN 技术服务包"&gt;everVision 技术堆栈：DePIN 技术服务包&lt;/h2&gt;
&lt;p&gt;DePIN 数据在上传至 Arweave 之上后，并非单纯的数据存储服务，而是会包括代币、积分系统、数据管理以及接入以太坊网络的完整服务。&lt;/p&gt;

&lt;p&gt;比如，在 DePIN 设计中，支持智能合约的执行具有重要意义，智能合约是区块链技术的重要应用之一，它可以在没有第三方的情况下自动执行合约条款，具体而言其作用如下：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;自动化执行：&lt;/strong&gt;支持智能合约的 DePIN 可以自动执行合约条款，无需人工干预。这可以大大提高合约执行的效率和准确性，减少人为错误的发生。例如，当某个条件满足时，智能合约可以自动触发设备的操作，比如 Starpower 的数据上传操作，积分记录等，而无需人工干预，节省人工干预的耗时以及规避中心化操作；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;透明度和可验证性：&lt;/strong&gt;智能合约的执行过程在区块链上是可追溯的，每一步操作都会被记录下来。这意味着任何人都可以验证合约的执行情况，确保合约的公正性和可信度，对于 Starpower 后续的推广具备重要意义；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据安全性：&lt;/strong&gt;支持智能合约的 DePIN 可以通过加密和数字签名等技术保护合约的安全性。这意味着合约的内容和执行过程都是安全的，不容易被篡改或操纵。比如，Arweave 网络本身数据是开放、可查的，但是结合 Mind Network 等隐私服务，可以规避个人信息的公开，而只上传插座数据；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;灵活性和可编程性：&lt;/strong&gt;智能合约可以根据需要进行编程和定制，可以根据不同的业务需求进行灵活的调整和扩展。这意味着 DePIN 可以适应不同的应用场景和业务需求，提供更加个性化和定制化的服务。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;综上所述，支持智能合约的执行是 DePIN（DePIN）在区块链中的重要性之一。而在 everVision 的规划中，以上都可使用 everpay 进行管理，比如搭建内置的数据上传服务，并且可直接搭建用户身份系统，比如 EverID 可支持手机号和邮件登录。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Web3Infra 提供系列开发组件。Arseeding 负责上传和同步数据，提供了 Arweave 网关功能，并可以用来上传和下载和广播任何 AR 原生交易和数据，开发者无需同步 Arweave 全量数据，只需要关心当前业务产生的数据。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Arseeding 支持 bundle（ANS-104）交易类型。相比于 AR 原生交易，bundle 交易类型更加适用于文件小数量多的存储场景。在使用 bundle 进行文件存储时，Arseeding 支持使用 everPay 进行存储费用支付，这意味着持有 ETH、USDC 等代币也可以使用 Arweave 的文件存储服务；同时，Arseeding 能 100% 保证文件上传 Arweave 节点，提升开发者的存储体验。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;goar 是 Arweave 官方认证的 golang SDK，golang 的开发者可以利用 goar 方便的与 Arweave 进行交互，包括交易的签名、发送、获取和解析，数据上传，区块信息的获取和解析等操作。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Arsyncer 是一个高性能的 Arweave 交易同步工具。支持同步所有的 Arweave 交易，支持同步指定 Tag 信息的交易，支持同步 Smartweave（Arweave 智能合约）交易信息，以及同步区块信息。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/4ac160d1-a9b1-4308-b9f8-566a8456b388.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;仅以 Starpoer 规划的应用场景为例，个人用户是起点，但是也将会逐步扩张至更多场景，比如商业办公区、汽车或者工业环境中，人类的电气化和信息化逐步扩张，已经不局限于家庭一隅。&lt;/p&gt;

&lt;p&gt;大致而言，围绕人类的生活场景，DePIN 的应用场景可以归类为以下几种：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;一。车联网&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;电动化汽车是车联网的一个新兴的数据原点，涉及到数据从汽车终端到最终用户的整个传输过程。传统的车联网系统，通常依赖于集中式的数据库和较为中心化的管理机构，这样容易导致数据的不透明和操控的风险。然而，通过利用 everVision 技术堆栈和 Starpower 的插座设计，可以实现更加透明和安全的数据跟踪。&lt;/p&gt;

&lt;p&gt;在 Arseeding 中，多笔交易都会被记录在一个 Bundle 哈希中，任何参与方都可以查看和验证这些交易。通过将物流信息与区块链上的交易数据进行关联，可以实现实时的数据跟踪。每一个 Starpower 设备都可以通过智能合约与区块链进行交互，记录自身的位置和状态信息。这样，Starpower 的各个数据节点都可以实时监控汽车的位置和数据生产情况，从而提高物数据的可见性和透明度。&lt;/p&gt;

&lt;p&gt;此外，利用 everPay 还可以防止数据的篡改和操控。每一个物理设备都可以通过自身的私钥对交易数据进行签名，确保数据的完整性和真实性。如果有人试图篡改数据，区块链网络中的其他节点会通过共识算法来验证数据的正确性，从而防止数据的篡改。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;二。智能家居&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;智能家居是 Starpower 的一个重要应用场景，DePIN 在智能家居中的应用还处于极早期的。通过将物理设备连接到区块链网络中，可以实现智能家居设备之间的互联互通，实现智能家居系统的自动化和智能化控制。例如，通过将智能门锁、智能摄像头、智能家电等物理设备连接到区块链网络中，可以实现远程控制和管理，用户可以通过手机 APP 或者云端平台实时监控和控制家中的设备，实现智能家居的便捷和安全。&lt;/p&gt;

&lt;p&gt;同时，区块链技术的去中心化特性也可以保证智能家居设备之间的数据共享和交互的安全性和可信度，避免了中心化服务器的单点故障和数据泄露的风险。&lt;/p&gt;

&lt;p&gt;未来，借助 Starpower 的插座系统，任意家庭设备都可具备一定程度的智能功能，并且数据产生的价值也可被永久保存至 Arweave 之上。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;三。工业物联网&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;传统上，工业物联网是指将物理设备、传感器、网络和云计算等技术应用于工业生产和制造过程中，实现设备之间的互联互通和数据的实时监测和分析。&lt;/p&gt;

&lt;p&gt;结合 Starpower，未来的工业物联网中，DePIN 的应用也具有重要意义。通过将工业设备和传感器连接到区块链网络中，可以实现设备之间的数据共享和交互，实现工业生产的自动化和智能化控制。&lt;/p&gt;

&lt;p&gt;例如，在智能工厂中，通过将 Starpower 设备和传感器连接到 Arweave 网络中，可以实现设备之间的实时监测和数据分析，提高生产效率和质量，并且通过区块链的去中心化特性，可以确保生产数据的安全性和可信度，避免了数据篡改和伪造的风险。&lt;/p&gt;

&lt;p&gt;四。城市基础设施&lt;/p&gt;

&lt;p&gt;如果一切顺利，DePIN 在城市基础设施中的应用将是最终节能解决方案之一。通过将城市基础设施，如道路、桥梁、水电气等设施连接到 Starpower 网络中，可以实现设施之间的实时监测和管理。例如，在智慧城市中，通过将城市基础设施设备连接到区块链网络中，可以实现设备之间的数据共享和交互，实现城市基础设施的自动化和智能化控制。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/36788835-b229-46ad-85e9-794a267a9191.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;以上各个应用场景基本延续从个人生活、消费和生产的全部环境，不仅如此，Starpower 也可支持 B2B2C 的定制化模式，为 B 端客户定制化生成设备，并同步加入自身的激励网之中。比如，Starpower 可以和电厂合作，电厂进而为使用 Starpower 设备的用户进行电费折扣，以支持用户参与节能减排的历史大潮之中。&lt;/p&gt;

&lt;p&gt;气候变化已经是日常化的现状，而 Starpower 和 Arweave 的结合就是希望将每个人纳入节能减排的供给端，做为主动的一方去参与到全球气候变化的新常态中，而非做被动的接受者。&lt;/p&gt;

&lt;p&gt;其中的关键就在于代币经济学机制，参与网络购买的设备可以持续生成利润，现代人类可以不炒币，但是不可能不用电，其上的用户是无限的。&lt;/p&gt;

&lt;p&gt;现在的，能源交易是一个复杂的过程，涉及到多个参与方之间的交互和协调。比如碳交易，基本上只能在国家、大型企业之间流转，比如特斯拉通过售卖配给的碳积分，在十年时间之内赚取了 54 亿美元的收入，而与此同时，个人用户基本上无法参与其中，而 DePIN 的出现可将每个人纳入交易体系之内。&lt;/p&gt;

&lt;p&gt;通过将能源设备（如太阳能板、风力发电机等）连接到区块链网络中，可以实现能源的去中心化生产和分配。这样一来，能源交易不再依赖于中心化的交易平台，而是通过智能合约在区块链上进行。&lt;/p&gt;

&lt;p&gt;此外，DePIN 还可解决数据可信性的问题，传统的交易系统之所以排斥个人，主要原因在于个人用户的数据无法统计，而 Starpower 希望将越来越多的个人日常设备纳入其中，从根本上解决这一问题。&lt;/p&gt;</description>
      <author>Fifi</author>
      <pubDate>Fri, 02 Aug 2024 13:45:02 +0800</pubDate>
      <link>https://soldev.cn/topics/58</link>
      <guid>https://soldev.cn/topics/58</guid>
    </item>
    <item>
      <title>sRFC 29 —— 改进 Blinks 和 Actions 的输入类型</title>
      <description>&lt;p&gt;原文：&lt;a href="https://forum.solana.com/t/srfc-29-input-types-of-blinks-and-actions/1804" rel="nofollow" target="_blank"&gt;https://forum.solana.com/t/srfc-29-input-types-of-blinks-and-actions/1804&lt;/a&gt;   &lt;/p&gt;

&lt;p&gt;作者：&lt;a href="https://x.com/nickfrosty" rel="nofollow" target="_blank"&gt;https://x.com/nickfrosty&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="概要"&gt;概要&lt;/h2&gt;
&lt;p&gt;在 blink 客户端中添加新的输入类型，以改善用户体验，并为 Action 开发者解锁新用例。&lt;/p&gt;
&lt;h2 id="原由"&gt;原由&lt;/h2&gt;
&lt;p&gt;当前的 Solana Actions 和 blinks 规范仅支持单一的、通用的非结构化文本框输入类型。虽然这种基本输入很有用，但拥有更明确和声明性的输入类型将允许 Action 开发者和 blink 客户端解锁新的用例，并改善在互联网上使用 blinks 的用户体验。&lt;/p&gt;
&lt;h2 id="当前的规范"&gt;当前的规范&lt;/h2&gt;
&lt;p&gt;根据当前的规范，Action API 将使用初始 GET 请求的结构化响应（&lt;code&gt;ActionGetResponse&lt;/code&gt;）来声明它需要的用户输入字段，特别是通过&lt;code&gt;links.actions&lt;/code&gt;中包含&lt;code&gt;parameters&lt;/code&gt;字段的任何子项。&lt;/p&gt;

&lt;p&gt;当前的规范是这样的：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * Response body payload returned from the Action GET Request
 */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ActionGetResponse&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/** image url that represents the source of the action request */&lt;/span&gt;
  &lt;span class="nl"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cm"&gt;/** describes the source of the action request */&lt;/span&gt;
  &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cm"&gt;/** brief summary of the action to be performed */&lt;/span&gt;
  &lt;span class="nl"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cm"&gt;/** button text rendered to the user */&lt;/span&gt;
  &lt;span class="nl"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cm"&gt;/** UI state for the button being rendered to the user */&lt;/span&gt;
  &lt;span class="nx"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cm"&gt;/**  */&lt;/span&gt;
  &lt;span class="nx"&gt;links&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/** list of related Actions a user could perform */&lt;/span&gt;
    &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LinkedAction&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="cm"&gt;/** non-fatal error message to be displayed to the user */&lt;/span&gt;
  &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;ActionError&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Related action on a single endpoint
 */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;LinkedAction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/** URL endpoint for an action */&lt;/span&gt;
  &lt;span class="nl"&gt;href&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cm"&gt;/** button text rendered to the user */&lt;/span&gt;
  &lt;span class="nl"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cm"&gt;/** parameters used to accept user input within an action */&lt;/span&gt;
  &lt;span class="nx"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;ActionParameter&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;p&gt;任何 &lt;code&gt;ActionParameter&lt;/code&gt; 声明都将被渲染成纯文本输入呈现给用户（带有可选的占位符文本），以便接受他们的输入，最终通过 POST 请求发送 Action API 端点。&lt;/p&gt;

&lt;p&gt;此外，用户输入数据仅通过在特定 linked action 的&lt;code&gt;href&lt;/code&gt;字段中声明的查询参数和模板字面量（例如：&lt;code&gt;{name}&lt;/code&gt; ）发送到 Action API。在接受更长的用户输入值或更复杂的输入类型时，这会带来限制和复杂性。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * Parameter to accept user input within an action
 */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ActionParameter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/** parameter name in url */&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cm"&gt;/** placeholder text for the user input field */&lt;/span&gt;
  &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cm"&gt;/** declare if this field is required (defaults to `false`) */&lt;/span&gt;
  &lt;span class="nx"&gt;required&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;boolean&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;h2 id="提案"&gt;提案&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; 为支持将更长的和更复杂的用户输入（通过 POST 请求）发送到 Action API，用户输入应可选地通过 POST 请求&lt;code&gt;正文（body）&lt;/code&gt;发送，而不仅仅是通过模板化的查询参数（例如已被发送的用户的&lt;code&gt;account&lt;/code&gt;地址）。对于每个&lt;code&gt;LinkedAction&lt;/code&gt;，所有用户输入都应以如下的方式被发送到 Action API：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;在&lt;code&gt;href&lt;/code&gt;值的查询参数中通过模板字面量指定的任何&lt;code&gt;parameters&lt;/code&gt;输入都应该通过其命名的查询参数发送各自的用户输入值（这是规范当前的运作方式）；&lt;/li&gt;
&lt;li&gt;剩下的所有&lt;code&gt;parameters&lt;/code&gt;输入（也就是那些没有在&lt;code&gt;href&lt;/code&gt;中声明模板字面量的输入）应该在 POST 请求的&lt;code&gt;正文&lt;/code&gt;中发送（与用户的&lt;code&gt;account&lt;/code&gt;一起发送，但永远不能修改&lt;code&gt;account&lt;/code&gt;值）；&lt;/li&gt;
&lt;li&gt;注意：如果任何&lt;code&gt;parameters&lt;/code&gt;的模板字面量被找到，它就不应该通过&lt;code&gt;正文&lt;/code&gt;发送。这将减少通过网络发送的总数据，不发送重复数据从来也都是最佳的做法。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;最终，这会允许开发人员通过查询参数（不破坏现有的应用程序）或通过 POST 请求&lt;code&gt;正文&lt;/code&gt;接受用户输入。并可以像典型的 HTML 表单一样，有效地设置隐式默认使用 POST 正文来接收用户输入。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; 更新&lt;code&gt;ActionParameter&lt;/code&gt;以支持声明不同类型的用户输入，并允许为更复杂的输入提供正则表达式匹配模式。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;更新后的&lt;code&gt;ActionParameter&lt;/code&gt;应如下所示：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * Parameter to accept user input within an action
 */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ActionParameter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/** input field type */&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;ActionParameterType&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cm"&gt;/** regular expression pattern to validate user input client side */&lt;/span&gt;
  &lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cm"&gt;/** human readable description of the `pattern` */&lt;/span&gt;
  &lt;span class="nx"&gt;patternDescription&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cm"&gt;/** parameter name in url */&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cm"&gt;/** placeholder text for the user input field */&lt;/span&gt;
  &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cm"&gt;/** declare if this field is required (defaults to `false`) */&lt;/span&gt;
  &lt;span class="nx"&gt;required&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;boolean&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;p&gt;该&lt;code&gt;匹配模式（pattern）&lt;/code&gt;等同于有效的正则表达式字符串。blink 客户端应在发出 POST 请求前使用该正则表达式匹配模式来验证用户输入。如果&lt;code&gt;匹配模式&lt;/code&gt;不是有效的正则表达式，客户端就会忽略它。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;匹配模式描述（patternDescription）&lt;/code&gt;是描述正则表达式&lt;code&gt;匹配模式&lt;/code&gt;的人类可读信息。如果提供了&lt;code&gt;匹配模式&lt;/code&gt;，则必须提供&lt;code&gt;匹配模式描述&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;如果用户输入值根据&lt;code&gt;匹配模式&lt;/code&gt;被认为无效，用户在客户端就会收到一条错误信息，提示输入字段无效，并显示&lt;code&gt;匹配模式描述&lt;/code&gt;字符串。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;在大多情况下，&lt;code&gt;类型（type）&lt;/code&gt;类似于标准的 &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input" rel="nofollow" target="_blank" title=""&gt;HTML 输入元素&lt;/a&gt;。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;新的&lt;code&gt;类型&lt;/code&gt;属性应有如下的类型声明：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * Input type to present to the user 
 * @default `text`
 */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ActionParameterType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;date&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;datetime-local&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;checkbox&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;radio&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;textarea&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;select&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每一个提出的&lt;code&gt;类型&lt;/code&gt;值通常应该生成一个用户输入字段，类似于相应的&lt;code&gt;类型&lt;/code&gt;的标准 HTML&lt;code&gt;输入&lt;/code&gt;元素（即 &amp;lt;输入类型 = "email" /&amp;gt;） ，以提供更好的客户端验证和用户体验：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;text&lt;/code&gt; - 等同于 HTML &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/text" rel="nofollow" target="_blank" title=""&gt;“text” input&lt;/a&gt;元素&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;email&lt;/code&gt; - 等同于 HTML &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email" rel="nofollow" target="_blank" title=""&gt;“email” input &lt;/a&gt;元素&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;url&lt;/code&gt; - 等同于 HTML &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/url" rel="nofollow" target="_blank" title=""&gt;“url” input&lt;/a&gt;元素&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;number&lt;/code&gt; - 等同于 HTML &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/number" rel="nofollow" target="_blank" title=""&gt;“number” input&lt;/a&gt;元素&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;date&lt;/code&gt; - 等同于 HTML &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date" rel="nofollow" target="_blank" title=""&gt;“date” input&lt;/a&gt;元素&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;datetime-local&lt;/code&gt; - 等同于 HTML &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local" rel="nofollow" target="_blank" title=""&gt;“datetime-local” input&lt;/a&gt;元素&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;checkbox&lt;/code&gt; - 等同于一组标准的 HTML &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/checkbox" rel="nofollow" target="_blank" title=""&gt;“checkbox” input&lt;/a&gt;元素。Action API 应返回如下所示的&lt;code&gt;选项（options）&lt;/code&gt;。用户应能于所提供的 checkbox 选项中进行多选。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;radio&lt;/code&gt; - 等同于一组标准的 HTML &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/radio" rel="nofollow" target="_blank" title=""&gt;“radio” input&lt;/a&gt;元素。Action API 应返回如下所示的&lt;code&gt;选项&lt;/code&gt;。用户只能于所提供的 radio 选项中选择一项。&lt;/li&gt;
&lt;li&gt;目前不支持上述未说明的其它 HTML 输入类型（&lt;code&gt;hidden&lt;/code&gt;, &lt;code&gt;button&lt;/code&gt;, &lt;code&gt;submit&lt;/code&gt;, &lt;code&gt;file&lt;/code&gt;, 等等）。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;除了上述类似 HTML 输入类型的元素外，还支持以下用户输入元素：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;textarea&lt;/code&gt; - 等同于 HTML &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea" rel="nofollow" target="_blank" title=""&gt;textarea element&lt;/a&gt;元素。用户可进行多行输入。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;select&lt;/code&gt; - 等同于 HTML &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select" rel="nofollow" target="_blank" title=""&gt;select element&lt;/a&gt;元素。用户会体验一个“下拉”样式的字段。Action API 应返回如下所示的&lt;code&gt;选项&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;当&lt;code&gt;类型&lt;/code&gt;设置为&lt;code&gt;选择（select）&lt;/code&gt;、&lt;code&gt;复选框（checkbox）&lt;/code&gt;或&lt;code&gt;单选框（radio）&lt;/code&gt;时，Action API 应包含一个&lt;code&gt;选项&lt;/code&gt;数组，每个选项至少提供一个&lt;code&gt;标签（label）&lt;/code&gt;和&lt;code&gt;值（value）&lt;/code&gt;。每个选项还可以有一个&lt;code&gt;选中（selected）&lt;/code&gt;值，以告知 blink 客户端用户在默认情况下应选择哪个选项（参见复选框和单选框的区别）。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ActionParameterSelectable&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;ActionParameter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/** displayed UI label of this selectable option */&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="cm"&gt;/** value of this selectable option */&lt;/span&gt;
    &lt;span class="nl"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="cm"&gt;/** whether or not this option should be selected by default */&lt;/span&gt;
    &lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;boolean&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果没有设置&lt;code&gt;类型&lt;/code&gt;或设置了未知/不支持的值，blink 客户端应默认为&lt;code&gt;文本（text）&lt;/code&gt;，并呈现一个简单的文本输入（正如他们目前的做法）。&lt;/p&gt;

&lt;p&gt;Action API 仍负责验证和清理用户输入参数中的所有数据，并在必要时强制执行任何“必需的”用户输入。&lt;/p&gt;

&lt;p&gt;对于其它基于 HTML/web 的平台（如本地移动平台），应使用等效的本地用户输入组件，以获得与上述 HTML/web 输入类型相同的体验和客户端验证。&lt;/p&gt;

&lt;p&gt;注意：与当前规范一样，如果&lt;code&gt;LinkedAction&lt;/code&gt;没有声明&lt;code&gt;parameters&lt;/code&gt;属性，那么 Action API 就不会请求用户输入，blink 客户端应继续渲染一个向&lt;code&gt;href&lt;/code&gt;端点执行 POST 请求的单个按钮。本提案不会改变这一点。&lt;/p&gt;
&lt;h2 id="结语"&gt;结语&lt;/h2&gt;
&lt;p&gt;随着对更多输入类型的支持，开发人员将能够构建更复杂的 blinks，并接受更多的用户输入。户输入字段“过多”可能会降低用户体验，也会降低用户实际输入所有要求输入内容的可能性。&lt;/p&gt;

&lt;p&gt;为了避免用户界面（UI）臃肿和降低用户体验，blink 客户端可能会对其显示的输入字段数量进行“软限制”。虽然本 Actions/blink 规范避免对 blinks 的用户界面层采取见仁见智的做法，但以下是一个合理的指导原则（目前 Dialect 的 blinks SDK 也在使用）：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10 个按钮 + 3 个输入（如果是独立的 Actions）&lt;/li&gt;
&lt;li&gt;10 个输入（如果是一个表单，且当响应中有表单时不渲染其它操作）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;因此，Action API 开发人员应限制所请求的输入&lt;code&gt;parameters&lt;/code&gt;数量，因为 blink 客户端可能会限制向用户显示的输入字段数量。开发人员还应记住，如果用户看不到所有的输入字段（因为 blink 客户端软限制了这些字段，如上所述），那么用户将无法输入值。因此，如果所有这些字段都是 Action API 所要求的，用户将&lt;strong&gt;无法&lt;/strong&gt;实际执行你的 Action 并达成交易。&lt;/p&gt;</description>
      <author>Fifi</author>
      <pubDate>Tue, 30 Jul 2024 20:10:04 +0800</pubDate>
      <link>https://soldev.cn/topics/56</link>
      <guid>https://soldev.cn/topics/56</guid>
    </item>
    <item>
      <title>Jito Restaking 重磅发布，搭建新一代基础设施平台 </title>
      <description>&lt;p&gt;原文：&lt;a href="https://x.com/jito_sol/status/1816488798374830164" rel="nofollow" target="_blank"&gt;https://x.com/jito_sol/status/1816488798374830164&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/48cab535-f3ff-48a4-94d5-e08e7105e904.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Jito Foundation 很高兴发布 Jito Restaking 代码 —— 一个混合的质押，再质押和 LRT 模块。&lt;/p&gt;
&lt;h2 id="什么是 Jito Restaking？"&gt;什么是 Jito Restaking？&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;全文链接：&lt;/strong&gt; &lt;a href="https://soldev.cn/topics/57" rel="nofollow" target="_blank"&gt;https://soldev.cn/topics/57&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Jito Restaking 有两个组成部分：Vault 程序和 Restaking 程序。&lt;/strong&gt;
它们共同创建了可扩展的基础架构，用于管理已质押资产，并以 AVS（Actively Validated Services，主动验证服务）为中心进行构建。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vault 程序管理流动性再质押代币（LRT），它可以支持任意数量的 SPL 代币，处理铸币和委托，并执行灵活的罚没条件。&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Restaking 程序管理 AVS 和运营商，后者负责协调关系、实施选择加入/退出机制、管理奖励和罚没惩罚。&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Jito Restaking 是一个灵活、多资产的网络共识和经济安全解决方案。&lt;/strong&gt;
它提高了代币的实用性，支持多样化的质押策略，支持确保 L2 排序器、保险基金、跨链桥安全的网络。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;对于 AVS 提供商：&lt;/strong&gt;加速创新、提高代币效用、通过可定制的罚没确保网络安全、释放流动性并管理风险。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;对于节点运营商、质押者和授权管理者：&lt;/strong&gt;控制风险概况，通过透明的评估做出明智的决策，并从安全的生态系统中获益。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;接下来：Jito Restaking 正在进入审计和正式验证程序。&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;在此查看源代码：&lt;a href="https://github.com/jito-foundation/restaking" rel="nofollow" target="_blank"&gt;https://github.com/jito-foundation/restaking&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;欢迎 AVS 方填写此表：&lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSfgJ8lIFJDCQ0X9q6YpCW6B7igF0HNwafVxNH8xc9p8XTyxaw/viewform" rel="nofollow" target="_blank"&gt;https://docs.google.com/forms/d/e/1FAIpQLSfgJ8lIFJDCQ0X9q6YpCW6B7igF0HNwafVxNH8xc9p8XTyxaw/viewform&lt;/a&gt;&lt;/p&gt;</description>
      <author>Fifi</author>
      <pubDate>Fri, 26 Jul 2024 18:10:36 +0800</pubDate>
      <link>https://soldev.cn/topics/55</link>
      <guid>https://soldev.cn/topics/55</guid>
    </item>
    <item>
      <title>FMG 发布最新研报《The Future of DePIN》，深挖文中十五个要点精华</title>
      <description>&lt;p&gt;原文：&lt;a href="https://x.com/dr_andrewlaw/status/1801971711962689576" rel="nofollow" target="_blank"&gt;https://x.com/dr_andrewlaw/status/1801971711962689576&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/fd0026c6-cb52-4b6d-b0ff-e23a3dfbc9ef.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="什么是DePIN"&gt;什么是 DePIN&lt;/h2&gt;
&lt;p&gt;DePIN（去中心化物理基础设施网络）通过加密经济模式、节点经济和矿工模式，去正在重塑物理基础设施。这一范式自 2013 年起始，已扩展到通信、存储、计算、AI、能源和数据收集等领域。&lt;/p&gt;
&lt;h2 id="为什么要DePIN"&gt;为什么要 DePIN&lt;/h2&gt;
&lt;p&gt;与传统中心化基础设施相比，DePIN 拥有更高的单位经济效应。智能合约、设备标准化和经济模型取代中心化硬件部署、运营和管理，带来 75%-90% 的成本节约。&lt;/p&gt;
&lt;h2 id="为何DePIN 必发币"&gt;为何 DePIN 必发币&lt;/h2&gt;
&lt;p&gt;代币经济是 DePIN 网络扩展的关键。随着代币价格上涨，经济激励促进节点规模的快速增长。Web3.0 通过 DePIN 实现物理硬件与区块链的交互，预示新的技术浪潮。&lt;/p&gt;
&lt;h2 id="DePIN 的增长空间"&gt;DePIN 的增长空间&lt;/h2&gt;
&lt;p&gt;在 2020-2021 年间，DeFi 市值增长近 100 倍。如果未来 DePIN 总市值能达到 DeFi 的一半，预计其市场规模将达到 5000 亿美元，具有至少 20 倍的增长潜力。根据 Messari 预测，到 2028 年 DePIN 市值可达 3.5 万亿美元。&lt;/p&gt;

&lt;p&gt;让我们继续往下探索 DePIN 未来研报中的十五个要点精华：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. DePIN 不仅仅是一个叙事，更是众多开发者共同打造的、最接近现实世界的区块链落地场景。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;叙事线：MachineFi &amp;gt; POPW &amp;gt; TIPIN &amp;gt; EdgeFi &amp;gt; DePIN &amp;gt; DePIN Asia &amp;gt; The Future of DePIN&lt;/p&gt;

&lt;p&gt;应用线：Helium &amp;gt; StorJ &amp;gt; Filecoin &amp;gt; Akash &amp;gt; Livepeer &amp;gt; 650+ DePIN 项目们&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/4e8de611-e5c5-4ae8-a591-55973b7a16e7.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Web3 走进现实世界，这不是偶然，而是必然，只是时间的问题。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/bc885dff-b0b5-46f9-848b-5d9114ef9519.png!large" title="" alt=""&gt;  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. FMG 看好 DePIN 生态的五个机会：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;底层设施：&lt;/strong&gt;作为 DePIN 应用的结算层，支持交易和代币经济模型运转&lt;br&gt;
&lt;strong&gt;中间件：&lt;/strong&gt;连接底层基础设施和上层应用，提供标准化接口和工具&lt;br&gt;
&lt;strong&gt;上层应用：&lt;/strong&gt;基于 DePIN 基础设施和中间件层构建的应用程序&lt;br&gt;
&lt;strong&gt;衍生赛道 - 边缘 AI：&lt;/strong&gt;利用 DePIN 网络部署边缘计算和 AI 应用&lt;br&gt;
&lt;strong&gt;衍生赛道 - 现实世界资产（RWA)：&lt;/strong&gt;将 DePIN 与现实世界资产结合，创造新的金融产品和服务&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/8cd33970-66c9-480b-8992-353959821bff.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.  底层设施将是这一赛道最好的 Beta 押注，毋庸置疑：&lt;/strong&gt;
未来可能受益于 DePIN 生态的 L1/L2 公链包括 Solana、Polygon、Arbitrum 等。同时，IoTeX 专有链也将受益于生态和头部应用的增长。与 AI 概念紧密结合的公链，如 Near 和 Aptos，也将延伸至上游 DePIN 板块。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/9f569bcf-2991-4647-8b3a-538e574e1024.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. CePIN 和 DePIN 一字之差在一套可信且去中性化的中间件：&lt;/strong&gt;
通用型中间件是 DePIN 皇冠明珠。尽管技术难度较大，通用型中间件的突破将大大降低 DePIN 应用门槛，促进生态繁荣。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/e4c209e5-de78-4670-bace-67e99ebb7807.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. 若要吸引 10 亿用户入圈，地推的功臣非 DePIN 公会莫属：&lt;/strong&gt;硬件生产和节点运维是 DePIN 矿工服务层的两大主要组件。全球分布、快速生产可信设备的硬件生产商和无需许可的 DePIN 节点部署平台将成为潜在机会。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/7dd8b90f-dec7-439f-8d96-79aae8d1a546.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. DePIN 上层应用的六大子赛道，以下按赛道市值排序：&lt;/strong&gt;   &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;老大计算：&lt;a href="/rendernetwork" class="user-mention" title="@rendernetwork"&gt;&lt;i&gt;@&lt;/i&gt;rendernetwork&lt;/a&gt; &lt;a href="/ionet" class="user-mention" title="@ionet"&gt;&lt;i&gt;@&lt;/i&gt;ionet&lt;/a&gt; &lt;a href="/AethirCloud" class="user-mention" title="@AethirCloud"&gt;&lt;i&gt;@&lt;/i&gt;AethirCloud&lt;/a&gt; &lt;a href="/InferixGPU" class="user-mention" title="@InferixGPU"&gt;&lt;i&gt;@&lt;/i&gt;InferixGPU&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;老二 AI：&lt;a href="/Bitensor" class="user-mention" title="@Bitensor"&gt;&lt;i&gt;@&lt;/i&gt;Bitensor&lt;/a&gt; &lt;a href="/autonolas" class="user-mention" title="@autonolas"&gt;&lt;i&gt;@&lt;/i&gt;autonolas&lt;/a&gt; &lt;a href="/oceanprotocol" class="user-mention" title="@oceanprotocol"&gt;&lt;i&gt;@&lt;/i&gt;oceanprotocol&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;老三无线网络：&lt;a href="/helium" class="user-mention" title="@helium"&gt;&lt;i&gt;@&lt;/i&gt;helium&lt;/a&gt; &lt;a href="/WayruNetwork" class="user-mention" title="@WayruNetwork"&gt;&lt;i&gt;@&lt;/i&gt;WayruNetwork&lt;/a&gt; &lt;a href="/NodleNetwork" class="user-mention" title="@NodleNetwork"&gt;&lt;i&gt;@&lt;/i&gt;NodleNetwork&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;老四传感器：&lt;a href="/Hivemapper" class="user-mention" title="@Hivemapper"&gt;&lt;i&gt;@&lt;/i&gt;Hivemapper&lt;/a&gt; &lt;a href="/DIMO_Network" class="user-mention" title="@DIMO_Network"&gt;&lt;i&gt;@&lt;/i&gt;DIMO_Network&lt;/a&gt; &lt;a href="/GEODNET_" class="user-mention" title="@GEODNET_"&gt;&lt;i&gt;@&lt;/i&gt;GEODNET_&lt;/a&gt; &lt;a href="/watchxnetwork" class="user-mention" title="@watchxnetwork"&gt;&lt;i&gt;@&lt;/i&gt;watchxnetwork&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;老五服务：&lt;a href="/usebraintrust" class="user-mention" title="@usebraintrust"&gt;&lt;i&gt;@&lt;/i&gt;usebraintrust&lt;/a&gt; &lt;a href="/SweatEconomy" class="user-mention" title="@SweatEconomy"&gt;&lt;i&gt;@&lt;/i&gt;SweatEconomy&lt;/a&gt; &lt;a href="/DtravelDAO" class="user-mention" title="@DtravelDAO"&gt;&lt;i&gt;@&lt;/i&gt;DtravelDAO&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;老幺能源网络：&lt;a href="/PowerLedger_io" class="user-mention" title="@PowerLedger_io"&gt;&lt;i&gt;@&lt;/i&gt;PowerLedger_io&lt;/a&gt; &lt;a href="/PowerPod_People" class="user-mention" title="@PowerPod_People"&gt;&lt;i&gt;@&lt;/i&gt;PowerPod_People&lt;/a&gt; &lt;a href="/starpowerworld" class="user-mention" title="@starpowerworld"&gt;&lt;i&gt;@&lt;/i&gt;starpowerworld&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/f50f199f-8cb3-4a22-a439-cd700d2bfb48.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. 需求端价值判断&lt;/strong&gt;&lt;br&gt;
相比从概念、行业和供给端去划分，FMG 认为对需求市场的判断更加重要，更关注面向 C 端市场的项目：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;面向 C 端的应用，高利润场景更多，想象空间更大。（&lt;strong&gt;即最接近散户会注意并买单的渠道&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;面向 AI 数据需求的应用，还处于非常早期。（&lt;strong&gt;即现在一级资本涌入最多的地方&lt;/strong&gt;）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/f23df8d7-1299-477b-a529-c0cc16098e70.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. 供给端价值判断&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;过去二十年里，硬件设备价格急剧下降，使个人也能够充当基础设施服务提供商，而 FMG 对供给市场的判断标准：   &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;产品是否容易标准化？产品越标准化则越容易金融化，譬如算力根据时长定价，配置不同价格不同。（&lt;strong&gt;即行业规格能否统一，少 BB，多办事，共同做大蛋糕&lt;/strong&gt;）&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;设备成本是否够低？成本越低，潜在供给规模越大，且越去中心化。（&lt;strong&gt;即不走卖设备的老套路，打不过 Web2，要靠薄利多销，发挥网络效应，强调网络拥有权的差异化&lt;/strong&gt;）&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/eb7cecd3-0b13-4837-aa0e-b66324f3bde5.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. AGI 去不去中心化是个命题，但不能忽视边缘人工智能（Edge AI）在衍生赛道中的潜力：&lt;/strong&gt;Edge AI 是 DePIN 供应端的突破口，通过手机和 PC 设备扩展 DePIN 网络节点，加密手机将是未来发展的重要方向。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/f8527cf1-af86-455c-a785-e6c34ca0dc61.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;11. Web3 加密 AI 手机是众公链兵家必争之地&lt;/strong&gt;    &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solana 的 &lt;a href="/solanamobile" class="user-mention" title="@solanamobile"&gt;&lt;i&gt;@&lt;/i&gt;solanamobile&lt;/a&gt;&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;Ton 的 &lt;a href="/metaphone_ton" class="user-mention" title="@metaphone_ton"&gt;&lt;i&gt;@&lt;/i&gt;metaphone_ton&lt;/a&gt; &lt;a href="/osyterecosystem" class="user-mention" title="@osyterecosystem"&gt;&lt;i&gt;@&lt;/i&gt;osyterecosystem&lt;/a&gt;&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;Aptos 的 &lt;a href="/JamboTechnology" class="user-mention" title="@JamboTechnology"&gt;&lt;i&gt;@&lt;/i&gt;JamboTechnology&lt;/a&gt;&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;Aethir 的 &lt;a href="/aphonelabs" class="user-mention" title="@aphonelabs"&gt;&lt;i&gt;@&lt;/i&gt;aphonelabs&lt;/a&gt;&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/46e42e85-8abb-4b9f-ac2b-521ae8255a11.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;12. Web3 手机的最终目标在于突破现有的垄断模式，建立新型的共享经济体系，使每个人的资产能够实现动态增值，实现被动收入。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/bb95af6e-1013-43ec-a00a-d2e595fb8a8c.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;13. 我们的资产（DePIN）与他们的资产（RWA）通过链上确定信任关系，从而突破 DePIN 赛道现有的规模化和流动性问题：&lt;/strong&gt;DePIN 的硬件和数据资产通过 RWA 模式实现链上金融化，释放硬件的流动性，为 DePIN 持有者提供收益来源，同时创造新型的金融产品。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/d8d640f3-26d9-4733-b4e8-7fffc5ed04c6.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;14. 我认为接下的十年来将是 DePIN 加密市场中最接地气的落地场景，结合 FMG 以下四大核心观点，必带十亿现实世界用户入圈大干一场：&lt;/strong&gt;   &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DePIN 的整体市值预计有潜力增长 20 到 120 倍。&lt;/li&gt;
&lt;li&gt;本轮周期支持 DePIN 生态的公链将获得最大的红利。&lt;/li&gt;
&lt;li&gt;中间件作为每个 DePIN 公链和项目的重要组成部分，将直接受益于突破 DePIN 认证难题。&lt;/li&gt;
&lt;li&gt;DePIN 矿工公会有望成为新的 YGG，同时 DePIN 数据聚合工具为创业者提供填补空缺的机会。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;15. FMG 看好以下六个子赛道并做出预测：&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DePIN Compute&lt;/li&gt;
&lt;li&gt;DePIN AI&lt;/li&gt;
&lt;li&gt;DePIN Sensor&lt;/li&gt;
&lt;li&gt;DeWi &amp;amp; DeEnergy&lt;/li&gt;
&lt;li&gt;DePIN + Edge AI&lt;/li&gt;
&lt;li&gt;DePIN + RWA&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;小结：看好这些子赛道和现实世界之间多方位的结合点，有望引爆新一轮加密牛市高潮，让我们准备迎接这泼天的富贵吧！&lt;/p&gt;

&lt;p&gt;中文版完整报告链接：&lt;a href="https://docsend.com/view/2vm73vzq3ez4ke7b" rel="nofollow" target="_blank"&gt;https://docsend.com/view/2vm73vzq3ez4ke7b&lt;/a&gt;&lt;/p&gt;</description>
      <author>Fifi</author>
      <pubDate>Mon, 22 Jul 2024 17:08:15 +0800</pubDate>
      <link>https://soldev.cn/topics/53</link>
      <guid>https://soldev.cn/topics/53</guid>
    </item>
    <item>
      <title>解读 RWA x DePIN，探索现实世界和 Web3 的交汇点</title>
      <description>&lt;p&gt;原文：&lt;a href="https://iotex.io/blog/real-world-assets-depin/?ref=iotex.io" rel="nofollow" target="_blank"&gt;https://iotex.io/blog/real-world-assets-depin/?ref=iotex.io&lt;/a&gt;&lt;br&gt;
作者：&lt;code&gt;Connor Lovely&lt;/code&gt;   &lt;/p&gt;

&lt;p&gt;译文：&lt;a href="https://iotex.io/zh/blog/jie-du-rwa-x-depin-tan-suo-xian-shi-shi-jie-he-web3-de-jiao-hui-dian/" rel="nofollow" target="_blank"&gt;https://iotex.io/zh/blog/jie-du-rwa-x-depin-tan-suo-xian-shi-shi-jie-he-web3-de-jiao-hui-dian/&lt;/a&gt;&lt;br&gt;
翻译：&lt;code&gt;Angela&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/dac51690-6ce6-4f55-9ceb-fad96a7f1fa7.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="什么是 RWA?"&gt;什么是 RWA?&lt;/h2&gt;
&lt;p&gt;加密行业热衷于创造一些巧妙的缩写名词，然后静候这些缩写词在加密领域内传播，并逐渐渗透到更广泛、非加密的世界。"RWA" 或“现实世界资产（Real World Assets）”就是一个完美的例子，这个缩写正逐渐在非加密的现实世界中为人们所熟知和接受。换句话说，RWA 的时代即将到来。&lt;/p&gt;

&lt;p&gt;简而言之，“RWA 现实世界资产”是指将现实世界的资产进行区块链通证化的过程。通证化的实现是通过发行一种代表特定底层资产并以某种方式与之相关联的同质或非同质通证（通常是在制造过程中嵌入的唯一设备标识符或法律合同）来实现。今天，我们将深入探讨当前 RWA 领域的现状。&lt;/p&gt;
&lt;h2 id="RWA 现实世界资产行业概览"&gt;RWA 现实世界资产行业概览&lt;/h2&gt;
&lt;p&gt;为了不辜负行业专家的出色工作，我将站在巨人的肩膀上，借鉴 Teej Ragsdale、Jack Chong 和 Mukund Venkatakrishnan 共同撰写的《现实世界资产虚拟入门 (&lt;a href="https://www.rwa.xyz/blog/primer-on-real-world-assets?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;An Unreal Primer on Real World Assets&lt;/a&gt;)》报告，通过以下行业地图，向大家介绍当前 RWA 领域的现状。橙色圆圈代表 RWA 基础设施参与者，绿色圆圈代表相应领域的 RWA 项目。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/f65dd1f9-e1b9-4627-95f6-6283b4b643c9.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;图片来源：An Unreal Primer on Real World Assets&lt;/p&gt;

&lt;p&gt;更细致的划分 RWA 行业的方法之一是将通证化资产分为有形资产和无形资产。有形资产由实物构成，如汽车、艺术品或房地产，通常具有相对较低的流动性。无形资产则是指非实物资产，例如美国政府债券、专利或金融机构拥有的证券。&lt;/p&gt;

&lt;p&gt;这篇文章中，我们将主要关注链上的有形资产，因为它们与去中心化物理基础设施网络 DePIN 的建设密切相关。然而，在我们深入探讨 DePIN 以及其与 RWA 的关系之前，让我们先了解一下为什么应该首先关注现实世界资产。&lt;/p&gt;
&lt;h2 id="为什么需要关注 RWA 现实世界资产？"&gt;为什么需要关注 RWA 现实世界资产？&lt;/h2&gt;
&lt;p&gt;现实世界资产通证化可以：&lt;/p&gt;
&lt;h2 id="增加资产流动性"&gt;增加资产流动性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;与传统金融产品相比，RWA 资产可以实现全天候不间断的买卖和交换。&lt;/li&gt;
&lt;li&gt;资产通证化允许部分所有权，即将特定资产的所有权分割成多个部分。在相同条件下，这提高了资产获得债务融资的可能性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="降低成本"&gt;降低成本&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;通过公共、无需许可的区块链，就不需要中介、中间商（传统金融巨头）及支付佣金。&lt;/li&gt;
&lt;li&gt;在相同条件下，从交易中消除的中间人越多，对所有交易方而言，成本就越低。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="提高透明度和信任"&gt;提高透明度和信任&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;区块链作为公共、不可更改的账本，使链上资产交易变得透明。&lt;/li&gt;
&lt;li&gt;这样的透明度意味着交易各方比在传统市场交易中更容易建立信任。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;现实世界资产的通证化增加了资产的可组合性，使其更容易广泛应用于各种关键用例，包括借贷/借款、所有权和身份、以及有限访问等。以上是现实世界资产通证化的优势，接下来，让我们简要介绍一下去中心化物理基础设施网络 DePIN，然后再深入探讨 RWA 在 DePIN 领域的关键作用。&lt;/p&gt;
&lt;h2 id="什么是 DePIN?"&gt;什么是 DePIN?&lt;/h2&gt;
&lt;p&gt;DePIN 去中心化物理基础设施网络 是 Decentralized Physical Infrastructure Network 的缩写。它是在现实世界中建立和维护基础设施的一种创新方式，利用通证激励和治理权，来推动网络参与者以去中心化的方式从零开始构建网络。&lt;/p&gt;

&lt;p&gt;更多 DePIN 相关介绍，请点击：&lt;a href="https://mp.weixin.qq.com/s?__biz=MzU0MzY5NjI4OQ%3D%3D&amp;amp;mid=2247497719&amp;amp;idx=1&amp;amp;sn=1564776c955c7e787ac30ba183c4ac09&amp;amp;chksm=fb05c339cc724a2fc50c0fd84a1bdcaf41970b2088476def582b03a233c9c83ba8b9006356ec&amp;amp;token=1456990666&amp;amp;lang=zh_CN&amp;amp;scene=21&amp;amp;ref=iotex.io#wechat_redirect" rel="nofollow" target="_blank" title=""&gt;一文读懂去中心化物理基础设施网络 (DePIN)&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/b50a0d3f-5080-4c6b-83ca-dc84931cf9c8.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="为什么 DePIN 如此重要？"&gt;为什么 DePIN 如此重要？&lt;/h2&gt;
&lt;p&gt;DePIN 能够为传统、大型且垄断的市场，如电信和能源，带来革新。通过利用区块链技术对服务或商品的潜在供应进行聚合和协调，DePIN 增加了市场中的“供应商”数量，从而促进更多的创新和竞争。这反过来降低了终端消费者的购买成本，并可以通过收集更多高质量的数据，孵化全新的用例。&lt;/p&gt;

&lt;p&gt;如下图所示，许多高度中心化寡头垄断的传统市场（如电信业）的客户满意度非常低。DePIN 旨在通过减少寡头对用户的掌控来解决这个问题。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/54fa3137-5f14-4a22-84f7-1fbe2a2c8a2b.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="DePIN 行业概览"&gt;DePIN 行业概览&lt;/h2&gt;
&lt;p&gt;下图展示了蓬勃发展的 DePIN 行业在服务器、基础设施（包括 &lt;a href="https://iotex.io/?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;IoTeX&lt;/a&gt; 和 &lt;a href="https://w3bstream.com/?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;W3bstream&lt;/a&gt;）、传感器和无线领域等广泛类别中的项目分布概览。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/a2825e6d-1927-48e9-bb35-d0d4eba48a61.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="RWA 如何赋能 DePIN?"&gt;RWA 如何赋能 DePIN?&lt;/h2&gt;
&lt;p&gt;现实世界资产通过充当去中心化物理基础设施网络的基本构建块，在 DePIN 领域发挥了至关重要的作用，这些网络以去中心化的方式为人们提供各种服务或商品，如无线连接或能源传输等。&lt;/p&gt;

&lt;p&gt;在 DePIN 网络中，设备可以以 NFT（非同质化通证）的形式在链上表示，也可以以其地理位置、设备类型、正常运行时间等相关的数据形式表示。每个设备都与特定数据关联，这些数据可以是车辆行驶里程（DIMO）、停车场的空位数量（Natix）或使用的移动数据流量（Helium）等信息。这些数据还可以通过链上的数字孪生与 RWA 现实世界资产相关联。&lt;/p&gt;

&lt;p&gt;当数据流被使用或通证化时，这些活动就可以记录在区块链上。相关设备及其所有者可以在链上得到通证奖励。这样的激励机制打造了 DePIN 的反馈循环，使得现实世界的活动能够影响链上的活动，反之亦然。&lt;/p&gt;
&lt;h2 id="现实世界资产在 DePIN 反馈循环中的关键作用"&gt;现实世界资产在 DePIN 反馈循环中的关键作用&lt;/h2&gt;
&lt;p&gt;DePIN 赋能的经济活动会引起反馈循环，形成数据流。DePIN 项目需要：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;从在网设备中获取数据&lt;/li&gt;
&lt;li&gt;将这些数据流传输到互联网上，并对其进行计算（应用业务逻辑、通证经济规则等）&lt;/li&gt;
&lt;li&gt;通过计算结果生成启动智能合约需要的证明，并将其传输到链上，触发链上活动，比如通证分发、NFT 铸造等&lt;/li&gt;
&lt;li&gt;允许与贡献者声望、贡献度和经济活动相关的链上数据被“现实世界”看到（并因此受到影响）&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;如上所述，通证化的现实世界资产在 DePIN 反馈循环的每个步骤中都扮演着至关重要的角色。在第 1 步中，网络设备需要在链上拥有身份以上传数据。在第 2 步中，这些链上身份需要参与对其提供的数据进行的计算。在第 3 步中，这些身份需要与区块链上的各种智能合约相关联，以确保其参与 DePIN 项目的通证经济。在第 4 步中，它们必须能够从相关的智能合约接收反馈，从而修改其在现实世界中的行为或活动。通过启用这种反馈循环，现实世界资产助力 DePIN 创建了一个功能性的通证经济。&lt;/p&gt;
&lt;h2 id="DePIN 通过现实世界资产创建了双边通证经济"&gt;DePIN 通过现实世界资产创建了双边通证经济&lt;/h2&gt;
&lt;p&gt;DePIN 正在将 RWA 领域对高流动性、无形资产（如美国国债）的关注，转向相对低流动性的实物资产，这些资产可以更充分地从其链上身份中获益。作为 RWA 的下一个演进阶段，DePIN 项目通过创建由现实世界设备组成的物理基础设施网络，并将这些设备进行通证化，形成了完整的通证经济。&lt;/p&gt;

&lt;p&gt;这些通证经济当然是双边的。在 DePIN 项目的供给端，贡献者使用硬件设备（如手机、蜂窝无线电，甚至具备地图功能的摄像头）以某种方式为网络做出贡献，如标记公共 Wi-Fi 热点、提供蜂窝连接或为街道提供类似 Google Map 的视图。这些贡献者之所以这样做，是因为他们可以获得通证激励，并在他们共同构建的网络上拥有一定程度的治理权。”&lt;/p&gt;

&lt;p&gt;在 DePIN 项目的需求端，用户需要向项目支付其提供的服务，支付方式可以是项目的原生通证，或更为普遍的是使用法定货币支付。随后，使用法定货币购买并销毁项目的原生通证，使交易中的经济价值累积到项目的总价值上，最终回馈给项目的贡献者和通证持有者。&lt;/p&gt;

&lt;p&gt;为了详细阐述 DePIN 的双边通证经济，我们将以 Helium 项目的 Wi-Fi 热点为例，展示它如何成为更广泛的 DePIN 网络中的一个现实世界资产。&lt;/p&gt;
&lt;h2 id="RWA x DePIN 的协同运作"&gt;RWA x DePIN 的协同运作&lt;/h2&gt;
&lt;p&gt;在这里，我们将以 Helium 的最新 Wi-Fi 热点为例向大家介绍 RWA 在 DePIN 项目中的重要意义。在深入讨论这个例子之前，让我们先了解一些背景信息。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.helium.com/?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;Helium&lt;/a&gt; 是一个专注于以去中心化方式建立无线连接的 DePIN 项目。他们最初创建了一个供物联网 IoT 设备使用的网络，之后在其基础上又添加了一个蜂窝网络，现在正在进入 Wi-Fi 领域。作为 DePIN 赛道中规模最大且历史最悠久的项目之一，他们也是第一个推广使用通证激励从零开始构建物理基础设施网络的项目。&lt;/p&gt;

&lt;p&gt;Helium Mobile 是 Helium 面向终端用户的加密运营商。通过加密运营商使用通证激励模型来鼓励贡献者购买并安装 Helium 蜂窝无线设备，利用未经许可的 CBRS 频段和 eSIM 技术为用户手机提供蜂窝覆盖。考虑到要达到成熟运营商如 AT&amp;amp;T 或 Verizon 的规模水平还需要数年时间，Helium Mobile 选择与 T-Mobile 合作，以便 Helium Mobile 的用户在贡献者没有部署 Helium Mobile 蜂窝无线网络的区域内可以使用 T-Mobile 网络。最早期的用户套餐每月仅需 5 美元，包括无限通话、短信和数据流量。”&lt;/p&gt;

&lt;p&gt;现在讲回我们的例子。Helium 的这个 Wi-Fi 热点设备大致和一个纸巾盒一样大，售价 250 美元，可以为 Helium Mobile 的用户提供室内 Wi-Fi 覆盖。它在线工作时会赚取通证，当被用于提供互联网连接时也会赚取通证。以下是将现实世界资产进行通证化并使 Helium 的 DePIN 网络受益的方式（请注意，以下提到的一些示例是为了说明，即使目前都是可能的）。&lt;/p&gt;

&lt;p&gt;假设有一组投资者想要共同资助购买和部署 Helium Mobile Wi-Fi 热点。因为其硬件设备是通过 NFT 在链上表示的，所以可以随时、无需许可地购买或出售，而物理设备将单独发货（两者缺一不可）。NFT 通过设备本身内部的私钥与物理设备绑定，该私钥在制造过程中已经植入设备。通证奖励积累在设备的 NFT 上，并可由拥有 NFT 的钱包自由兑换。”&lt;/p&gt;

&lt;p&gt;鉴于这里有多个所有者，NFT 可以被分割，允许多个投资者资助设备的购买和部署，然后根据他们对设备部署的贡献比例，分配来自设备的通证奖励。通过简单的多签钱包，投资者无需使用托管服务，并减少与区块链技术无信任和无需许可性质相关的任何法律费用。最后，投资者甚至不必完全了解或信任彼此，因为所有与设备相关的链上活动（包括设备所有权、正常运行时间、位置、使用情况、收益等）都是透明且不可纂改的。这是一个有趣的例子，展示了 RWA 和 DePIN 项目的协同运作。IoTeX 项目正与来自这两个领域的项目同时合作。&lt;/p&gt;
&lt;h2 id="IoTeX &amp;amp; RWA"&gt;IoTeX &amp;amp; RWA&lt;/h2&gt;
&lt;p&gt;IoTeX 是任何希望将物理设备及其数据上链（并利用这些数据）的公司的首选区块链基础设施平台。&lt;/p&gt;

&lt;p&gt;这里我们介绍一个正在与现实世界资产公司合作的案例。IoTeX 最近与意大利的硬件和软件公司 &lt;a href="https://www.westernengineering.it/en/?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;Western Engineering&lt;/a&gt; 展开合作，该公司专注于能源和微电网。在意大利，政府支持 CER 的创建和运营。CER 是可再生能源社区，或者说是微电网，城镇或城市中具备能源生产能力（主要是太阳能电池板）的邻里可以联合起来相互分享能源，通过减少远距离传输来降低能源损耗，提高能源使用效率。同时，有一个名为 GSE 的政府拥有的公司，负责追踪 CER 和电网之间的能源交换，并在每月结算这些交换的能源。&lt;/p&gt;

&lt;p&gt;Western Engineering 目前在全球拥有 5 万多台智能变流器，可以测量家庭内能源的生产和消耗。&lt;a href="https://www.westernengineering.it/en/portfolio/westernchain-monitoring-portal-for-energy-communities-with-blockchain-accounting/?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;Westernchain&lt;/a&gt; 的平台网站允许用户在意大利轻松创建和管理 CER（希望将来也能覆盖其他国家）。Westernchain 的服务还包括收集、展示能源生成和消耗的数据仪表板，以及将这些数据不可更改地记录在 IoTeX Layer 1 区块链上。&lt;/p&gt;

&lt;p&gt;IoTeX 正在与 Western Engineering 合作，为他们开发 Westernchain 平台的所有区块链相关部分。这不仅有助于显著改进产品，还将区块链技术和数字资产引入到 Western Engineering 的现实世界资产中。&lt;/p&gt;
&lt;h2 id="IoTeX &amp;amp; DePIN"&gt;IoTeX &amp;amp; DePIN&lt;/h2&gt;
&lt;p&gt;IoTeX 正在与 &lt;a href="https://dimo.zone/?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;DIMO&lt;/a&gt;、&lt;a href="https://www.xnet.company/?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;XNET&lt;/a&gt;、&lt;a href="https://geodnet.com/?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;Geodnet&lt;/a&gt; 等 DePIN 先驱公司合作，通过为开发者提供以下支持，不断推动 DePIN 领域的创新：&lt;/p&gt;
&lt;h2 id="去中心化的基础设施："&gt;去中心化的基础设施：&lt;/h2&gt;
&lt;p&gt;IoTeX 研发的 &lt;a href="https://w3bstream.com/?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;W3bstream&lt;/a&gt; 是全球首个去中心化的链下计算基础设施，将物理设备生成的真实世界数据与区块链上的智能合约相链接。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IoTeX &lt;a href="https://iotex.io/?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;L1&lt;/a&gt; 是一个与以太坊虚拟机 EVM 兼容、专为现实世界设备及其数据而设计的 dPoS 区块链平台。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/c078ba4d-9d9b-48ff-a23d-b10263da633a.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="开发者工具："&gt;开发者工具：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;数据聚合和可视化平台：&lt;a href="https://depinscan.io/?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;DePINscan&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;多链钱包：&lt;a href="https://iopay.me/?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;ioPay&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DEX：&lt;a href="https://mimo.exchange/?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;mimo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;区块链浏览器：&lt;a href="https://iotexscan.io/?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;iotexscan&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;质押平台：&lt;a href="https://stake.iotex.io/?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;stake.iotex.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="市场推广支持："&gt;市场推广支持：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://docs.iotex.io/halo-grants/halo-grants-program?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;Halo Grants&lt;/a&gt; 开发者激励计划&lt;/li&gt;
&lt;li&gt;IoTeX 基金会资助&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://r3alworld.com/?ref=iotex.io" rel="nofollow" target="_blank" title=""&gt;R3al World&lt;/a&gt; 全球峰会&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/e43e0dcd-a8da-4084-a22e-4963099a7878.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;自 2017 年创建以来，IoTeX 一直在现实世界与区块链交互的前沿技术领域进行创新。尽管这个领域的名称和术语可能已经发生变化，但我们将设备及其数据与区块链上的智能合约相连的理念从未改变。&lt;/p&gt;

&lt;p&gt;新兴的去中心化物理基础设施网络标志着人们在构建基础设施方面的范式转变，我们激动地见证了 RWA 和 DePIN 领域正在发生的创新！作为将链上真实世界资产用于去中心化物理基础设施网络的早期实践者，IoTeX 为能够成为全球领先的 DePIN 基础设施平台而感到自豪。&lt;/p&gt;</description>
      <author>Fifi</author>
      <pubDate>Mon, 15 Jul 2024 12:00:13 +0800</pubDate>
      <link>https://soldev.cn/topics/47</link>
      <guid>https://soldev.cn/topics/47</guid>
    </item>
    <item>
      <title>IoTeX: DePIN 赛道洞察（六月下旬热点）</title>
      <description>&lt;p&gt;原文：&lt;a href="https://mp.weixin.qq.com/s/1nV7wKYV-_ce4SR1QP-4Qw" rel="nofollow" target="_blank"&gt;https://mp.weixin.qq.com/s/1nV7wKYV-_ce4SR1QP-4Qw&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="主网及项目进展"&gt;主网及项目进展&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;6 月 18 日 Mysterium、Stratos、Swarm、Synternet 加入 DePIN 流动性中心&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mysterium、Stratos、Swarm、Synternet 等项目加入 IoTeX DePIN 流动性中心。IoTeX DePIN 流动性中心致力于增强 DePIN 项目的初始流动性，从而赋能整个 DePIN 生态系统。&lt;/p&gt;

&lt;p&gt;Mysterium 是 Polygon 上最大的 DePIN 项目，可以将用户设备转化为一个加密、安全的互联网接入点，允许用户共享自己的互联网连接，并按共享分钟获得通证收益。&lt;/p&gt;

&lt;p&gt;Stratos 是一个提供安全存储、AI 计算和自平衡数据库的去中心化数据网络，为 DePIN 项目提供去中心化的数据可用性服务。&lt;/p&gt;

&lt;p&gt;Swarm 是一个去中心化的数据存储与分发网络，为下一代无服务器的 dApp 提供动力，致力于实现世界计算机的愿景，为现实世界的 DePIN 数据提供基础设施。&lt;/p&gt;

&lt;p&gt;Synternet 为所有主流链之间的跨链活动，构建了一个模块化、可互操作的数据基础设施。Synternet 的数据层解锁了 DePIN 项目在现实世界的实时数据，这些数据可被用来构建强大的通证激励机制。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/7271d04e-1fa7-481d-b21a-e7e35d7d0409.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="链上生态项目和合作伙伴进展"&gt;链上生态项目和合作伙伴进展&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;6 月 30 日 W3bstream 验证的 DePIN 设备数达 204 万台&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DePINscan 显示，截至今日，全球首款去中心化链下计算基础设施 W3bstream 已验证了分布于 194 个国家的 240 万台 DePIN 设备，市场总值达 227 亿美金。&lt;/p&gt;

&lt;p&gt;DePINscan 是一个聚焦 DePIN 全行业的数据聚合和可视化地图浏览器，具备“explorer-as-a-service”（浏览器即服务）的功能，为 DePIN 领域中的每个项目提供实时、透明、深入的数据洞察与分析。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://depinscan.io" rel="nofollow" target="_blank"&gt;https://depinscan.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/ce4a9af1-d530-4a43-905e-b796cdbc20fd.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6 月 30 日 IoTeX 链上实时激活设备数达 26279 台&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;截至今日，IoTeX 链上实时激活设备数达 26279 台，分布全球 73 个国家，共销毁 2.98 亿个 IOTX，空投 1.05 亿个 IOTX 给社区长期支持者 (开启自动质押超过 91 天)。&lt;/p&gt;

&lt;p&gt;IoTeX 链上实时数据检测：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://iott.network/" rel="nofollow" target="_blank"&gt;https://iott.network/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/aa781120-3cc4-42d4-8a72-d3c3adefc9b7.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6 月 18 日 UpROCK 集成 DePINscan 平台&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DePIN + AI 网络信息分析平台 UpRock 现已集成 DePINscan，连接超过 351,000 个活跃设备。&lt;/p&gt;

&lt;p&gt;DePINscan 是由 IoTeX 构建，集合 AI 和 DePIN 项目信息、设备分布等多维度数据的开放信息平台，提供了 Web3 联通物理世界的可视化面板，能够帮助关注该领域的投资者和建设者发现和获取关键数据，目前 DePINscan 已集成项目超 200 个。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;UpRock 项目专属页面：&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://depinscan.io/projects/uprock" rel="nofollow" target="_blank"&gt;https://depinscan.io/projects/uprock&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/6837ba35-b737-48c0-94fd-bcbd48af67ae.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="市场活动和媒体报道"&gt;市场活动和媒体报道&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;6 月 26 日 创始人 Space 直播："DePIN on IoTeX"：IoTeX 2.0 在全球宽松经济中的战略机遇&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;IoTeX 联合创始人兼 CEO Raullen、IoTeX 亚太区策略官 Andrew 在 IoTeX 中文社区 (&lt;a href="/iotex_cn" class="user-mention" title="@iotex_cn"&gt;&lt;i&gt;@&lt;/i&gt;iotex_cn&lt;/a&gt;) Space 直播中，为大家解读 IoTeX 2.0 上线的机遇与挑战，带你深入了解“降息”预期下，本轮牛市最具潜力的新赛道 DePIN + AI。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;直播文字回顾：&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s/ydj7VezsPhhf8J3WwajSrQ" rel="nofollow" target="_blank" title=""&gt;IoTeX 2.0 在全球宽松经济中的战略机遇&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/65550d9c-a1a9-4adf-8550-18e012b1d6a4.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6 月 27 日 IoTeX 链上五大 DeFi 项目联手举办“DeFi4DePIN”Space 直播&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;IoTeX 链上五大专注于 DePIN 的 DeFi 项目：pinSwap, Magma, Quenta, Loxodrome, Bedrock，联手举办 SPACE 直播。&lt;/p&gt;

&lt;p&gt;DeFi4DePIN 不仅能推动链上两大核心领域的生态增长，增强 DePIN 项目的流动性，还为更广泛的现实世界用户带来了真正的民主化 #DePIN 体验。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;直播回顾：&lt;/em&gt;
&lt;a href="https://x.com/i/spaces/1vOGwjrVBYdKB" rel="nofollow" target="_blank"&gt;https://x.com/i/spaces/1vOGwjrVBYdKB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/2300cdee-dc12-4d1c-a095-8fbec43bc387.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6 月 25 日 Jing 受邀参加 DePIN Hub 播客采访&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;由 Hotspotty 主持的 DePIN Hub 播客特别邀请了 IoTeX 联合创始人 Jing 参与最新一期的访谈。&lt;/p&gt;

&lt;p&gt;了解 Jing 如何从 IoTeX 创立开始，经历加密行业七年的挑战，最终成为“Queen of DePIN”的故事。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;访谈回顾：&lt;/em&gt;
&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//www.youtube.com/embed/r6h9lJ1eCk0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/d491f103-cd78-4964-93fc-7a8a633e1132.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6 月 25 日 Andrew 受邀参加 WCS 香港峰会&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;IoTeX 亚洲策略官 Andrew 作为特邀嘉宾，参加 WCS 香港峰會 (2024 Web3 Connect Summit Hong Kong)。IoTeX 也是 WCS 的合作伙伴。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/593bd1ec-f7ae-4635-a767-dcd614e778f3.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6 月 18 日 Raullen 受邀参加 GRTiQ 播客采访&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;IoTeX 联合创始人兼 CEO Raullen 在 GRTiQ 的播客采访中，为听众分享 DePIN 这个概念的背后故事。&lt;/p&gt;

&lt;p&gt;完整访谈：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://grtiq.com/grtiq-podcast-173-ruallen-chai/" rel="nofollow" target="_blank"&gt;https://grtiq.com/grtiq-podcast-173-ruallen-chai/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/575bae7d-5e06-4de7-ac78-f2a461f7fe80.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="IoTeX 链上实时数据"&gt;IoTeX 链上实时数据&lt;/h2&gt;
&lt;p&gt;IoTeX 网络节点数量：109 个&lt;/p&gt;

&lt;p&gt;链上交易数量：118,891,492 txn (最高 TPS: 1000)&lt;/p&gt;

&lt;p&gt;IOTX 流通总量：9,441,378, 934 IOTX&lt;/p&gt;

&lt;p&gt;IOTX 质押总量：3,904,638,278 IOTX&lt;/p&gt;

&lt;p&gt;IOTX 烧投质押量：1,546,375,859 IOTX（自动质押超过 91 天）&lt;/p&gt;

&lt;p&gt;烧投质押桶数量：16091 个&lt;/p&gt;

&lt;p&gt;总质押率：41.36%&lt;/p&gt;

&lt;p&gt;上链设备数量：26279 个&lt;/p&gt;

&lt;p&gt;分布国家：73 个&lt;/p&gt;

&lt;p&gt;销毁 IOTX 数量：297,623,438 IOTX&lt;/p&gt;

&lt;p&gt;链上交易数据：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://iotexscan.io" rel="nofollow" target="_blank"&gt;https://iotexscan.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI + DePIN 项目可视化数据平台：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://DePINscan.io" rel="nofollow" target="_blank"&gt;https://DePINscan.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;链上设备实时数据：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://iott.network/" rel="nofollow" target="_blank"&gt;https://iott.network/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;IoTeX 生态网页：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ecosystem.iotex.io/projects" rel="nofollow" target="_blank"&gt;https://ecosystem.iotex.io/projects&lt;/a&gt;&lt;/p&gt;</description>
      <author>Fifi</author>
      <pubDate>Mon, 08 Jul 2024 19:33:06 +0800</pubDate>
      <link>https://soldev.cn/topics/45</link>
      <guid>https://soldev.cn/topics/45</guid>
    </item>
    <item>
      <title>如果 Pump.fun 成为「币圈快手」</title>
      <description>&lt;p&gt;原文：&lt;a href="https://www.theblockbeats.info/news/54034" rel="nofollow" target="_blank"&gt;https://www.theblockbeats.info/news/54034&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;作者：&lt;code&gt;Joyce, Frost&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Pump.fun 是这轮周期里最特别的产品。推出 4 个多月以来，Pump.fun 上发布的代币超过 117 万个，累计收入已超 5000 万美元。如何理解这个数字？对比此前牛市里的顶级流量产品 Uniswap，据估计，Uniswap Labs 年收入约为 2500 万至 3000 万美元。&lt;/p&gt;

&lt;p&gt;可以说，Pump.fun 不是一个典型的 Web3 项目，没有复杂的代币经济学模型，也没有 DAO 治理机制，但凭借精准的市场定位，Pump.fun 开创了一门稳赚不赔的生意市场。在注意力经济的主导下，很多人会把持续繁荣 meme 币赛道潜力解释为短视频之于长视频的优势，那么在「全民发币」时代，还能有后来者分一杯羹吗？注意力经济叠加极致 pvp，meme 币的玩法还会有什么新花样？&lt;/p&gt;
&lt;h2 id="那个为了推 meme 币烧伤自己的人还在直播"&gt;那个为了推 meme 币烧伤自己的人还在直播&lt;/h2&gt;
&lt;p&gt;还记得一个月前，为了推广自己的 meme 币而烧伤自己的开发者吗？6 月 27 日上周四，他还在推特上直播。&lt;/p&gt;

&lt;p&gt;这个开发者名叫 Mikol，5 月 17 日，他在 Pump.fun 上推出了一个名为 TruthOrDare（DARE）的 meme 币，当时 Pump.fun 还没有直播功能，只能在评论区发布图片，Mikol 身体力行地向社区展示第一季「亮点」，它在 twich 上直播往身上浇异丙醇，让朋友向他的方向发射烟花。在粉丝的惊呼和 DARE 的上涨中，他的身体被点燃，全身三度烧伤送往医院。&lt;/p&gt;

&lt;p&gt;代币 DARE 在 Mikol 烧伤那日获得了 12 倍涨幅，又在次日迅速归零。Mikol 的事迹被加密社区媒体 Decrypt 报道，引起了许多关注，面对这样的热度，躺在 ICU 里的 Mikol 特地录制视频向社区表示不会放弃运营，「你们会看到一个更好的我。」&lt;/p&gt;

&lt;p&gt;发一个 meme 币，然后通过极端行为博眼球期待上涨的人不止 Mikol 一个人。Solana meme 热潮带入了大量加密新人，也催生了许多以秒为单位看线的 meme 币。除了 Mikol 的「烧伤币」，同期还有以「LIVEWITHMOM」为名、直播裸露身体隐私部位来「求买入」等 meme 币。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/aef6a242-4247-4bd1-a906-7a85232abee1.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;尽管这些 meme 币的生命周期极短、也极少有市值突破 100 万美元的，但将直播与发币挂在一起的形式，让许多收入不高的人找到了财富密码。&lt;/p&gt;

&lt;p&gt;这件事情发生一周后，Pump.fun 开通了直播功能，社区的第一反应是劝告发币者「请不要为了赚钱而自焚」。&lt;/p&gt;

&lt;p&gt;就在 Mikol 事迹引起社区关注时，不乏许多认为这样的行为太过病态、有悖于加密精神初衷的观点，还有人劝 Mikol 病好之后找个好工作。但在病情稳定之后，还在医院的 Mikol 又开了 twich 直播、并在 Pump.fun 上同步直播。如他所愿，复出直播推动 DARE 再次有了 15 倍涨幅。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/974228d4-9e70-4624-971e-4cbeba74834e.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;那次复出上涨也仅维持了一天，DARE 的币价持续走低，似乎很难再有上涨动力了。但自那时到现在，Mikol 经常以包扎绷带的状态开直播，表演吃生鸡蛋、干吞肉桂粉、以及同步他的养伤日常。还有新的成员加入他的「TruthOrDare 家族」，展现吃芥末、干吃辣椒等「绝活」。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/a1e02753-f490-41a0-9eb4-567d9dd4abc4.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;除非出现极少数情况，Mikol 和他的 DARE 可能很难再得到之前那样的关注。网络上还存在着更多 Mikol，希望通过足够抽象、足够具有冲击性表现，获得社区的关注，让自己的 meme 能够一飞冲天。&lt;/p&gt;

&lt;p&gt;那些自带高流量的人已经下场发币，从 Jenner 到 Mother、Father 等，名人币浪潮让发币团队和早期关注者都赚的盆满钵满。尽管如 Vitalik 等人都发表观点反对这一现象，但难以阻挡加密社区里，「娱乐至死」的风向越来越重。&lt;/p&gt;

&lt;p&gt;或许可以认为，加密社区这一轮流入的新人来自「下沉市场」。meme 币的市场还很庞大，但与当年的 DOGE、PEPE 等与加密社区有着些许联系的 meme 币不同，现在的 meme 币热潮指向了新的方向，在加密社区之外的下沉市场。&lt;/p&gt;
&lt;h2 id="加密市场正经历从 PGC 到 UGA 的转变"&gt;加密市场正经历从 PGC 到 UGA 的转变&lt;/h2&gt;
&lt;p&gt;对于 meme 热潮的出现，有很多行业发展的现实原因。诚然，这轮牛市里的加密叙事吸引力已经不如以往，相比于筹码分布不透明、叙事宏大不落地的「价值币」，新人更愿意将 meme 来作为进圈体验第一站。&lt;/p&gt;

&lt;p&gt;在这背后，是越来越多的用户看透了究极 PVP 逻辑，无论叙事如何多变，都只是为了造出一个足够 ponzi 的盘子，等下一个人接盘。市场不缺发币的人，只是缺能把发币故事讲好的人，既然社区的共识已经成为「价值币的实质也是空气币的一种」，干脆一步到位，自己发币。Pump.fun 的诞生恰逢其时。&lt;/p&gt;

&lt;p&gt;Pump.fun 的出现，让用户可以极低成本 (0.02 SOL) 一键发布属于自己的 meme 币，一轮轮 meme 在几个小时里走完起飞和崩盘，每日在 Pump.fun 上发布的代币超过 1 万多个，占 Solana 生态代币总量的超 80%。近期，Pump.fun 日收入在 45 万到 100 万美元之间，上线几个月以来总收入已经超过 5000 万美元。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/acb24ba0-102a-4b4a-9eaf-48ed0861c917.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;正如 Youbi Capital 在 5 月发布的一份分析报告中指出的那样，低流动性资产的火爆是对于目前这个周期场内流动性不足的一个内在反应，同时也存在着 PGA（Professional Generated Asset）向 UGA（User Generated Asset）转变后，发币数量的急剧增加导致共识越发分散的一个潜在隐喻。&lt;/p&gt;

&lt;p&gt;但是，新的机会仍然存在。&lt;/p&gt;

&lt;p&gt;三天之前，DEX Screener 推出代币发行平台 Moonshot。推出首日就发布了超 7000 个代币，同期，Solana 也因为推出了能够在推特上交易代币的功能 blinks 而受到社区的肯定。结合这两个热门话题的 meme 币 SC 两天涨幅超百倍，说明市场都想来抢发币平台的蛋糕，而用户也期待继 Pump.fun 之后的新故事。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/f03b96c1-9d2f-4cf7-8bd7-dde040b6851c.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;毕竟，加密技术史无前例地、极大地拉低了资产发行与交易的速度与门槛，其潜在应用市场还十分庞大。只要社区对于「注意力变现」的需求还在，加密市场就还有叙事可以讲。&lt;/p&gt;
&lt;h2 id="如果直播发生在 Web3 会怎么样？"&gt;如果直播发生在 Web3 会怎么样？&lt;/h2&gt;
&lt;p&gt;在传统互联网，「注意力经济」产业发展走了 20 年左右，经历了从论坛贴吧时代到图文微博时代，再到短视频直播时代的转变。而这样的轨迹也在加密领域上演。&lt;/p&gt;

&lt;p&gt;5 月 29 日，pump.fun 宣布在平台上开通了直播功能。对于一个冲土狗赚钱的网站来说，用户确实没有看直播的需求。但直播作为信息承载量最大、最具有场景感和感染力的传播形式，叠加资产发币功能，从注意力经济角度上说，是值得畅想的应用场景。&lt;/p&gt;
&lt;h3 id="将商业化简单到极致"&gt;将商业化简单到极致&lt;/h3&gt;
&lt;p&gt;Web3 的商业化之路与传统互联网完全不同，但在注意力经济上，Web2 的典型案例能够给加密行业一些启示。&lt;/p&gt;

&lt;p&gt;以快手为例，2013 年，诞生不到两年的快手决定从动图制作工具转型为互联网社区，用户自己在快手上生产内容，通过短视频记录和分享自己的生活和创意，并和粉丝产生互动。与抖音等新锐平台不同，快手的用户定位是「社会平均人」，用户主要是分布在二三线城市的年轻人。&lt;/p&gt;

&lt;p&gt;2014 年，拥有一批下沉市场忠实粉丝的 YY 主播入驻快手，那时快手的月活为 100 万。2016 年底，快手月活突破 6400 万，在快手快速发展壮大的这两年里，YY 系主播占据着同期快手头部主播名单的前四名。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/34df458a-45fd-4751-a36a-2860828c30b1.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;快手维护了下沉市场社区的特性，不签约网红明星、不流量扶持、公平算法的机制鼓励了 UGC 内容的蓬勃发展，相对于同期的产品，快手以独有的「去中心化社群」模式最终脱颖而出。&lt;/p&gt;

&lt;p&gt;2017 年，快手又率先抢占了直播的红利，成为全球最大的单体直播平台，据快手招股书显示，从 2017 年到 2019 年，公司收入分别为 83 亿、203 亿、391 亿元，其中直播收入分别为 79 亿元、186 亿元、314 亿元、173 亿元，占比分别为 95.18%，91.63%，80.31%，68.38%。可见，在当时直播是快手的核心业务，也是快手的底色。&lt;/p&gt;

&lt;p&gt;在蓬勃发展之后，快手不得不调整内容生态，毕竟传统的 Web2 公司都需要进行商业化转型，这个过程中，只有那些受众消费水平高、满足传统社会价值观、在激烈竞争中活下来的内容生产者才可以留到最后。&lt;/p&gt;

&lt;p&gt;回顾来看，与其说快手走好了下沉市场，不如说快手瞄准了注意力经济赛道的新手市场。而同样面向加密新手的发币平台，则不需要考虑「商业化转型」。&lt;/p&gt;

&lt;p&gt;在传统互联网大厂中，不管是内容平台还是购物平台，都希望向用户展示「这里有值得看/买的好东西」，因为只有被更多用户认可、爱看的内容才有商业化价值、继而为平台带来利润。但 Pump.fun 不需要商业化，其盈利模式极为简单和纯粹，它只需要展示「这里有足够多的币和交易者」，只要有人交易，Pump.fun 就能挣钱。&lt;/p&gt;

&lt;p&gt;当下，尽管 Pump.fun 开通了评论区和直播功能，但用户登上 Pump.fun 只是为了完成买入或卖出这一个环节，对于 meme 币的讨论主要发生在推特上，有直播想法的 meme 币开发者也大都会选择 twitch、kick 等平台进行直播宣传。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/75b72dcc-183f-4b04-a38b-b77967780ce3.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;在 Pump.fun 界面中，用户只能通过评论数量和代币市值这两个指标进行选择，如果有一个直播专栏，Pump.fun 上是否会跑出「直播神盘」？&lt;/p&gt;
&lt;h3 id="人性博弈与监管难题"&gt;人性博弈与监管难题&lt;/h3&gt;
&lt;p&gt;目前，已经出现了一些 meme 展示平台，如推特粉丝量才刚刚突破 7000 个的 Game.com，提供付费 list 代币服务，支付 0.8 个 SOL，就可以将自己发行的 meme 币发布到这个平台上，获得更多关注度。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/630e8d4c-52e8-4e55-8638-a6ed8c2a9b7a.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;而 Pump.fun 团队似乎无意在现有服务上做出更多探索，毕竟一个半年时间收入超 4000 万美金、日收入稳定 60 万美金的小团队，确实没有动力再去打破产品、创新叙事了，定位在「工具」上就已足够。&lt;/p&gt;

&lt;p&gt;随着更多新人涌入加密领域，或许直播能够成为 Moonshot 等其他发币平台作为差异化打法的标签。&lt;/p&gt;

&lt;p&gt;但 Web3 过往破灭的数个 x to earn 项目已经说明，再精巧的设计也不能挑战人性。6 月 13 日，曾有一位用户在 Pump.fun 上推出了以戴帽子的绵羊为主题的 meme 币，并在同期进行了直播。但直播刚刚开始一会后，评论区还在讨论绵羊的动作，而在代币发布时买入的狙击手迅速在高位卖出了大部分代币，使代币价格直线下跌。&lt;/p&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/6e61d2db-cc63-4b07-8edd-fda08dfae099.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;代币崩盘之后，meme 币发行者在评论区解释，「我的代币余额始终保持不变，可以通过 solscan 进行验证。如果我只是为了赚快钱，为什么我要直播我的羊，但不出售我的代币？」&lt;/p&gt;

&lt;p&gt;不抛售可能是因为代币还没上 Raydium，直到最后，这枚代币也没有达到 6 万美元的市值。而发行者再也没有直播过他的羊。&lt;/p&gt;

&lt;p&gt;此外，监管问题也是这类平台需要注意的。如果直播形式与资产发行结合，势必会出现各种通过极端、低俗的行为来博得眼球。在 Pump.fun 宣布推出直播功能时，社区最担忧的是平台如何审核极端内容，当发币者发布一些色情或者更加过激的不当行为时，Pump.fun 是否应该介入，以防止出现可能的犯罪行为。&lt;/p&gt;
&lt;h2 id="结语"&gt;结语&lt;/h2&gt;
&lt;p&gt;回到本文开头的那些 meme 币发行者上，可以从中感受到早年传统互联网短视频平台的内容生态。经历了数年发展之后，这些平台已经探索出了极具吸金能力的商业模式。&lt;/p&gt;

&lt;p&gt;作为提供「沉浸式体验」的内容形式，直播以突破想象的形式让人们意识到「流量」的汇聚速度可以简单到何种程度，而打赏、带货等流量变现渠道，也让内容产出者在一定程度上拥有了与平台资本相抗衡的能力。&lt;/p&gt;

&lt;p&gt;到了加密领域，平台的控制力转瞬消散。而注意力仍是驱动整个市场前进的核心动力，如果直播发生在 Web3，会发生什么样的故事？对流量的极致利用，能否在去中心化的环境中找到新的表现形式？&lt;/p&gt;

&lt;p&gt;回顾这些年，在共识的不断破裂与重建中，加密行业已涌现了无数个从「创新」走向崩盘的项目。Pump.fun 的出现，只是一个开始。&lt;/p&gt;</description>
      <author>Fifi</author>
      <pubDate>Tue, 02 Jul 2024 16:22:16 +0800</pubDate>
      <link>https://soldev.cn/topics/39</link>
      <guid>https://soldev.cn/topics/39</guid>
    </item>
    <item>
      <title>如何使用 Kinobi 创建 Anchor 程序客户端</title>
      <description>&lt;p&gt;原文：&lt;a href="https://www.quicknode.com/guides/solana-development/anchor/kinobi-client" rel="nofollow" target="_blank"&gt;https://www.quicknode.com/guides/solana-development/anchor/kinobi-client&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;作者：&lt;code&gt;Aaron Milano&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="概述"&gt;概述&lt;/h2&gt;
&lt;p&gt;Kinobi 是一组库，它是一个强大的工具，可以用来为现有的 Solana 程序生成 JavaScript、Umi (JavaScript) 和 Rust 客户端。Kinobi 最近增加了从 Anchor IDLs 生成客户端的支持，所以我们现在可以使用 Kinobi 为 Anchor 程序创建客户端。在使用 Anchor 构建和测试新程序时，这可以节省时间。本指南将向你展示如何使用 Kinobi 为你的 Anchor 程序生成客户端。&lt;/p&gt;
&lt;h3 id="你要做什么"&gt;你要做什么&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;创建一个简单的 Anchor 程序&lt;/li&gt;
&lt;li&gt;编写一个脚本，使用 Kinobi 为程序生成一个客户端&lt;/li&gt;
&lt;li&gt;测试客户端&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="你需要什么"&gt;你需要什么&lt;/h3&gt;
&lt;p&gt;本指南假设你对 Solana 编程和 Anchor 有基本的了解：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.quicknode.com/guides/solana-development/getting-started/solana-fundamentals-reference-guide" rel="nofollow" target="_blank" title=""&gt;Solana 基础参考指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quicknode.com/guides/solana-development/anchor/how-to-write-your-first-anchor-program-in-solana-part-1" rel="nofollow" target="_blank" title=""&gt;指南：构建你的第一个 Anchor 程序&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quicknode.com/guides/solana-development/anchor/what-is-an-idl" rel="nofollow" target="_blank" title=""&gt;什么是 IDL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在开始之前，请确保你已安装了以下软件：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/en/download/" rel="nofollow" target="_blank" title=""&gt;Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.anchor-lang.com/docs/installation" rel="nofollow" target="_blank" title=""&gt;Anchor v.0.30.0 及以上版本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.solanalabs.com/cli/install" rel="nofollow" target="_blank" title=""&gt;Solana CLI v1.18.16 及以上版本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.typescriptlang.org/download" rel="nofollow" target="_blank" title=""&gt;TypeScript&lt;/a&gt; 和 &lt;a href="https://www.npmjs.com/package/ts-node" rel="nofollow" target="_blank" title=""&gt;ts-node&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;原文推荐使用 Anchor 0.30，还是建议使用 Anchor 0.29，0.30 改动了多处，已经不兼容 0.29，更多内容请看 &lt;a href="https://soldev.cn/topics/4" rel="nofollow" target="_blank"&gt;https://soldev.cn/topics/4&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
检查你的 Solana 和 Anchor 版本

本指南适用于 Solana CLI 1.18.16 及以上版本。

- 在终端中运行 `solana --version` 来检查你的 Solana 版本。如果你需要更新，请遵循 [这里](https://docs.solanalabs.com/cli/install) 的说明。
- 在终端中运行 `anchor --version` 来检查你的 Anchor 版本。如果你需要更新，请遵循 [这里](https://www.anchor-lang.com/docs/installation) 的说明。
&lt;/blockquote&gt;

&lt;p&gt;让我们开始吧！&lt;/p&gt;
&lt;h2 id="什么是 Kinobi?​"&gt;什么是 Kinobi?​&lt;/h2&gt;
&lt;p&gt;Kinobi 是由 Metaplex 基金会创建的一个库，旨在为 Solana 程序生成客户端。Kinobi 的工作原理是通过传递一个或多个程序的 IDL 来生成 Kinobi，这是一棵可以被访问者更新的节点树。这些访问者可以根据需要更新说明或帐户。随后，与语言无关的渲染访问者可以生成各种语言的客户端，以便你可以管理客户端堆栈/依赖项。&lt;/p&gt;
&lt;h3 id="Kinobi 是如何工作的"&gt;Kinobi 是如何工作的&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;程序定义&lt;/strong&gt;：你定义你的 Solana 程序和相应的 IDLs。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;抽象&lt;/strong&gt;：Kinobi 创建了一个与语言无关的节点树 (或客户端代表)，访问者可以更新它。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;客户端生成&lt;/strong&gt;：Kinobi 的访问者处理树并生成特定语言的客户端。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src="/uploads/photo/Fifi/7e967cdc-f50d-4df9-a94a-6d242d85afb4.jpg!large" title="" alt=""&gt;
来源：&lt;a href="https://developers.metaplex.com/" rel="nofollow" target="_blank" title=""&gt;Metaplex Developers&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="关键元素"&gt;关键元素&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;程序&lt;/strong&gt;：与 IDLs 关联的 Solana 程序。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IDLs&lt;/strong&gt;：描述 Solana 程序的接口和功能。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kinobi 树&lt;/strong&gt;：编组 IDLs，促进客户端生成。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;访问者&lt;/strong&gt;：为特定语言定制客户端生成过程的模块。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;依赖项&lt;/strong&gt;：包括必要的库和实用程序，如 HTTP 接口、RPC 接口和加密工具。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;近期，Kinobi 增加了对从 Anchor IDLs 生成客户端的支持。这意味着你现在可以使用 Kinobi 为 Anchor 程序生成客户端。让我们看看怎么做。&lt;/p&gt;
&lt;h2 id="创建 Anchor 程序"&gt;创建 Anchor 程序&lt;/h2&gt;
&lt;p&gt;首先，让我们创建一个简单的 Anchor 程序。我们将创建一个有两条指令的程序：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;initialize&lt;/code&gt;：初始化数据帐号时使用 u64 值。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;set_data&lt;/code&gt;：设置数据帐号的值。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="初始化项目"&gt;初始化项目&lt;/h3&gt;
&lt;p&gt;创建一个新的项目目录，并运行以下命令来创建一个新的 Anchor 程序：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;anchor init kinobi-test
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;切换到项目目录：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd kinobi-test
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="安装依赖项"&gt;安装依赖项&lt;/h3&gt;
&lt;p&gt;项目初始化后，可以运行 &lt;code&gt;npm install&lt;/code&gt;，来确保安装了依赖项。然后我们将安装一些额外的依赖项。在终端中运行以下命令：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @kinobi-so/nodes-from-anchor @kinobi-so/renderers @kinobi-so/visitors-core @metaplex-foundation/umi @metaplex-foundation/umi-bundle-defaults
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将安装一些 Kinobi 包，包括 &lt;code&gt;nodes-from-anchor&lt;/code&gt; 包，它将帮助我们从 Anchor IDL 生成 Kinobi 树。&lt;/p&gt;
&lt;h3 id="更新 TSConfig"&gt;更新 TSConfig&lt;/h3&gt;
&lt;p&gt;将 &lt;code&gt;resolveJsonModule&lt;/code&gt; 添加到 &lt;code&gt;tsconfg.json&lt;/code&gt; 中，以确保我们可以加载 &lt;em&gt;IDL JSON&lt;/em&gt; 对象来生成客户端和 DOM 到 &lt;code&gt;lib&lt;/code&gt; 数组中，这样我们就可以在 Node.js 中运行我们的脚本。更新目录中的 &lt;code&gt;tsconfig.json&lt;/code&gt; 文件，使其看起来像这样：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;compilerOptions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;types&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mocha&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;chai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;typeRoots&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./node_modules/@types&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lib&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ES2020&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DOM&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;module&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;commonjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;target&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;es6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;esModuleInterop&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;resolveJsonModule&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;h3 id="编写 Anchor 程序"&gt;编写 Anchor 程序&lt;/h3&gt;
&lt;p&gt;下面让我们来编写 Anchor 程序。打开 &lt;code&gt;programs/kinobi-test/src/lib.rs&lt;/code&gt; 文件，用以下代码替换内容，注意不要覆盖 &lt;code&gt;declare_id!&lt;/code&gt; 宏：&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;span class="nd"&gt;declare_id!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"YOUR_PROGRAM_ID_HERE"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Replace with your program ID&lt;/span&gt;

&lt;span class="nd"&gt;#[program]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;kinobi_test&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;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;Context&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Initialize&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="n"&gt;ctx&lt;/span&gt;&lt;span class="py"&gt;.accounts.pda&lt;/span&gt;&lt;span class="nf"&gt;.set_inner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ExampleStruct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;data&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="n"&gt;authority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="py"&gt;.accounts.payer.key&lt;/span&gt;&lt;span class="p"&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="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;set_data&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;SetData&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;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&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="n"&gt;ctx&lt;/span&gt;&lt;span class="py"&gt;.accounts.pda.data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&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;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;Initialize&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nd"&gt;#[account(mut)]&lt;/span&gt;
    &lt;span class="n"&gt;payer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

 &lt;span class="nd"&gt;#[account(&lt;/span&gt;
 &lt;span class="nd"&gt;init,&lt;/span&gt;
 &lt;span class="nd"&gt;payer&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;payer,&lt;/span&gt;
 &lt;span class="nd"&gt;space&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="nd"&gt;,&lt;/span&gt;
 &lt;span class="nd"&gt;seeds&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="s"&gt;b"example"&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;as_ref(),&lt;/span&gt; &lt;span class="nd"&gt;payer&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;key()&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;as_ref()]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;bump&lt;/span&gt;
 &lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="n"&gt;pda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ExampleStruct&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;system_program&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Program&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;System&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="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;SetData&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nd"&gt;#[account(mut)]&lt;/span&gt;
    &lt;span class="n"&gt;authority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

 &lt;span class="nd"&gt;#[account(&lt;/span&gt;
        &lt;span class="nd"&gt;mut,&lt;/span&gt;
 &lt;span class="nd"&gt;has_one&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;authority,&lt;/span&gt;
 &lt;span class="nd"&gt;seeds&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="s"&gt;b"example"&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;as_ref(),&lt;/span&gt; &lt;span class="nd"&gt;authority&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;key()&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;as_ref()]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;bump&lt;/span&gt;
 &lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="n"&gt;pda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ExampleStruct&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="nd"&gt;#[account]&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;ExampleStruct&lt;/span&gt; &lt;span class="p"&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;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;authority&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是一个基本的 Anchor 程序，允许用户初始化一个 ExampleStruct（一个拥有 u32 数据和一个 &lt;code&gt;authority&lt;/code&gt; PublicKey 的 PDA）并设置数据值。PDAs 的 seed 是付款人的密钥和字符串"example"。你可以随意使用其他程序，或者根据需要修改这个程序——它仅用于演示。&lt;/p&gt;
&lt;h2 id="构建并测试程序"&gt;构建并测试程序&lt;/h2&gt;
&lt;p&gt;现在我们有了程序，可以构建和测试它了。在终端中运行以下命令：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;anchor build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这可能需要几分钟，但应该不会出现任何错误。当它运行时，让我们编写一个简单的测试脚本。打开你的 Anchor 生成的测试文件 &lt;code&gt;tests/kinobi-test.ts&lt;/code&gt;，并用以下代码替换内容：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;anchor&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@coral-xyz/anchor&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Program&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@coral-xyz/anchor&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;KinobiTest&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../target/types/kinobi_test&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;kinobi-test&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&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="nx"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AnchorProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;program&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;KinobiTest&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Program&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;KinobiTest&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;pda&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PublicKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findProgramAddressSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;example&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nx"&gt;program&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toBuffer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
 &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="nx"&gt;program&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;programId&lt;/span&gt;
 &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Is initialized!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;program&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;methods&lt;/span&gt;
 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;accountsStrict&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;payer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;program&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;pda&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;systemProgram&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SystemProgram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;programId&lt;/span&gt;
 &lt;span class="p"&gt;})&lt;/span&gt;
 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rpc&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
 &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Can set data!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;program&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;methods&lt;/span&gt;
 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;accountsStrict&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;authority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;program&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;pda&lt;/span&gt;
 &lt;span class="p"&gt;})&lt;/span&gt;
 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rpc&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;skipPreflight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;p&gt;这个脚本将测试我们程序中的两个指令。第一个测试将初始化数据帐户，第二个测试将数据值设置为 10。继续运行测试脚本：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;anchor test
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你应该会看到类似下面的内容：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kinobi-test
  ✔ Is initialized! (450ms)
  ✔ Can set data! (463ms)


2 passing (916ms)

Done in 2.80s.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;干得漂亮！&lt;/p&gt;
&lt;h2 id="用 Kinobi 生成一个客户端"&gt;用 Kinobi 生成一个客户端&lt;/h2&gt;
&lt;p&gt;你的测试已经成功运行，Anchor 应该已经为你在 &lt;code&gt;target/idl/kinobi_test.json&lt;/code&gt; 中自动生成了一个 IDL。定位此文件——我们将在下一节中使用它（注意：如果你为你的 Anchor 项目使用了不同的名称，此文件路径可能略有不同）。我们现在可以使用 Kinobi 为这个程序生成一个客户端。&lt;/p&gt;

&lt;p&gt;在根目录下创建一个新文件夹，&lt;code&gt;clients&lt;/code&gt;，并创建两个新文件：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;generate-client.ts&lt;/code&gt; 用于客户端生成脚本&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;example.ts&lt;/code&gt; 用于尝试生成客户端&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="生成客户端"&gt;生成客户端&lt;/h3&gt;
&lt;p&gt;打开 &lt;code&gt;generate-client.ts&lt;/code&gt;，将以下代码添加到文件中：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AnchorIdl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;rootNodeFromAnchorWithoutDefaultVisitor&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@kinobi-so/nodes-from-anchor&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;renderJavaScriptUmiVisitor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;renderJavaScriptVisitor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;renderRustVisitor&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@kinobi-so/renderers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;visit&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@kinobi-so/visitors-core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;anchorIdl&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../target/idl/kinobi_test.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Note: if you initiated your project with a different name, you may need to change this path&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateClients&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;rootNodeFromAnchorWithoutDefaultVisitor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;anchorIdl&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;AnchorIdl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;clients&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JS&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;clients/generated/js/src&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;renderVisitor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;renderJavaScriptVisitor&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Umi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;clients/generated/umi/src&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;renderVisitor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;renderJavaScriptUmiVisitor&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rust&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;clients/generated/rust/src&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;renderVisitor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;renderRustVisitor&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;clients&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;renderVisitor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`✅ Successfully generated &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; client for directory: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Error in &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;renderVisitor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;e&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="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;generateClients&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们来分析一下这个脚本的作用：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;导入必要的 Kinobi 包。&lt;/li&gt;
&lt;li&gt;导入由 Anchor 生成的 IDL 文件并从中创建 Kinobi 树（使用 &lt;code&gt;rootNodeFromAnchorWithoutDefaultVisitor&lt;/code&gt; 函数）。&lt;/li&gt;
&lt;li&gt;定义要生成的客户端（JavaScript、Umi 和 Rust）——可以随意注释掉任何你不需要的内容，并根据需要调整目录。&lt;/li&gt;
&lt;li&gt;迭代客户端并使用 &lt;code&gt;visit&lt;/code&gt; 函数使用适当的渲染访问者生成客户端。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="运行脚本"&gt;运行脚本&lt;/h3&gt;
&lt;p&gt;现在我们有了脚本，可以运行它来生成客户端。在终端中运行以下命令：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ts-node clients/generate-client.ts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你应该会看到类似下面的输出：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ts-node clients/generate-client.ts
Successfully generated JS client for directory: clients/generated/js/src!
Successfully generated Umi client for directory: clients/generated/umi/src!
Successfully generated Rust client for directory: clients/generated/rust/src!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在，你应该已经在 &lt;code&gt;clients&lt;/code&gt; 目录中为程序生成了客户端。干得漂亮！&lt;/p&gt;

&lt;p&gt;现在可以使用这些客户端与程序交互了。&lt;/p&gt;
&lt;h2 id="测试客户端"&gt;测试客户端&lt;/h2&gt;
&lt;p&gt;打开你之前创建的 &lt;code&gt;example.ts&lt;/code&gt; 文件，添加以下代码：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createUmi&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@metaplex-foundation/umi-bundle-defaults&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;TransactionBuilderSendAndConfirmOptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;generateSigner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;keypairIdentity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sol&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@metaplex-foundation/umi&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;publicKey&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;publicKeySerializer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@metaplex-foundation/umi/serializers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getKinobiTestProgramId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./generated/umi/src/programs/kinobiTest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setData&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./generated/umi/src/instructions&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;umi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createUmi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://127.0.0.1:8899&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;commitment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;processed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;creator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generateSigner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;umi&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;umi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;keypairIdentity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TransactionBuilderSendAndConfirmOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;commitment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;processed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;umi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;eddsa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findPda&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getKinobiTestProgramId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;umi&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;example&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;publicKeySerializer&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;logPda&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`PDA: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;pda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;airdropFunds&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;umi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;airdrop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;sol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`1. ✅ - Airdropped 100 SOL to the &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&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;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1. ❌ - Error airdropping SOL to the wallet.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;initializeAccount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;umi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;pda&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;payer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;creator&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;sendAndConfirm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;umi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2. ✅ - Initialized the account.&lt;/span&gt;&lt;span class="dl"&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;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2. ❌ - Error initializing the account.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;setDataAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;umi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;authority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pda&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;sendAndConfirm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;umi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. ✅ - Set data to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;. ❌ - Error setting data.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;logPda&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;airdropFunds&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;initializeAccount&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;setDataAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;setDataAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;setDataAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;setDataAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🚀 - Done!&lt;/span&gt;&lt;span class="dl"&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;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;❌ - Error:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&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;p&gt;这个脚本将会：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;导入必要的 Umi 包和助手&lt;/li&gt;
&lt;li&gt;导入生成的客户端函数&lt;/li&gt;
&lt;li&gt;创建一个 Umi 实例&lt;/li&gt;
&lt;li&gt;根据我们程序的 seed 为签名者获取 PDA&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;定义函数来记录 PDA、空投资金、初始化帐户和设置数据&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;注意，Kinobi 生成了我们的 &lt;code&gt;initialize&lt;/code&gt; 和 &lt;code&gt;setData&lt;/code&gt; 函数。它们接收 Umi 实例和必要的参数，并返回一个可用于发送和确认交易的函数。简单，对吧？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;最后，在 &lt;code&gt;main&lt;/code&gt; 函数中按顺序运行这些函数。我们加入了几个 &lt;code&gt;setData&lt;/code&gt; 调用来演示其功能。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="运行脚本"&gt;运行脚本&lt;/h3&gt;
&lt;p&gt;现在我们有了脚本，可以运行它与程序交互了。在终端中运行以下命令：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ts-node clients/example.ts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我猜你收到报错了，对吧？这是因为我们的本地验证器没有运行。让我们使用 &lt;code&gt;--detach&lt;/code&gt; 标志重新运行测试，并让它保持在后台运行：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;anchor test --detach
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在，在另一个终端中，再次运行 &lt;code&gt;example.ts&lt;/code&gt; 脚本：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ts-node clients/example.ts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这次运气好点？你应该会看到类似下面的输出：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PDA: 5GawRMyhgw8uDxanKeZd89AMeteuHmuAhyb2NSN7YEgJ,255
1. ✅ - Airdropped 100 SOL to the 5L8siRBhjiAE4GJKZmZSSkfCYBSRZXMv44SVuoD888Yt
2. ✅ - Initialized the account.
3. ✅ - Set data to 10.
4. ✅ - Set data to 20.
5. ✅ - Set data to 30.
6. ✅ - Set data to 40.
🚀 - Done!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;恭喜你！你已经成功地使用 Kinobi 为你的 Anchor 程序生成了一个客户端，并使用 Umi 与之交互。现在你可以使用这个客户端与你的应用程式中的程序进行交互了。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;干得好，能走到这一步。以下是你已完成工作的简要回顾：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;程序创建&lt;/strong&gt;：你创建了一个简单的带有基本指令的 Anchor 程序。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;测试&lt;/strong&gt;：你编写并执行了测试，以确保程序正确运行。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;客户端生成&lt;/strong&gt;：你使用了 Kinobi 从你的 Anchor IDL 生成 JavaScript、Umi 和 Rust 客户端。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;客户端交互&lt;/strong&gt;：你编写了一个脚本，使用生成的客户端与程序交互，并确认其功能性。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;通过利用 Kinobi，你已经简化了客户端生成过程，使你的开发工作流更加高效。如果你正在构建一个复杂的程序，为你的客户构建许多程序，或者只是想节省时间，Kinobi 可以是你工具包中一个有价值的工具。&lt;/p&gt;

&lt;p&gt;Kinobi 对 Anchor 的支持仍然非常初期，正在积极开发中。代码可能会更改，新功能可能会添加。如果你遇到任何问题，请加入&lt;a href="https://discord.gg/quicknode" rel="nofollow" target="_blank" title=""&gt;Discord&lt;/a&gt;沟通。&lt;/p&gt;</description>
      <author>Fifi</author>
      <pubDate>Mon, 01 Jul 2024 21:16:37 +0800</pubDate>
      <link>https://soldev.cn/topics/38</link>
      <guid>https://soldev.cn/topics/38</guid>
    </item>
  </channel>
</rss>
