<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>贺同学</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://herongwei.me/</id>
  <link href="https://herongwei.me/" rel="alternate"/>
  <link href="https://herongwei.me/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, 贺同学</rights>
  <subtitle>Web3 链上金融基础设施与套利工程实践</subtitle>
  <title>程序员贺同学</title>
  <updated>2026-07-14T13:11:02.993Z</updated>
  <entry>
    <author>
      <name>贺同学</name>
    </author>
    <category term="chain" scheme="https://herongwei.me/tags/chain/"/>
    <content>
      <![CDATA[<h1 id="Robinhood-Chain-中文接入与生态调研手册"><a href="#Robinhood-Chain-中文接入与生态调研手册" class="headerlink" title="Robinhood Chain 中文接入与生态调研手册"></a>Robinhood Chain 中文接入与生态调研手册</h1><blockquote><p>整理日期：2026-07-12 官方文档：<a href="https://docs.robinhood.com/chain/">Robinhood Chain Documentation</a> 定位：面向后端、链上数据、钱包、出入金、合约与套利监控开发的中文技术手册。本文是对官方文档的结构化中文整理，不是逐句翻译；网络参数、合约地址和第三方服务可能变更，上线前必须再次核对官方页面与链上状态。</p></blockquote><h2 id="1-一页速览"><a href="#1-一页速览" class="headerlink" title="1. 一页速览"></a>1. 一页速览</h2><p>Robinhood Chain 是一条开放、无需许可、兼容 EVM 的 Ethereum Layer 2，底层采用 Arbitrum Dedicated Blockchains &#x2F; Arbitrum Nitro。它面向链上金融基础设施，重点承载股票、ETF、私人资产等 RWA，同时支持普通加密资产和 DeFi 应用。</p><p>核心特性：</p><ul><li><p>Ethereum L2，交易数据通过 blob 提交到 Ethereum。</p></li><li><p>原生 Gas 代币为 ETH。</p></li><li><p>Solidity、Vyper 合约可直接部署，兼容 Foundry、Hardhat、ethers.js、viem、Wagmi 和标准 JSON-RPC。</p></li><li><p>主网 Chain ID 为 <code>4663</code>，测试网 Chain ID 为 <code>46630</code>。</p></li><li><p>Sequencer 采用按交易到达时间排序的 FCFS（先到先得）模型；提高 priority fee 不能插队。</p></li><li><p>支持 ERC-4337 与 EIP-7702，可实现 Gas 代付、批量交易、会话密钥和可编程账户。</p></li><li><p>股票代币采用 ERC-20 + ERC-8056，并通过 Chainlink 提供链上价格。</p></li><li><p>官方称网络开放且无需许可，但 Sequencer 会进行合规筛查，与受制裁地址相关的交易可能不被打包；读取操作不受影响。</p></li></ul><h2 id="2-网络信息与端点"><a href="#2-网络信息与端点" class="headerlink" title="2. 网络信息与端点"></a>2. 网络信息与端点</h2><h3 id="2-1-网络参数"><a href="#2-1-网络参数" class="headerlink" title="2.1 网络参数"></a>2.1 网络参数</h3><table><thead><tr><th>参数</th><th>主网</th><th>测试网</th></tr></thead><tbody><tr><td>网络名</td><td>Robinhood Chain</td><td>Robinhood Chain Testnet &#x2F; Sepolia</td></tr><tr><td>Chain ID</td><td><code>4663</code></td><td><code>46630</code></td></tr><tr><td>原生货币</td><td>ETH</td><td>ETH</td></tr><tr><td>公共 RPC</td><td><code>https://rpc.mainnet.chain.robinhood.com</code></td><td><code>https://rpc.testnet.chain.robinhood.com</code></td></tr><tr><td>公共 Sequencer</td><td><code>https://sequencer.mainnet.chain.robinhood.com</code></td><td><code>https://sequencer.testnet.chain.robinhood.com</code></td></tr><tr><td>Sequencer Feed</td><td><code>wss://feed.mainnet.chain.robinhood.com</code></td><td><code>wss://feed.testnet.chain.robinhood.com</code></td></tr><tr><td>区块浏览器</td><td><a href="https://robinhoodchain.blockscout.com/">robinhoodchain.blockscout.com</a></td><td><a href="https://explorer.testnet.chain.robinhood.com/">explorer.testnet.chain.robinhood.com</a></td></tr></tbody></table><p>官方公共 RPC 有速率限制，不适合生产环境、高吞吐扫描或延迟敏感业务。生产环境应使用商业 RPC、自建节点，并至少配置一个备用提供商。官方推荐 Alchemy，也列出 QuickNode、Blockdaemon、dRPC、Validation Cloud。</p><p>Alchemy：</p><p>Mainnet RPC: <a href="https://robinhood-mainnet.g.alchemy.com/v2/%7BAPI_KEY%7D">https://robinhood-mainnet.g.alchemy.com/v2/{API_KEY}</a><br>Mainnet WS:  wss:&#x2F;&#x2F;robinhood-mainnet.g.alchemy.com&#x2F;v2&#x2F;{API_KEY}<br>Testnet RPC: <a href="https://robinhood-testnet.g.alchemy.com/v2/%7BAPI_KEY%7D">https://robinhood-testnet.g.alchemy.com/v2/{API_KEY}</a><br>Testnet WS:  wss:&#x2F;&#x2F;robinhood-testnet.g.alchemy.com&#x2F;v2&#x2F;{API_KEY}</p><p>QuickNode：</p><p>https:&#x2F;&#x2F;{ENDPOINT}.robinhood-mainnet.quiknode.pro&#x2F;{TOKEN}</p><h3 id="2-2-JSON-RPC-快速验证"><a href="#2-2-JSON-RPC-快速验证" class="headerlink" title="2.2 JSON-RPC 快速验证"></a>2.2 JSON-RPC 快速验证</h3><p>查询 Chain ID：</p><p>curl -s <a href="https://rpc.mainnet.chain.robinhood.com/">https://rpc.mainnet.chain.robinhood.com</a> \<br>  -H ‘content-type: application&#x2F;json’ \<br>  –data ‘{“jsonrpc”:”2.0”,”id”:1,”method”:”eth_chainId”,”params”:[]}’</p><p>查询最新 L2 区块：</p><p>curl -s <a href="https://rpc.mainnet.chain.robinhood.com/">https://rpc.mainnet.chain.robinhood.com</a> \<br>  -H ‘content-type: application&#x2F;json’ \<br>  –data ‘{“jsonrpc”:”2.0”,”id”:1,”method”:”eth_getBlockByNumber”,”params”:[“latest”,false]}’</p><p>查询交易回执：</p><p>curl -s <a href="https://rpc.mainnet.chain.robinhood.com/">https://rpc.mainnet.chain.robinhood.com</a> \<br>  -H ‘content-type: application&#x2F;json’ \<br>  –data ‘{“jsonrpc”:”2.0”,”id”:1,”method”:”eth_getTransactionReceipt”,”params”:[“0xTRANSACTION_HASH”]}’</p><p>查询同步状态：</p><p>curl -s <a href="https://rpc.mainnet.chain.robinhood.com/">https://rpc.mainnet.chain.robinhood.com</a> \<br>  -H ‘content-type: application&#x2F;json’ \<br>  –data ‘{“jsonrpc”:”2.0”,”id”:1,”method”:”eth_syncing”,”params”:[]}’</p><p>完全同步的节点返回 <code>false</code>。</p><h3 id="2-3-常用接口能力"><a href="#2-3-常用接口能力" class="headerlink" title="2.3 常用接口能力"></a>2.3 常用接口能力</h3><p>Robinhood Chain 使用标准 Ethereum JSON-RPC，可直接复用 EVM 链客户端：</p><table><thead><tr><th>业务</th><th>建议接口</th></tr></thead><tbody><tr><td>区块扫描</td><td><code>eth_blockNumber</code>、<code>eth_getBlockByNumber</code></td></tr><tr><td>交易扫描</td><td><code>eth_getTransactionByHash</code>、<code>eth_getTransactionReceipt</code></td></tr><tr><td>Event 监听</td><td><code>eth_getLogs</code>、WebSocket <code>eth_subscribe</code></td></tr><tr><td>余额与 Token</td><td><code>eth_getBalance</code>、<code>eth_call(balanceOf)</code></td></tr><tr><td>发送交易</td><td><code>eth_sendRawTransaction</code></td></tr><tr><td>Gas 估算</td><td><code>eth_estimateGas</code>、<code>eth_gasPrice</code></td></tr><tr><td>合约读取</td><td><code>eth_call</code></td></tr><tr><td>历史状态</td><td>Archive RPC；公共端点不应默认具备完整历史能力</td></tr></tbody></table><p>Alchemy 还提供索引化 Data API，可用于余额、交易历史、NFT 和 Portfolio 数据。它不是 Robinhood 专用协议接口，调用方式与限额以 Alchemy 文档为准。</p><h2 id="3-与-Ethereum-的关键差异"><a href="#3-与-Ethereum-的关键差异" class="headerlink" title="3. 与 Ethereum 的关键差异"></a>3. 与 Ethereum 的关键差异</h2><h3 id="3-1-block-number-不是-L2-实际区块号"><a href="#3-1-block-number-不是-L2-实际区块号" class="headerlink" title="3.1 block.number 不是 L2 实际区块号"></a>3.1 <code>block.number</code> 不是 L2 实际区块号</h3><p>合约中的 <code>block.number</code> 返回估算的 Ethereum L1 区块号，而且只会周期性更新，不能用它精确计算 L2 时间或作为逐块递增计数器。</p><p>合约内读取实际 L2 区块号：</p><p>uint256 l2Block &#x3D; ArbSys(0x0000000000000000000000000000000000000064)<br>    .arbBlockNumber();</p><p>链下服务应直接使用 RPC 返回的 Robinhood Chain 区块高度。</p><h3 id="3-2-随机数"><a href="#3-2-随机数" class="headerlink" title="3.2 随机数"></a>3.2 随机数</h3><p><code>block.prevrandao</code> &#x2F; <code>block.difficulty</code> 在本链返回常量，不能作为随机源。需要随机数时使用 Chainlink VRF 等专门服务。<code>blockhash(n)</code> 只对近期区块相对可靠，也不能作为安全随机源。</p><h3 id="3-3-交易排序"><a href="#3-3-交易排序" class="headerlink" title="3.3 交易排序"></a>3.3 交易排序</h3><p>Sequencer 按交易到达时间进行 FCFS 排序。不存在 Ethereum 风格的 priority gas auction，提高 Gas 小费无法把交易排到已经进入队列的交易前面。</p><p>对套利与 MEV 的含义：</p><ul><li><p>延迟、RPC 路由、与 Sequencer 的网络距离比 priority fee 更重要。</p></li><li><p>公共 RPC 不适合低延迟竞速。</p></li><li><p>不能照搬 Ethereum 公共 mempool 的 Gas 竞价模型。</p></li><li><p>需要区分“发送到普通 RPC”“发送到 Sequencer”“订阅 Sequencer Feed”三条路径。</p></li></ul><h3 id="3-4-Gas-与费用"><a href="#3-4-Gas-与费用" class="headerlink" title="3.4 Gas 与费用"></a>3.4 Gas 与费用</h3><p>交易总费用由两部分构成：</p><ol><li><p>L2 执行费：L2 gas used × L2 gas price。</p></li><li><p>L1 数据费：将交易数据发布到 Ethereum 的成本，受 L1 拥堵程度与 calldata 大小影响。</p></li></ol><p>两部分会统一包含在交易 Gas 估算与支付中，一般可继续使用 <code>eth_estimateGas</code>。降低费用最有效的方法是减少 calldata、紧凑编码和合理批量处理。</p><h3 id="3-5-地址别名"><a href="#3-5-地址别名" class="headerlink" title="3.5 地址别名"></a>3.5 地址别名</h3><p>当 Ethereum L1 合约向 L2 合约发消息时，L2 合约看到的 <code>msg.sender</code> 是经过 alias 的 L1 地址，而不是原始 L1 地址。跨链访问控制必须使用 Arbitrum SDK 的 <code>applyAlias</code> &#x2F; <code>undoAlias</code> 处理。</p><h3 id="3-6-合约大小与预编译"><a href="#3-6-合约大小与预编译" class="headerlink" title="3.6 合约大小与预编译"></a>3.6 合约大小与预编译</h3><ul><li><p>最大运行时代码大小：96 KB；Ethereum 通常为 24 KB。</p></li><li><p>最大 init code：192 KB。</p></li><li><p>提供 ArbSys、ArbGasInfo、ArbAddressTable、NodeInterface 等 Arbitrum 预编译合约。</p></li><li><p><code>block.coinbase</code> 返回网络费用账户，并非矿工或验证者。</p></li></ul><h2 id="4-交易确认与最终性"><a href="#4-交易确认与最终性" class="headerlink" title="4. 交易确认与最终性"></a>4. 交易确认与最终性</h2><table><thead><tr><th>阶段</th><th>含义</th><th>典型延迟</th><th>适用场景</th></tr></thead><tbody><tr><td>Sequencer 软确认</td><td>Sequencer 接收、排序、执行并返回 receipt</td><td>亚秒级</td><td>普通交互、低价值业务</td></tr><tr><td>已提交 Ethereum</td><td>批次写入 L1 Inbox</td><td>数分钟</td><td>较高价值业务，可认为排序已固定</td></tr><tr><td>Ethereum Finality</td><td>承载批次的 L1 区块完成最终确认</td><td>提交后约 13 分钟</td><td>高价值、不可逆结算</td></tr></tbody></table><p>工程建议：</p><ul><li><p>充值服务不要只有一个统一的 <code>confirmed</code> 状态，至少区分 <code>SEQUENCER_CONFIRMED</code>、<code>POSTED_TO_L1</code>、<code>L1_FINALIZED</code>。</p></li><li><p>小额充值可按风险接受软确认；大额充值、清算、跨系统记账应等待 L1 提交或最终性。</p></li><li><p>7 天官方桥提现期属于欺诈证明挑战期，与普通交易最终性不是同一概念。</p></li></ul><h2 id="5-Robinhood-Stock-Tokens"><a href="#5-Robinhood-Stock-Tokens" class="headerlink" title="5. Robinhood Stock Tokens"></a>5. Robinhood Stock Tokens</h2><h3 id="5-1-法律与技术属性"><a href="#5-1-法律与技术属性" class="headerlink" title="5.1 法律与技术属性"></a>5.1 法律与技术属性</h3><p>Robinhood Stock Tokens 是由 Robinhood Assets (Jersey) Limited（RHJ）发行的代币化债务证券，用于提供对美国股票、ETF 等底层证券的经济敞口。持有人并不因此取得底层证券本身的法律权利或受益权。</p><p>技术上：</p><ul><li><p>标准 ERC-20，18 位小数。</p></li><li><p>可持有、转账并被 DeFi 合约组合。</p></li><li><p>同时实现 ERC-8056（Scaled UI Amount Extension）。</p></li><li><p>每种股票代币都有 Chainlink 价格 Feed。</p></li><li><p>一级市场铸造只面向完成 KYB 的 Authorized Participant；普通开发者主要组合已有流通 Token。</p></li><li><p>存在地区与证券合规限制，不能只因为合约开放就假设任何地区用户都可交易。</p></li></ul><h3 id="5-2-企业行动与-uiMultiplier"><a href="#5-2-企业行动与-uiMultiplier" class="headerlink" title="5.2 企业行动与 uiMultiplier"></a>5.2 企业行动与 <code>uiMultiplier</code></h3><p>股息再投资、拆股等企业行动通过链上 multiplier 调整“每枚 Token 对应多少底层股份”，而不会修改原始 <code>balanceOf()</code> 或 <code>totalSupply()</code>。因此它不是 rebasing token。</p><p>底层股份数量 &#x3D; 原始 Token 数量 × uiMultiplier &#x2F; 1e18</p><p>初始通常为：</p><p>uiMultiplier &#x3D; 1e18  →  1 Token &#x3D; 1 股</p><p>重要读取接口：</p><p>interface IScaledUIAmount {<br>    function uiMultiplier() external view returns (uint256);  </p><pre><code>event UIMultiplierUpdated(      uint256 oldMultiplier,      uint256 newMultiplier,      uint256 effectiveAtTimestamp  );  event TransferWithScaledUI(      address indexed from,      address indexed to,      uint256 value,      uint256 uiValue  );  </code></pre><p>}  </p><p>interface IScaledUIAmountPending {<br>    function newUIMultiplier() external view returns (uint256);<br>    function effectiveAt() external view returns (uint256);<br>}  </p><p>interface IScaledUIAmountBalances {<br>    function balanceOfUI(address account) external view returns (uint256);<br>    function totalSupplyUI() external view returns (uint256);<br>}</p><p>索引器应同时监听普通 <code>Transfer</code>、<code>TransferWithScaledUI</code>、<code>UIMultiplierUpdated</code>。计算用户资产价值时，不要把 Chainlink Feed 价格再次乘 multiplier，因为 Feed 已经包含该调整。</p><h3 id="5-3-预言机与估值"><a href="#5-3-预言机与估值" class="headerlink" title="5.3 预言机与估值"></a>5.3 预言机与估值</h3><p>股票代币 Feed 使用 Chainlink <code>AggregatorV3Interface</code>：</p><p>interface AggregatorV3Interface {<br>    function latestRoundData()<br>        external<br>        view<br>        returns (<br>            uint80 roundId,<br>            int256 answer,<br>            uint256 startedAt,<br>            uint256 updatedAt,<br>            uint80 answeredInRound<br>        );  </p><pre><code>function decimals() external view returns (uint8);  </code></pre><p>}</p><p>显示口径：</p><p>每枚 Token 价值      &#x3D; feedPrice<br>底层单股价格          &#x3D; feedPrice × 1e18 &#x2F; uiMultiplier<br>持仓对应的底层股份数   &#x3D; rawBalance × uiMultiplier &#x2F; 1e18</p><p>Feed 的几个重要特性：</p><ul><li><p>股票 Feed 按美股市场节奏 24&#x2F;5 更新，不是 24&#x2F;7。</p></li><li><p>Feed 价格跟踪包含股息再投资的总回报，长期可能高于行情软件显示的底层单股价格。</p></li><li><p>企业行动处理期间，相关 Token 预言机可能暂停。</p></li><li><p>Token 可通过 <code>oraclePaused()</code> 暴露暂停状态；该状态是提示性信号，仍应以 heartbeat 和 <code>updatedAt</code> 检查为主要保护。</p></li><li><p>必须读取 Feed 的 <code>decimals()</code>，不要默认全部为 8 位。</p></li><li><p>L2 上读取价格前应校验 Chainlink Sequencer Uptime Feed，并设置 Sequencer 恢复后的 grace period。</p></li></ul><p>价格读取保护至少包括：</p><p>require(answer &gt; 0, “invalid price”);<br>require(block.timestamp - updatedAt &lt;&#x3D; MAX_STALENESS, “stale price”);<br>require(sequencerStatus &#x3D;&#x3D; 0, “sequencer down”);<br>require(block.timestamp - sequencerStartedAt &gt; GRACE_PERIOD, “grace period”);<br>require(!stockToken.oraclePaused(), “oracle paused”);</p><p>Feed 地址、decimals 和 heartbeat 应从 <a href="https://docs.chain.link/data-feeds/price-feeds/addresses">Chainlink Robinhood Feed 页面</a> 动态核对，不建议永久硬编码文档快照。</p><h3 id="5-4-主网-Token-合约地址"><a href="#5-4-主网-Token-合约地址" class="headerlink" title="5.4 主网 Token 合约地址"></a>5.4 主网 Token 合约地址</h3><p>必须用官方地址识别正牌 Robinhood Stock Token；同名或同 ticker 的其他合约不代表官方 Token。</p><p>基础资产：</p><table><thead><tr><th>Token</th><th>主网地址</th></tr></thead><tbody><tr><td>WETH</td><td><code>0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73</code></td></tr><tr><td>USDG</td><td><code>0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168</code></td></tr></tbody></table><p>股票代币：</p><table><thead><tr><th>Ticker</th><th>主网地址</th></tr></thead><tbody><tr><td>AAPL</td><td><code>0xaF3D76f1834A1d425780943C99Ea8A608f8a93f9</code></td></tr><tr><td>AMD</td><td><code>0x86923f96303D656E4aa86D9d42D1e57ad2023fdC</code></td></tr><tr><td>AMZN</td><td><code>0x12f190a9F9d7D37a250758b26824B97CE941bF54</code></td></tr><tr><td>BABA</td><td><code>0xad25Ac6C84D497db898fa1E8387bf6Af3532a1c4</code></td></tr><tr><td>BE</td><td><code>0x822CC93fFD030293E9842c30BBD678F530701867</code></td></tr><tr><td>COIN</td><td><code>0x6330D8C3178a418788dF01a47479c0ce7CCF450b</code></td></tr><tr><td>CRCL</td><td><code>0xdF0992E440dD0be65BD8439b609d6D4366bf1CB5</code></td></tr><tr><td>CRWV</td><td><code>0x5f10A1C971B69e47e059e1dC91901B59b3fB49C3</code></td></tr><tr><td>GOOGL</td><td><code>0x2e0847E8910a9732eB3fb1bb4b70a580ADAD4FE3</code></td></tr><tr><td>INTC</td><td><code>0xc72b96e0E48ecd4DC75E1e45396e26300BC39681</code></td></tr><tr><td>META</td><td><code>0xc0D6457C16Cc70d6790Dd43521C899C87ce02f35</code></td></tr><tr><td>MSFT</td><td><code>0xe93237C50D904957Cf27E7B1133b510C669c2e74</code></td></tr><tr><td>MU</td><td><code>0xfF080c8ce2E5feadaCa0Da81314Ae59D232d4afD</code></td></tr><tr><td>NVDA</td><td><code>0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC</code></td></tr><tr><td>ORCL</td><td><code>0xb0992820E760d836549ba69BC7598b4af75dEE03</code></td></tr><tr><td>PLTR</td><td><code>0x894E1EC2D74FFE5AEF8Dc8A9e84686acCB964F2A</code></td></tr><tr><td>SNDK</td><td><code>0xB90A19fF0Af67f7779afF50A882A9CfF42446400</code></td></tr><tr><td>SPCX</td><td><code>0x4a0E65A3EcceC6dBe60AE065F2e7bb85Fae35eEa</code></td></tr><tr><td>TSLA</td><td><code>0x322F0929c4625eD5bAd873c95208D54E1c003b2d</code></td></tr><tr><td>USAR</td><td><code>0xd917B029C761D264c6A312BBbcDA868658eF86a6</code></td></tr></tbody></table><p>ETF 代币：</p><table><thead><tr><th>Ticker</th><th>主网地址</th></tr></thead><tbody><tr><td>QQQ</td><td><code>0xD5f3879160bc7c32ebb4dC785F8a4F505888de68</code></td></tr><tr><td>SGOV</td><td><code>0x92FD66527192E3e61d4DDd13322Aa222DE86F9B5</code></td></tr><tr><td>SLV</td><td><code>0x411eFb0E7f985935DAec3D4C3ebaEa0d0AD7D89f</code></td></tr><tr><td>SPY</td><td><code>0x117cc2133c37B721F49dE2A7a74833232B3B4C0C</code></td></tr><tr><td>CUSO</td><td><code>0xa30FA36Db767ad9eD3f7a60fC79526fB4d56D344</code></td></tr></tbody></table><p>官方地址源：<a href="https://docs.robinhood.com/chain/contracts/">Token Contracts</a>。</p><h2 id="6-跨链桥与跨链消息"><a href="#6-跨链桥与跨链消息" class="headerlink" title="6. 跨链桥与跨链消息"></a>6. 跨链桥与跨链消息</h2><h3 id="6-1-可用路线"><a href="#6-1-可用路线" class="headerlink" title="6.1 可用路线"></a>6.1 可用路线</h3><table><thead><tr><th>路线</th><th>类型</th><th>典型速度</th><th>特点</th></tr></thead><tbody><tr><td>Arbitrum 官方桥</td><td>Trustless L1↔L2</td><td>充值约 10 分钟；提现约 7 天</td><td>安全继承 Ethereum，适合 ETH&#x2F;ERC-20</td></tr><tr><td>LayerZero OFT &#x2F; Stargate</td><td>消息 + OFT</td><td>数分钟</td><td>适合 WBTC、USDG 等 OFT</td></tr><tr><td>Chainlink CCIP</td><td>消息 + Token</td><td>数分钟</td><td>可桥接并触发目标链动作</td></tr><tr><td>Relay</td><td>Intent Bridge</td><td>秒级</td><td>低成本，可 bridge-and-execute</td></tr><tr><td>Across</td><td>Intent Bridge</td><td>秒级</td><td>资本效率较高</td></tr><tr><td>LI.FI &#x2F; 0x</td><td>聚合器</td><td>秒到分钟</td><td>Swap + Bridge 一体化</td></tr></tbody></table><h3 id="6-2-官方桥状态机"><a href="#6-2-官方桥状态机" class="headerlink" title="6.2 官方桥状态机"></a>6.2 官方桥状态机</h3><p>Ethereum → Robinhood Chain：</p><ol><li><p>在 L1 发起充值。</p></li><li><p>通过 Arbitrum retryable ticket 在 L2 执行。</p></li><li><p>正常约 10 分钟到账。</p></li><li><p>若 L2 执行因 Gas 不足等原因失败，资金不会直接丢失，可在 7 天内手动 redeem ticket。</p></li></ol><p>Robinhood Chain → Ethereum：</p><ol><li><p>在 L2 发起 withdrawal。</p></li><li><p>等待约 7 天挑战期。</p></li><li><p>在 L1 主动 claim，并支付 L1 Gas。</p></li></ol><p>桥接 ERC-20 后，L2 地址通常不同于 L1 地址。可调用 L2 Gateway Router 的 <code>calculateL2TokenAddress</code> 解析映射。</p><h3 id="6-3-任意跨链消息"><a href="#6-3-任意跨链消息" class="headerlink" title="6.3 任意跨链消息"></a>6.3 任意跨链消息</h3><ul><li><p>L1 → L2：通过 Delayed Inbox 创建 retryable ticket，通常数分钟。</p></li><li><p>L2 → L1：通过 ArbSys 发消息，等待 7 天挑战期后在 L1 Outbox 执行。</p></li><li><p>官方建议使用 <code>@arbitrum/sdk</code>，不要手工编码底层消息。</p></li></ul><p>注册自定义 Arbitrum 网络的关键参数：</p><p>import { registerCustomArbitrumNetwork } from “@arbitrum&#x2F;sdk”;  </p><p>registerCustomArbitrumNetwork({<br>  name: “Robinhood Chain”,<br>  chainId: 4663,<br>  parentChainId: 1,<br>  confirmPeriodBlocks: 45818,<br>  ethBridge: {<br>    bridge: “0xDf8755334ce7A73cCF6b581C02eA649AE3E864b3”,<br>    inbox: “0x1A07cc4BD17E0118BdB54D70990D2158AbAD7a2D”,<br>    sequencerInbox: “0xBd0D173EEb87D57A09521c24388a12789F33ba96”,<br>    outbox: “0xf0ce991ea4A0d2400A4AB49b20ae333f6Dce3DE9”,<br>    rollup: “0x23A19d23e89166adedbDcB432518AB01e4272D94”,<br>  },<br>});</p><h2 id="7-协议合约地址"><a href="#7-协议合约地址" class="headerlink" title="7. 协议合约地址"></a>7. 协议合约地址</h2><h3 id="7-1-Ethereum-L1-核心合约"><a href="#7-1-Ethereum-L1-核心合约" class="headerlink" title="7.1 Ethereum L1 核心合约"></a>7.1 Ethereum L1 核心合约</h3><table><thead><tr><th>合约</th><th>主网地址</th><th>Sepolia 测试网地址</th></tr></thead><tbody><tr><td>Rollup</td><td><code>0x23A19d23e89166adedbDcB432518AB01e4272D94</code></td><td><code>0xdc5F8E399DBd8a9F5F87AeC4C23Beb12431b386D</code></td></tr><tr><td>Sequencer Inbox</td><td><code>0xBd0D173EEb87D57A09521c24388a12789F33ba96</code></td><td><code>0xA0D9dB3DC9791D54b5183C1C1866eFe1eCA7D414</code></td></tr><tr><td>Delayed Inbox</td><td><code>0x1A07cc4BD17E0118BdB54D70990D2158AbAD7a2D</code></td><td><code>0xF2939afA86F6f933A3CE17fCAB007907B6b0B7a4</code></td></tr><tr><td>Bridge</td><td><code>0xDf8755334ce7A73cCF6b581C02eA649AE3E864b3</code></td><td><code>0x96295BDad104eaD97cC08797b3dC68efF59CcF30</code></td></tr><tr><td>Outbox</td><td><code>0xf0ce991ea4A0d2400A4AB49b20ae333f6Dce3DE9</code></td><td><code>0x8D180Caf588f3Da027BEf1F42a106Da93F90b166</code></td></tr><tr><td>CoreProxyAdmin</td><td><code>0x1232813BDd40aa9d53066A880dE78a4Be70B90FD</code></td><td><code>0x20d5d542c1bF0a3c295524Eaef336fC07e890622</code></td></tr></tbody></table><h3 id="7-2-Token-Bridge"><a href="#7-2-Token-Bridge" class="headerlink" title="7.2 Token Bridge"></a>7.2 Token Bridge</h3><p>L1：</p><table><thead><tr><th>合约</th><th>主网地址</th><th>测试网地址</th></tr></thead><tbody><tr><td>L1 Gateway Router</td><td><code>0x6a2E3a1e16FC29f27Ce61429746D558d656975bB</code></td><td><code>0xF6F11aAEE80875776C264d93B37B34cE437382D1</code></td></tr><tr><td>L1 ERC20 Gateway</td><td><code>0x85001CC4867C5e1C22dA4B79BB8852B9e2a06da0</code></td><td><code>0x52C2976cbDEf48BcC51d07d3c523769F76ECBd09</code></td></tr><tr><td>L1 Custom Gateway</td><td><code>0x9368EAEbFe6E063C69dcF8126711A6997E0eCeE1</code></td><td><code>0xFB4aa8024F70B00121723A9C923BaD0Dd2dFaf8F</code></td></tr><tr><td>L1 WETH Gateway</td><td><code>0xF7e12b9614b509C747ab4423bC4ACF923759Cf1B</code></td><td><code>0x8f8A6799F2b1978c6586318543c73D8Fb12f218f</code></td></tr></tbody></table><p>L2：</p><table><thead><tr><th>合约</th><th>主网地址</th><th>测试网地址</th></tr></thead><tbody><tr><td>L2 Gateway Router</td><td><code>0x1E324B9316138CA9a73F960213621AD1aaf01B89</code></td><td><code>0x77bF00A6A90c600f214b34BAFBB7918c0cF113A8</code></td></tr><tr><td>L2 ERC20 Gateway</td><td><code>0xfd9b17206278C16DdaacF6AC8f05dBf97EdCb31e</code></td><td><code>0x8689aFB9086734e12beA6b5DF541a1da252Ea32a</code></td></tr><tr><td>L2 Custom Gateway</td><td><code>0x912285144fC0f6e89d3Ed16F5Ab72f87A1878959</code></td><td><code>0xE4EE9C15e2cA44136796342e31b67d953E67a70b</code></td></tr><tr><td>L2 WETH Gateway</td><td><code>0x1D187C3E2dA52D72BC9C41e3AbA0fdFa6a7bF055</code></td><td><code>0x5A8F55202A625D12FFCb76F857FE4563bC8Ce413</code></td></tr><tr><td>L2 WETH</td><td><code>0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73</code></td><td><code>0x7943e237c7F95DA44E0301572D358911207852Fa</code></td></tr></tbody></table><p>其他常用 L2 合约：</p><table><thead><tr><th>合约</th><th>主网地址</th><th>测试网地址</th></tr></thead><tbody><tr><td>Multicall</td><td><code>0x2cAC2D899eCC914d704FeaAE33ac1bF36277DaD1</code></td><td><code>0xa432504b6F04Cafe775b09D8AA92e8dbe41Ec7a8</code></td></tr><tr><td>Permit2</td><td><code>0x000000000022D473030F116dDEE9F6B43aC78BA3</code></td><td><code>0x000000000022D473030F116dDEE9F6B43aC78BA3</code></td></tr></tbody></table><h3 id="7-3-Arbitrum-预编译地址"><a href="#7-3-Arbitrum-预编译地址" class="headerlink" title="7.3 Arbitrum 预编译地址"></a>7.3 Arbitrum 预编译地址</h3><table><thead><tr><th>合约</th><th>固定地址</th></tr></thead><tbody><tr><td>ArbSys</td><td><code>0x0000000000000000000000000000000000000064</code></td></tr><tr><td>ArbInfo</td><td><code>0x0000000000000000000000000000000000000065</code></td></tr><tr><td>ArbAddressTable</td><td><code>0x0000000000000000000000000000000000000066</code></td></tr><tr><td>ArbFunctionTable</td><td><code>0x0000000000000000000000000000000000000068</code></td></tr><tr><td>ArbOwnerPublic</td><td><code>0x000000000000000000000000000000000000006b</code></td></tr><tr><td>ArbGasInfo</td><td><code>0x000000000000000000000000000000000000006C</code></td></tr><tr><td>ArbAggregator</td><td><code>0x000000000000000000000000000000000000006D</code></td></tr><tr><td>ArbRetryableTx</td><td><code>0x000000000000000000000000000000000000006E</code></td></tr><tr><td>ArbStatistics</td><td><code>0x000000000000000000000000000000000000006F</code></td></tr><tr><td>ArbOwner</td><td><code>0x0000000000000000000000000000000000000070</code></td></tr><tr><td>ArbWasm</td><td><code>0x0000000000000000000000000000000000000071</code></td></tr><tr><td>ArbWasmCache</td><td><code>0x0000000000000000000000000000000000000072</code></td></tr><tr><td>NodeInterface</td><td><code>0x00000000000000000000000000000000000000C8</code></td></tr></tbody></table><p>完整地址以 <a href="https://docs.robinhood.com/chain/protocol-contracts/">Protocol Contracts</a> 为准。</p><h2 id="8-账户抽象"><a href="#8-账户抽象" class="headerlink" title="8. 账户抽象"></a>8. 账户抽象</h2><p>Robinhood Chain 原生支持 ERC-4337，并支持 EIP-7702，使普通 EOA 可委托给智能合约代码，在不迁移地址的情况下获得：</p><ul><li><p>Gas 代付；</p></li><li><p>批量调用；</p></li><li><p>会话密钥；</p></li><li><p>消费额度与策略；</p></li><li><p>自动化交易；</p></li><li><p>跨链执行。</p></li></ul><p>官方主要推荐 Alchemy，另列出 ZeroDev 与 Privy。</p><p>主网 ERC-4337 地址：</p><table><thead><tr><th>合约</th><th>地址</th></tr></thead><tbody><tr><td>EntryPoint v0.6</td><td><code>0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789</code></td></tr><tr><td>SenderCreator v0.6</td><td><code>0x7fc98430eAEdbb6070B35B39D798725049088348</code></td></tr><tr><td>EntryPoint v0.7</td><td><code>0x0000000071727De22E5E9d8BAf0edAc6f37da032</code></td></tr><tr><td>SenderCreator v0.7</td><td><code>0xEFC2c1444eBCC4Db75e7613d20C6a62fF67A167C</code></td></tr><tr><td>EntryPoint v0.8</td><td><code>0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108</code></td></tr><tr><td>SenderCreator v0.8</td><td><code>0x449ED7C3e6Fee6a97311d4b55475DF59C44AdD33</code></td></tr><tr><td>Safe Module Setup v0.3</td><td><code>0x2dd68b007B46fBe91B9A7c3EDa5A7a1063cB5b47</code></td></tr><tr><td>Safe 4337 Module v0.3</td><td><code>0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226</code></td></tr></tbody></table><p>Bundler&#x2F;RPC：</p><p><a href="https://robinhood-mainnet.g.alchemy.com/v2/%7BAPI_KEY%7D">https://robinhood-mainnet.g.alchemy.com/v2/{API_KEY}</a></p><p>生产注意：不要把 UserOperation 当作普通 EOA 交易处理。索引器和资金系统需要同时记录 userOp hash、bundler 交易 hash、sender、paymaster、nonce 和最终 receipt。</p><h2 id="9-合约部署"><a href="#9-合约部署" class="headerlink" title="9. 合约部署"></a>9. 合约部署</h2><p>普通 EVM 部署流程可直接复用。官方建议先部署到测试网。</p><p>Foundry：</p><p>export PRIVATE_KEY&#x3D;0xYOUR_PRIVATE_KEY<br>export RH_RPC_URL&#x3D;<a href="https://rpc.mainnet.chain.robinhood.com/">https://rpc.mainnet.chain.robinhood.com</a>  </p><p>forge create src&#x2F;HelloRobinhood.sol:HelloRobinhood \<br>  –rpc-url “$RH_RPC_URL” \<br>  –private-key “$PRIVATE_KEY” \<br>  –broadcast</p><p>Blockscout 验证：</p><p>forge verify-contract 0xCONTRACT_ADDRESS \<br>  src&#x2F;HelloRobinhood.sol:HelloRobinhood \<br>  –chain-id 4663 \<br>  –rpc-url “$RH_RPC_URL” \<br>  –verifier blockscout \<br>  –verifier-url <a href="https://robinhoodchain.blockscout.com/api/">https://robinhoodchain.blockscout.com/api/</a></p><p>测试网验证 API：</p><p><a href="https://explorer.testnet.chain.robinhood.com/api/">https://explorer.testnet.chain.robinhood.com/api/</a></p><p>安全提醒：私钥只通过安全的 Secret Manager 或本地环境变量注入；不要提交到 Git；测试时使用一次性部署地址。</p><h2 id="10-自建全节点"><a href="#10-自建全节点" class="headerlink" title="10. 自建全节点"></a>10. 自建全节点</h2><p>Robinhood Chain 使用 Arbitrum Nitro。若只是读取 RPC，不建议为了“完整”而立即自建；数据量、L1 请求量和运维成本都较高。</p><p>官方硬件建议：</p><table><thead><tr><th>资源</th><th>要求</th></tr></thead><tbody><tr><td>CPU</td><td>现代 8 核以上，强调单核性能</td></tr><tr><td>RAM</td><td>64 GB，推荐 128 GB</td></tr><tr><td>存储</td><td>本地 NVMe；约为当前链大小 2 倍再加 20% 缓冲；可能需要数 TB</td></tr><tr><td>L1</td><td>Ethereum execution RPC + beacon&#x2F;consensus endpoint，后者用于读取 blob</td></tr><tr><td>软件</td><td>Docker</td></tr></tbody></table><p>主网 Nitro 关键参数：</p><p>Docker image: offchainlabs&#x2F;nitro-node:v3.11.2-3599aca<br>Chain ID: 4663<br>Chain name: Robinhood Chain<br>HTTP: 8547<br>WS: 8548<br>Sequencer feed: wss:&#x2F;&#x2F;feed.mainnet.chain.robinhood.com<br>ArbOS: 61（启动前必须再次核对当前版本）</p><p>测试网：</p><p>Chain ID: 46630<br>Chain name: Robinhood Chain Sepolia<br>Sequencer feed: wss:&#x2F;&#x2F;feed.testnet.chain.robinhood.com</p><p>节点依赖官方 chain info；主网还依赖自定义 genesis，测试网不需要 custom genesis。Nitro &#x2F; ArbOS 升级时，未升级节点会在升级块安全停止，升级后可继续同步，不需重做数据。</p><p>验证节点：</p><p>curl -s <a href="http://localhost:8547/">http://localhost:8547</a> \<br>  -H ‘content-type: application&#x2F;json’ \<br>  –data ‘{“jsonrpc”:”2.0”,”id”:1,”method”:”eth_syncing”,”params”:[]}’</p><p>Validator 使用 BoLD，但当前是 permissioned validator set，需要获得 allowlist，并质押 1 WETH bond；普通开发者不能直接无许可加入。</p><h2 id="11-生态系统"><a href="#11-生态系统" class="headerlink" title="11. 生态系统"></a>11. 生态系统</h2><table><thead><tr><th>分类</th><th>项目</th><th>用途</th></tr></thead><tbody><tr><td>RPC &#x2F; AA</td><td>Alchemy</td><td>RPC、Data API、Gasless Transaction Infrastructure</td></tr><tr><td>跨链</td><td>LayerZero</td><td>Omnichain 消息与资产桥</td></tr><tr><td>预言机</td><td>Chainlink</td><td>股票与加密资产价格、链下数据</td></tr><tr><td>机构托管</td><td>Fireblocks</td><td>机构数字资产操作与托管</td></tr><tr><td>机构托管</td><td>BitGo</td><td>机构托管</td></tr><tr><td>链上数据</td><td>Allium</td><td>链上分析与数据服务</td></tr><tr><td>Token 数据</td><td>CoinGecko</td><td>价格、交易量追踪</td></tr><tr><td>公共 DEX</td><td>Uniswap</td><td>AMM 交易</td></tr><tr><td>PropAMM &#x2F; 聚合</td><td>Rialto</td><td>PropAMM 驱动的现货交易</td></tr><tr><td>借贷</td><td>Morpho</td><td>抵押借贷</td></tr><tr><td>永续合约</td><td>Lighter</td><td>Perp DEX</td></tr><tr><td>永续合约</td><td>Arcus</td><td>Perp DEX</td></tr><tr><td>稳定币</td><td>Paxos &#x2F; USDG</td><td>稳定币基础设施</td></tr><tr><td>钱包数据</td><td>Zerion</td><td>Wallet Data API</td></tr><tr><td>合规风控</td><td>TRM Labs</td><td>链上分析与风险管理</td></tr></tbody></table><p>官方列出这些项目不等于对其安全性或投资价值背书，接入前仍需独立审计合约、权限、升级代理、TVL 与流动性。</p><h2 id="12-面向接入项目的工程清单"><a href="#12-面向接入项目的工程清单" class="headerlink" title="12. 面向接入项目的工程清单"></a>12. 面向接入项目的工程清单</h2><h3 id="12-1-链配置"><a href="#12-1-链配置" class="headerlink" title="12.1 链配置"></a>12.1 链配置</h3><ul><li><input disabled="" type="checkbox"> 主网与测试网 Chain ID 分离，启动时调用 <code>eth_chainId</code> 自检。</li><li><input disabled="" type="checkbox"> 公共 RPC 只用于开发；生产至少主备两个 provider。</li><li><input disabled="" type="checkbox"> WebSocket 断连自动恢复，并按 block number 补扫日志。</li><li><input disabled="" type="checkbox"> 需要低延迟时评估 Sequencer Feed，不依赖公共 RPC 轮询。</li><li><input disabled="" type="checkbox"> 需要历史状态或大范围回溯时采购 Archive RPC。</li></ul><h3 id="12-2-区块与充值确认"><a href="#12-2-区块与充值确认" class="headerlink" title="12.2 区块与充值确认"></a>12.2 区块与充值确认</h3><ul><li><input disabled="" type="checkbox"> 不在合约里用 <code>block.number</code> 代表 L2 高度。</li><li><input disabled="" type="checkbox"> 记录 L2 block number、block hash、tx index、receipt status。</li><li><input disabled="" type="checkbox"> 将软确认、L1 已发布、L1 最终确认建模为不同状态。</li><li><input disabled="" type="checkbox"> 大额充值采用更高确认等级。</li><li><input disabled="" type="checkbox"> 处理 Sequencer 暂停、RPC 分叉视图、短暂回滚和重复 webhook。</li></ul><h3 id="12-3-股票代币"><a href="#12-3-股票代币" class="headerlink" title="12.3 股票代币"></a>12.3 股票代币</h3><ul><li><input disabled="" type="checkbox"> Token 地址必须来自官方列表，不能仅按 symbol 识别。</li><li><input disabled="" type="checkbox"> 所有 Token 按 18 位小数解析，但仍建议链上读取 <code>decimals()</code> 校验。</li><li><input disabled="" type="checkbox"> 同时保存 raw balance、UI-adjusted balance、multiplier。</li><li><input disabled="" type="checkbox"> 监听 <code>UIMultiplierUpdated</code> 与 <code>TransferWithScaledUI</code>。</li><li><input disabled="" type="checkbox"> Feed 价格不要重复乘 multiplier。</li><li><input disabled="" type="checkbox"> 对 24&#x2F;5 行情、heartbeat、市场休市和企业行动暂停建模。</li><li><input disabled="" type="checkbox"> 校验 Sequencer Uptime Feed、staleness、<code>oraclePaused()</code>。</li><li><input disabled="" type="checkbox"> 产品层完成地区与证券合规判断。</li></ul><h3 id="12-4-跨链与桥"><a href="#12-4-跨链与桥" class="headerlink" title="12.4 跨链与桥"></a>12.4 跨链与桥</h3><ul><li><input disabled="" type="checkbox"> L1 Token 与 L2 Token 地址建立显式映射。</li><li><input disabled="" type="checkbox"> Retryable ticket 状态进入数据库，可监控失败与 7 天 redeem 截止时间。</li><li><input disabled="" type="checkbox"> L2→L1 提现采用三阶段状态：initiated &#x2F; challenge-ready &#x2F; claimed。</li><li><input disabled="" type="checkbox"> 处理地址 alias，避免跨链管理函数权限绕过或错误拒绝。</li><li><input disabled="" type="checkbox"> 第三方快桥独立评估 LP、intent solver、预言机和合约风险。</li></ul><h3 id="12-5-账户抽象"><a href="#12-5-账户抽象" class="headerlink" title="12.5 账户抽象"></a>12.5 账户抽象</h3><ul><li><input disabled="" type="checkbox"> 识别普通交易与 UserOperation。</li><li><input disabled="" type="checkbox"> 建立 userOp hash → bundler tx hash → receipt 的映射。</li><li><input disabled="" type="checkbox"> 对 paymaster 余额、策略、额度和失败原因做监控。</li><li><input disabled="" type="checkbox"> EIP-7702 账户不能仅按“有无合约代码”粗暴分类 EOA&#x2F;合约。</li></ul><h2 id="13-面向套利雷达的首批数据源与监控项"><a href="#13-面向套利雷达的首批数据源与监控项" class="headerlink" title="13. 面向套利雷达的首批数据源与监控项"></a>13. 面向套利雷达的首批数据源与监控项</h2><p>这部分是基于官方能力做出的工程推演，不代表存在无风险利润。</p><h3 id="13-1-Stock-Token-跨市场价差"><a href="#13-1-Stock-Token-跨市场价差" class="headerlink" title="13.1 Stock Token 跨市场价差"></a>13.1 Stock Token 跨市场价差</h3><p>监控同一标的的四种价格：</p><ol><li><p>Robinhood Chain DEX &#x2F; RFQ 可成交价。</p></li><li><p>Chainlink multiplier-adjusted Feed 价格。</p></li><li><p>美股现货行情。</p></li><li><p>其他链或交易所的同类 tokenized stock 报价。</p></li></ol><p>计算前统一口径：</p><p>underlyingSharePrice &#x3D; feedPrice × 1e18 &#x2F; uiMultiplier</p><p>必须扣除：RFQ spread、DEX 滑点、L1&#x2F;L2 Gas、桥费、提现等待、资金成本、交易时段限制、合规可执行性。</p><h3 id="13-2-企业行动异常监控"><a href="#13-2-企业行动异常监控" class="headerlink" title="13.2 企业行动异常监控"></a>13.2 企业行动异常监控</h3><p>监听：</p><ul><li><p><code>newUIMultiplier()</code> 与 <code>effectiveAt()</code>；</p></li><li><p><code>UIMultiplierUpdated</code>；</p></li><li><p><code>oraclePaused()</code>；</p></li><li><p>Chainlink <code>updatedAt</code>；</p></li><li><p>DEX&#x2F;RFQ 是否同步暂停；</p></li><li><p>Feed、链上成交价、底层证券价格之间的偏离。</p></li></ul><p>这类时间窗更适合作为风险监控和异常报价过滤，不应默认当作可成交套利。</p><h3 id="13-3-桥与流动性监控"><a href="#13-3-桥与流动性监控" class="headerlink" title="13.3 桥与流动性监控"></a>13.3 桥与流动性监控</h3><ul><li><p>官方桥大额存取款与 Token supply 变化。</p></li><li><p>USDG、WETH、Stock Token 在 Uniswap &#x2F; Rialto 等场所的深度与价差。</p></li><li><p>Relay、Across、LayerZero、Stargate 路由报价差异。</p></li><li><p>L1&#x2F;L2 Token 地址映射错误或假 Token 风险。</p></li><li><p>Retryable ticket 失败、第三方桥流动性枯竭和提现拥堵。</p></li></ul><h3 id="13-4-低延迟研究"><a href="#13-4-低延迟研究" class="headerlink" title="13.4 低延迟研究"></a>13.4 低延迟研究</h3><p>FCFS 排序意味着延迟优化优先级高于 Gas 竞价：</p><ul><li><p>对比公共 RPC、商业 RPC、Sequencer endpoint 的提交延迟。</p></li><li><p>订阅 Sequencer Feed 与普通 WebSocket 的区块到达差。</p></li><li><p>测量从报价变化到实际可成交交易的端到端延迟。</p></li><li><p>分析链上是否存在 private orderflow、RFQ maker 和 PropAMM 特殊流动性。</p></li></ul><h2 id="14-推荐的第一阶段-MVP"><a href="#14-推荐的第一阶段-MVP" class="headerlink" title="14. 推荐的第一阶段 MVP"></a>14. 推荐的第一阶段 MVP</h2><p>建议先做只读接入，不急于自动下单：</p><ol><li><p>接入主网 RPC 与备用 RPC，持续抓取 block、tx、receipt、logs。</p></li><li><p>导入官方 Token 白名单，读取 symbol、decimals、totalSupply、uiMultiplier、oraclePaused。</p></li><li><p>接入 Chainlink Feed，记录 answer、decimals、updatedAt、heartbeat 与 Sequencer 状态。</p></li><li><p>接入 Uniswap &#x2F; Rialto 可用报价，计算 Stock Token 对 USDG 的真实可成交价。</p></li><li><p>接入美股现货行情，统一换算到底层每股价格。</p></li><li><p>输出价差、深度、可成交数量、估算费用和风险原因；初期只告警，不交易。</p></li><li><p>增加企业行动与预言机暂停告警。</p></li><li><p>运行两周，积累报价偏差、延迟和成交深度分布，再判断是否值得进入模拟交易。</p></li></ol><p>建议核心表：</p><p>chains<br>tokens<br>stock_token_multipliers<br>oracle_prices<br>sequencer_status<br>blocks<br>transactions<br>token_transfers<br>dex_quotes<br>cross_market_spreads<br>bridge_messages<br>alerts</p><h2 id="15-官方资料索引"><a href="#15-官方资料索引" class="headerlink" title="15. 官方资料索引"></a>15. 官方资料索引</h2><ul><li><p><a href="https://docs.robinhood.com/chain/">About Robinhood Chain</a></p></li><li><p><a href="https://docs.robinhood.com/chain/connecting/">Connecting to Robinhood Chain</a></p></li><li><p><a href="https://docs.robinhood.com/chain/add-network-to-wallet/">Add network to wallet</a></p></li><li><p><a href="https://docs.robinhood.com/chain/bridging/">Bridging</a></p></li><li><p><a href="https://docs.robinhood.com/chain/stock-tokens/">Stock Tokens</a></p></li><li><p><a href="https://docs.robinhood.com/chain/building-with-stock-tokens/">Building with Stock Tokens</a></p></li><li><p><a href="https://docs.robinhood.com/chain/differences-from-ethereum/">Differences from Ethereum</a></p></li><li><p><a href="https://docs.robinhood.com/chain/gas-and-fees/">Gas &amp; Fees</a></p></li><li><p><a href="https://docs.robinhood.com/chain/transaction-finality/">Transaction Finality</a></p></li><li><p><a href="https://docs.robinhood.com/chain/contracts/">Token Contracts</a></p></li><li><p><a href="https://docs.robinhood.com/chain/protocol-contracts/">Protocol Contracts</a></p></li><li><p><a href="https://docs.robinhood.com/chain/deploy-smart-contracts/">Deploy a Contract</a></p></li><li><p><a href="https://docs.robinhood.com/chain/account-abstraction/">Account Abstraction</a></p></li><li><p><a href="https://docs.robinhood.com/chain/cross-chain-messaging/">Cross-Chain Messaging</a></p></li><li><p><a href="https://docs.robinhood.com/chain/oracles-and-price-feeds/">Oracles &amp; Price Feeds</a></p></li><li><p><a href="https://docs.robinhood.com/chain/run-a-full-node/">Run a full node</a></p></li><li><p><a href="https://docs.robinhood.com/chain/notices-and-upgrades/">Notices &amp; Upgrades</a></p></li><li><p><a href="https://status.robinhoodchain.offchain.io/">Network status</a></p></li></ul><h2 id="16-变更与上线注意"><a href="#16-变更与上线注意" class="headerlink" title="16. 变更与上线注意"></a>16. 变更与上线注意</h2><p>Robinhood Chain 会随 Arbitrum Nitro &#x2F; ArbOS 升级。节点运营者应持续关注升级公告；合约与应用开发者也应检查是否存在 EVM 行为、预编译或费用模型变化。</p><p>上线前重新验证：</p><ul><li><p>Chain ID、RPC、浏览器与状态页；</p></li><li><p>Nitro image、ArbOS、chain info 与 genesis；</p></li><li><p>Stock Token、协议桥、ERC-4337、价格 Feed 地址；</p></li><li><p>Chainlink heartbeat 与 Sequencer Uptime Feed；</p></li><li><p>官方条款、地区限制和第三方协议风险；</p></li><li><p>公共 RPC 的速率限制与服务可用性。</p></li></ul>]]>
    </content>
    <id>https://herongwei.me/2026/07/14/Robinhood-Chain-%E4%B8%AD%E6%96%87%E8%B0%83%E7%A0%94%E6%89%8B%E5%86%8C/</id>
    <link href="https://herongwei.me/2026/07/14/Robinhood-Chain-%E4%B8%AD%E6%96%87%E8%B0%83%E7%A0%94%E6%89%8B%E5%86%8C/"/>
    <published>2026-07-14T13:09:47.000Z</published>
    <summary>
      <![CDATA[<h1 id="Robinhood-Chain-中文接入与生态调研手册"><a href="#Robinhood-Chain-中文接入与生态调研手册" class="headerlink" title="Robinhood Chain 中文接入与生态调研手册"></a>Robin]]>
    </summary>
    <title>Robinhood Chain 中文调研手册</title>
    <updated>2026-07-14T13:11:02.993Z</updated>
  </entry>
  <entry>
    <author>
      <name>贺同学</name>
    </author>
    <category term="总结" scheme="https://herongwei.me/tags/%E6%80%BB%E7%BB%93/"/>
    <content>
      <![CDATA[<p>4 月关键词:</p><h2 id="适应，调整，断舍离，平淡，幸福。"><a href="#适应，调整，断舍离，平淡，幸福。" class="headerlink" title="适应，调整，断舍离，平淡，幸福。"></a>适应，调整，断舍离，平淡，幸福。</h2><p>文章地址：全文点击<a href="https://mp.weixin.qq.com/s/-T2P3a2goWveKKK8_HjxJw">公众号</a>访问</p>]]>
    </content>
    <id>https://herongwei.me/2025/05/04/%E8%B4%BA%E5%90%8C%E5%AD%A64%E6%9C%88%E6%80%BB%E7%BB%93/</id>
    <link href="https://herongwei.me/2025/05/04/%E8%B4%BA%E5%90%8C%E5%AD%A64%E6%9C%88%E6%80%BB%E7%BB%93/"/>
    <published>2025-05-04T02:39:41.000Z</published>
    <summary>
      <![CDATA[<p>4 月关键词:</p>
<h2 id="适应，调整，断舍离，平淡，幸福。"><a href="#适应，调整，断舍离，平淡，幸福。" class="headerlink" title="适应，调整，断舍离，平淡，幸福。"></a>适应，调整，断舍离，平淡，幸福。</h2><p]]>
    </summary>
    <title>贺同学4月总结</title>
    <updated>2026-07-12T06:48:03.889Z</updated>
  </entry>
  <entry>
    <author>
      <name>贺同学</name>
    </author>
    <category term="币圈" scheme="https://herongwei.me/tags/%E5%B8%81%E5%9C%88/"/>
    <content>
      <![CDATA[<h1 id="币圈-衍生品系列"><a href="#币圈-衍生品系列" class="headerlink" title="币圈-衍生品系列"></a>币圈-衍生品系列</h1><h2 id="0、前言-衍生品的定义与特点"><a href="#0、前言-衍生品的定义与特点" class="headerlink" title="0、前言-衍生品的定义与特点"></a>0、前言-衍生品的定义与特点</h2><p>衍生品是一种金融合约，其价值基于基础资产（如加密货币、股票、商品等）的价格波动。它具有<strong>杠杆性</strong>、<strong>高风险性</strong>和<strong>高收益性</strong>的特点。杠杆性使得投资者能用少量资金控制较大规模的资产；高风险性源于市场波动的不确定性，微小的价格变动在杠杆作用下可能引发巨大损失；高收益性则为投资者提供了以小博大的机会。此外，衍生品还具备<strong>跨期性</strong>，交易双方通过对未来价格走势的预期达成合约，以及<strong>联动性</strong>，其价格紧密跟随基础资产的变化。</p><h2 id="1、什么是合约"><a href="#1、什么是合约" class="headerlink" title="1、什么是合约"></a>1、什么是合约</h2><p>传统的期货合约和虚拟货币中的合约中概念上是相同的，他们都是一种衍生品，允许两方之后约定中未来某个时间以特定价格买入或卖出某种资产的合约。</p><h2 id="2、什么是永续合约"><a href="#2、什么是永续合约" class="headerlink" title="2、什么是永续合约"></a>2、什么是永续合约</h2><p>永续合约是一种没有到期日的期货合约，它通过资金费率机制使合约价格与标的资产价格保持联动。其特点包括：</p><ul><li><p><strong>无到期日</strong>：投资者无需担心合约到期交割问题，可长期持有头寸。</p></li><li><p><strong>资金费率机制</strong>：调节市场多空双方的持仓成本，使合约价格贴近标的资产现货价格。</p></li><li><p><strong>杠杆交易</strong>：允许投资者使用杠杆放大收益，但同时也增加了风险。</p></li></ul><p>永续合约与期货合约的区别​</p><ul><li><p><strong>到期日</strong>：期货合约有固定到期日，永续合约无到期日。</p></li><li><p><strong>交割方式</strong>：期货合约到期进行实物或现金交割，永续合约不进行交割。</p></li><li><p><strong>价格机制</strong>：期货合约价格受到期日、市场预期等因素影响，与现货价格可能存在较大偏差；永续合约通过资金费率机制，使合约价格与现货价格紧密相连。</p></li></ul><h3 id="2-1-资金费率含义和作用"><a href="#2-1-资金费率含义和作用" class="headerlink" title="2.1 资金费率含义和作用"></a>2.1 资金费率含义和作用</h3><p>资金费率是永续合约特有的机制，用于调节合约价格与现货价格的偏差。计算公式为：资金费率&#x3D;溢价指数加权平均值+利率溢价。</p><p>其中，溢价指数反映合约价格与现货价格的偏离程度，利率溢价考虑资金的时间价值。不同交易所的具体计算方式可能略有差异。</p><p>具体来说：</p><ul><li><p><strong>市场供需</strong>：当市场多头需求旺盛，合约价格高于现货价格时，资金费率为正，多头需向空头支付资金费用；反之，当空头需求旺盛，合约价格低于现货价格时，资金费率为负，空头需向多头支付资金费用。</p></li><li><p><strong>利率水平</strong>：市场利率水平的变化会影响资金费率中的利率溢价部分。一般来说，利率上升，资金费率中的利率溢价部分增加。</p></li><li><p><strong>市场情绪</strong>：投资者对市场的乐观或悲观情绪会影响多空双方的持仓意愿，进而影响资金费率。</p></li></ul><p>作用：</p><blockquote><p> 资金费率反映了市场多空双方的力量对比和对未来价格走势的预期。正资金费率表明多头力量较强，市场看涨情绪浓厚；负资金费率则表示空头力量占优，市场看跌情绪明显。资金费率的作用在于通过调节持仓成本，促使合约价格向现货价格回归，减少市场的不合理溢价或折价，维护市场的稳定和公平。</p></blockquote><h3 id="2-2-资金费率套利"><a href="#2-2-资金费率套利" class="headerlink" title="2.2 资金费率套利"></a>2.2 资金费率套利</h3><ol><li>资金费率套利的原理与策略​</li></ol><p>资金费率套利的原理是利用资金费率的正负差异，在多空双方之间进行套利操作。当资金费率为正时，多头持仓成本增加，空头持仓成本降低。此时，投资者可以卖出永续合约（做空），同时在现货市场买入标的资产，通过收取资金费用和现货价格上涨获取收益。当资金费率为负时，操作相反，买入永续合约（做多），同时在现货市场卖空标的资产。</p><ol start="2"><li>套利机会的识别与风险评估​</li></ol><p>识别套利机会需要实时监测资金费率的变化、合约价格与现货价格的差异以及市场流动性等因素。当资金费率偏离正常范围，且市场流动性充足时，可能存在套利机会。风险评估方面，主要面临<strong>价格波动风险</strong>，在套利过程中，标的资产价格的不利波动可能导致套利失败；<strong>市场流动性风险</strong>，若市场流动性不足，可能无法及时开仓或平仓；<strong>交易所风险</strong>，如交易所故障、资金结算问题等也会影响套利操作。</p><h3 id="2-3-什么是合约中的杠杆"><a href="#2-3-什么是合约中的杠杆" class="headerlink" title="2.3 什么是合约中的杠杆"></a>2.3 什么是合约中的杠杆</h3><p>杠杆原理是通过借入资金，放大投资者的交易头寸。例如，使用 10 倍杠杆，投资者只需支付 10% 的保证金，就能控制 10 倍价值的合约。杠杆倍数的选择需综合考虑投资者的风险承受能力、市场波动情况和交易策略。高杠杆倍数在放大收益的同时，也会大幅增加损失风险，适合风险偏好较高、对市场走势判断准确的投资者；低杠杆倍数风险相对较低，适合稳健型投资者。</p><p>杠杆交易的收益和风险呈线性放大关系。以 10 倍杠杆为例，若投资者判断正确，标的资产价格上涨 10%，不考虑手续费等因素，投资者的收益为 100%；但如果判断错误，价格下跌 10%，投资者将损失全部保证金。此外，杠杆交易还可能面临<strong>追加保证金风险</strong>，当账户权益低于维持保证金要求时，投资者需及时追加保证金，否则将被强制平仓，导致更大损失。</p><h3 id="2-4-什么是保证金"><a href="#2-4-什么是保证金" class="headerlink" title="2.4 什么是保证金"></a>2.4 什么是保证金</h3><p>保证金是投资者在进行合约交易时，存入交易账户的资金，用于保证交易的履约。</p><ul><li><p><strong>初始保证金</strong>：开仓时所需缴纳的保证金，通常为合约价值的一定比例（如 5% - 20%）。</p></li><li><p><strong>维持保证金</strong>：持仓过程中，为保证合约不被强制平仓，账户权益需维持的最低保证金水平，一般低于初始保证金。</p></li></ul><h4 id="2-4-1-平仓"><a href="#2-4-1-平仓" class="headerlink" title="2.4.1 平仓"></a>2.4.1 平仓</h4><ul><li><p><strong>平仓的概念与操作方式</strong>：平仓是指投资者了结持仓的交易行为，通过反向操作（如买入开仓后卖出平仓，卖出开仓后买入平仓）结束合约头寸。操作方式可在交易平台上直接点击平仓按钮，选择平仓数量和价格进行操作。</p></li><li><p><strong>平仓时机的选择与策略</strong>：平仓时机的选择取决于投资者的交易策略和市场情况。对于短线交易者，可根据技术指标信号（如均线交叉、MACD 背离等）选择平仓；对于套期保值者，当达到预期的风险对冲效果或市场情况发生变化时平仓；对于套利者，在套利利润达到预期或套利机会消失时平仓。</p></li></ul><h4 id="2-4-2-爆仓"><a href="#2-4-2-爆仓" class="headerlink" title="2.4.2 爆仓"></a>2.4.2 爆仓</h4><ul><li><p><strong>爆仓的定义与触发条件</strong>：爆仓是指当投资者账户权益低于维持保证金要求，且未及时追加保证金或减仓时，交易所为防止损失扩大，对其持仓进行强制平仓的情况。触发条件为账户权益跌破维持保证金水平。</p></li><li><p><strong>爆仓的风险与后果</strong>：爆仓会导致投资者损失全部保证金，甚至可能因市场极端行情，导致账户出现负资产，需要额外偿还债务。此外，爆仓还会对投资者的心理造成打击，影响后续交易决策。</p></li><li><p><strong>避免爆仓的策略与方法</strong>：合理控制仓位，避免过度使用杠杆；设置止损位，当价格达到止损价格时自动平仓，限制损失；密切关注市场动态，及时调整交易策略；保持充足的资金储备，以便在需要时追加保证金。</p></li></ul><h2 id="3、主要的加密货币衍生品类型简介​"><a href="#3、主要的加密货币衍生品类型简介​" class="headerlink" title="3、主要的加密货币衍生品类型简介​"></a>3、主要的加密货币衍生品类型简介​</h2><ul><li><p><strong>期货合约</strong>：买卖双方约定在未来某一特定时间，以特定价格买入或卖出一定数量加密货币的合约。</p></li><li><p><strong>期权合约</strong>：赋予买方在规定期限内按双方约定的执行价格，购买或出售一定数量加密货币的权利。</p></li><li><p><strong>永续合约</strong>：没有到期日的期货合约，通过资金费率机制使合约价格贴近标的资产价格。</p></li><li><p><strong>期权期货组合衍生品</strong>：结合期货和期权的特性，为投资者提供更灵活的风险对冲和收益获取方式。</p></li></ul><h2 id="4、合约交易中的选项"><a href="#4、合约交易中的选项" class="headerlink" title="4、合约交易中的选项"></a>4、合约交易中的选项</h2><p>3.1 什么是 u 本位，什么是 b 本位</p><p>3.2 什么是被动委托</p><p>3.3 什么是止盈止损</p><p>3.4 什么是冰山委托</p><p>3.5 什么是只减仓</p><h1 id="加餐"><a href="#加餐" class="headerlink" title="加餐"></a>加餐</h1><h2 id="为什么说空军是燃料"><a href="#为什么说空军是燃料" class="headerlink" title="为什么说空军是燃料"></a>为什么说空军是燃料</h2><p>基于上面的资金费机制，当市场上出现一种小币种高度拉盘现象，比如 xxx 币，这种底部只有几百万市值的盘子，庄可以很低成本控紧流通的现货筹码。</p><p>具体来说：</p><ul><li>拉盘前只需要建个巨大的合约多单，然后开拉现货，只要散户对手盘的空单需求仓位大幅超过多单仓位，根据资金费机制，市场上就会持续扣空军的资金费给到庄。</li><li>庄拿到这部分的资金费率去买现货，现货就会带着合约价格往上走，每爆一个空军仓位就会转化为合约的新的实盘，之前开的合约多头仓位就会越赚越多，收到的资金费也越来越多，也就意味着能来拉盘现货的资金也就越来越多。</li><li>出现这种情况的需要有个必要前提：一个控筹紧的现货盘和无限的空军，理论上有了这两个条件，可以拉出一个过亿，甚至万亿市场</li></ul><p>上面这段话里有个前提：那就是当空单需求大于多单的时候，就会出现期货价格低于现货价格，资金费率变负的情况，所以只要庄的多单仓位小于市场提供的空单需求，资金费率就会持续往庄那走。</p><p>更进一步</p><blockquote><p> 做市商是流动性提供者，会盯着散户的出牌走反向操作打掉散户止损再回去，反复收割。</p><p>合约市场基本是对手盘。</p></blockquote>]]>
    </content>
    <id>https://herongwei.me/2025/04/28/%E5%B8%81%E5%9C%88%E5%AD%A6%E4%B9%A0-%E8%A1%8D%E7%94%9F%E5%93%81%E7%B3%BB%E5%88%9701/</id>
    <link href="https://herongwei.me/2025/04/28/%E5%B8%81%E5%9C%88%E5%AD%A6%E4%B9%A0-%E8%A1%8D%E7%94%9F%E5%93%81%E7%B3%BB%E5%88%9701/"/>
    <published>2025-04-28T08:46:06.000Z</published>
    <summary>
      <![CDATA[<h1 id="币圈-衍生品系列"><a href="#币圈-衍生品系列" class="headerlink" title="币圈-衍生品系列"></a>币圈-衍生品系列</h1><h2 id="0、前言-衍生品的定义与特点"><a href="#0、前言-衍生品的定义与特点"]]>
    </summary>
    <title>币圈学习-衍生品系列01</title>
    <updated>2026-07-12T06:48:03.889Z</updated>
  </entry>
  <entry>
    <author>
      <name>贺同学</name>
    </author>
    <category term="博客" scheme="https://herongwei.me/categories/%E5%8D%9A%E5%AE%A2/"/>
    <category term="golang" scheme="https://herongwei.me/tags/golang/"/>
    <content>
      <![CDATA[<h1 id="Golang-并发编程实践总结"><a href="#Golang-并发编程实践总结" class="headerlink" title="Golang 并发编程实践总结"></a>Golang 并发编程实践总结</h1><p>目录</p><ul><li><a href="#golang-%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E5%AE%9E%E8%B7%B5%E6%80%BB%E7%BB%93">Golang 并发编程实践总结</a><ul><li><a href="#%E6%B7%B1%E2%BC%8A%E7%90%86%E8%A7%A3GMP%E6%A8%A1%E5%9E%8B">深⼊理解GMP模型</a></li><li><a href="#Channel%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8%EF%BC%9F%E5%BA%95%E5%B1%82%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F">Channel是什么</a></li><li><a href="#Select%E7%9A%84%E7%94%A8%E6%B3%95">Select的用法</a></li><li><a href="#%E4%BD%BF%E7%94%A8sync%E5%8C%85">使用sync包</a></li><li><a href="#WaitGroup">WaitGroup</a></li><li><a href="#Pool">Pool</a></li><li><a href="#%E5%B8%B8%E8%A7%81%E5%86%85%E5%AD%98%E6%B3%84%E9%9C%B2%E5%8F%8A%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9">常见内存泄露及注意事项</a></li></ul></li></ul><h1 id="深⼊理解GMP模型"><a href="#深⼊理解GMP模型" class="headerlink" title="深⼊理解GMP模型"></a>深⼊理解GMP模型</h1><p><strong>【思考🤔】⾸先思考⼀个问题为什么需要协程？</strong></p><p>其实答案也很明显：在多进程和多线程时代，CPU 内核负责调度，为系统提供并发处理能⼒，但也存在⼀些缺点：</p><ul><li><p>资源消耗⾼：进程和线程的创建、切换和销毁都会消耗⼤量 CPU 资源。</p></li><li><p>内存占⽤⼤：每个线程约需 4MB 内存，⼤量线程会导致内存消耗过⾼。</p></li><li><p>应⽤层⽆法直接控制内核调度，只能通过减少线程创建和切换来优化性能。</p></li></ul><p>这促⽣了协程的概念：⽤户级别的轻量线程。在 Go 中，协程被称为 <code>goroutine</code>，它主要解决了内核线程的两个“太重”问题：</p><ul><li>创建和切换：<code>goroutine</code>  在⽤户态创建和切换，⽆需进⼊内核，开销⽐线程⼩得多。</li><li>内存占⽤：<code>goroutine</code>  的初始栈只有 2KB，栈空间可动态扩展或收缩，避免了内存浪费与栈溢出⻛险。</li><li>由于 <code>goroutine</code>  的轻量特性，Go 程序可以轻松创建成千上万个并发任务，⽽不⽤担⼼性能和内存问题。</li></ul><p><strong>【思考🤔 】第⼆个问题：</strong>golang <strong>可以在⽤户级别空间创建协程底层是靠什么实现的</strong>?</p><p>其实是虽然协程在⽤户态空间运⾏，但其底层实现依赖于Go运⾏时对操作系统线程（OS Threads）的管理和调度。</p><p>具体来说：Go 协程运⾏在⽤户态空间，但它们并不是直接由操作系统调度的线程。相反，<strong>Go <strong>运⾏时通过⼀个⽤户态的调度器（</strong>Scheduler</strong>）来管理协程的执⾏，并将协程映射到操作系统线程上。</p><ul><li>⽤户态协程（Goroutine）：轻量级的并发单元，由Go运⾏时管理。</li><li>操作系统线程（OS Thread）：由操作系统调度的线程，⽤于执⾏Go运⾏时的代码。</li><li>运⾏时调度器（Scheduler）：负责将协程分配到操作系统线程上执⾏。</li></ul><p>Go 运⾏时的调度器是协程实现的核⼼，它通过以下组件协同⼯作：</p><ul><li>G（goroutine）：<ul><li>是⽤户态线程的抽象，可以在 M 上运⾏，存储于全局队列和 P 的本地队列（⼤⼩ 256）中。</li><li><strong>特点：</strong>G是轻量级的，创建和销毁的开销极⼩。</li></ul></li><li>M（Machine）：<ul><li>是操作系统线程的抽象，⼀个 M 代表⼀个线程，最多绑定⼀个 P。M 阻塞时会释放 P，允许 P与其他空闲的 M 绑定，如果没有空闲的 M，则创建新的 M。</li><li><strong>特点：</strong>M的数量通常远少于G的数量，由Go运⾏时动态管理。</li></ul></li><li>P（Processor）：<ul><li>逻辑处理器，抽象代表 CPU 核⼼。P 的数量决定了程序的并⾏能⼒，可以通过 GOMAXPROCS 设置。每个 M 需要绑定⼀个 P 进⾏任务调度。是 M 和 G 之间的桥梁。每个 P 都有⼀个本地的 Goroutine 队列，同时也可以访问全局的 Goroutine 队列。P 负责调度和管理 Goroutine 的执⾏，决定哪个 Goroutine 应该在哪个 M 上运⾏。</li><li><strong>特点：</strong> P的数量通常与CPU核⼼数相匹配，⽤于充分利⽤多核CPU的计算能⼒。</li></ul></li></ul><p>Go运⾏时的调度器通过以下步骤管理协程的执⾏：</p><ul><li>创建协程：当调⽤go func()时，Go运⾏时会创建⼀个新的G，并将其加⼊到调度队列中。</li><li>调度协程：调度器从队列中取出G，并将其分配给⼀个P。P将G绑定到⼀个M上，M开始执⾏G中的代码。</li></ul><p>阻塞与唤醒</p><ul><li>如果G在执⾏过程中阻塞（如等待I&#x2F;O操作），调度器会将该G挂起，并从队列中取出另⼀个G继续执⾏。</li><li>当阻塞的G被唤醒时，调度器会将其重新加⼊到队列中，等待执⾏。</li></ul><p>线程复⽤：</p><ul><li>如果所有M都被阻塞，调度器会创建新的M来执⾏队列中的G。</li><li>如果某个M完成任务，调度器会将该M回收，⽤于执⾏其他G。</li></ul><p>GMP 模型引⼊了 P 来解决 GM 模型的缺陷：</p><ul><li>⽆锁访问本地队列：P 保存 goroutine 的本地队列，M 优先从 P 的本地队列中取 G 执⾏，仅必要时访问全局队列，减少了锁竞争，提升了并发性。</li><li>优化数据局部性：新创建的 G 会优先放⼊创建它的 M 绑定的 P 的本地队列中，避免频繁的数据交互，提升内存使⽤效率。</li><li>Hand Off 交接机制：M 阻塞时，将绑定的 P 和其任务交给其他 M，提升了资源利⽤率和并发度。</li></ul><p>GMP 调度时机：介绍 GMP 的调度时机，主要分为正常调度、主动调度、被动调度和抢占调度四种情况</p><p>具体调度过程</p><ul><li><p><strong>创建</strong> Goroutine：当使⽤ go 关键字创建⼀个新的 Goroutine 时，Go 运⾏时会为其分配⼀个 G 对象，并将其放⼊全局或某个 P 的本地 Goroutine 队列中。</p></li><li><p><strong>调度</strong> Goroutine <strong>到</strong> M <strong>上执⾏</strong>：M 会从 P 的本地队列或全局队列中获取⼀个 G，并将其绑定到⾃⼰身上执⾏。如果 P 的本地队列为空，M 会尝试从其他 P 的本地队列中 “偷取” ⼀些 G 来执⾏，这种机制称为 “⼯作窃取”，可以提⾼调度的效率。</p></li><li><p><strong>阻塞和唤醒</strong>：当⼀个 Goroutine 遇到阻塞操作（如 I&#x2F;O 操作、Channel 读写等）时，M 会将该 G 标记为阻塞状<strong>阻塞和唤醒</strong>：当⼀个 Goroutine 遇到阻塞操作（如 I&#x2F;O 操作、Channel 读写等）时，M 会将该 G 标记为阻塞状态，并将其从当前 P 的队列中移除。同时，M 会继续从队列中获取其他 G 来执⾏。当阻塞操作完成后，G 会被唤醒，并重新放⼊某个 P 的队列中等待调度。</p></li><li><p><strong>上下⽂切换</strong>：Goroutine 的上下⽂切换由 Go 运⾏时负责，⽽不是操作系统内核。这种⽤户态的上下⽂切换⽐内核态的上下⽂切换开销⼩得多，因此可以实现⾼效的并发调度。</p></li></ul><h1 id="Channel是什么？什么作用？底层数据结构是什么？"><a href="#Channel是什么？什么作用？底层数据结构是什么？" class="headerlink" title="Channel是什么？什么作用？底层数据结构是什么？"></a>Channel是什么？什么作用？底层数据结构是什么？</h1><h2 id="Channel-的作用"><a href="#Channel-的作用" class="headerlink" title="Channel 的作用"></a>Channel 的作用</h2><p>在 Golang 并发编程中，channel（通道）是一种用于 goroutine 之间通信和同步的机制。它的主要作用包括：</p><ol><li><strong>goroutine 间通信</strong>：channel 允许不同的 goroutine 之间传递数据，实现数据的共享和交换。</li><li><strong>goroutine 同步</strong>：通过 channel 可以控制 goroutine 的执行顺序，实现对并发操作的同步。</li></ol><h2 id="Channel-的底层原理"><a href="#Channel-的底层原理" class="headerlink" title="Channel 的底层原理"></a>Channel 的底层原理</h2><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> hchan <span class="keyword">struct</span> &#123;</span><br><span class="line"></span><br><span class="line">  qcount <span class="type">uint</span> <span class="comment">// 当前缓冲区中的元素数量</span></span><br><span class="line"></span><br><span class="line">  dataqsiz buf <span class="type">uint</span> unsafe.Pointer <span class="comment">// 缓冲区⼤⼩（⽆缓冲区时为 0）</span></span><br><span class="line"></span><br><span class="line">  <span class="comment">// 指向缓冲区的指针</span></span><br><span class="line"></span><br><span class="line">  elemsize <span class="type">uint16</span> <span class="comment">// 元素⼤⼩</span></span><br><span class="line"></span><br><span class="line">  closed <span class="type">uint32</span> <span class="comment">// 标记通道是否已关闭</span></span><br><span class="line"></span><br><span class="line">  sendx <span class="type">uint</span> <span class="comment">// 下⼀个发送操作的索引</span></span><br><span class="line"></span><br><span class="line">  recvx <span class="type">uint</span> <span class="comment">// 下⼀个接收操作的索引</span></span><br><span class="line"></span><br><span class="line">  recvq waitq <span class="comment">// 等待接收的协程队列</span></span><br><span class="line"></span><br><span class="line">  sendq waitq <span class="comment">// 等待发送的协程队列</span></span><br><span class="line"></span><br><span class="line">  lock mutex <span class="comment">// 互斥锁，⽤于保护并发操作</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>buf 指向底层循环数组，只有缓冲型的 channel 才有。⽆缓冲区的通道则直接在发送和接收操作之间传递数据。</p><p> sendx， recvx 均指向底层循环数组，表示当前可以发送和接收的元素位置索引值（相对于底层数组）。</p><p> sendq， recvq 分别表示被阻塞的 goroutine，这些 goroutine 由于尝试读取 channel 或向 channel 发送数据⽽被阻</p><p>  塞。</p><p>waitq 是 sudog 的⼀个双向链表，⽽ sudog 实际上是对 goroutine 的⼀个封装：</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> waitq <span class="keyword">struct</span> &#123;</span><br><span class="line"></span><br><span class="line">  first *sudog</span><br><span class="line"></span><br><span class="line">  last *sudog</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>lock ⽤来保证每个读 channel 或写 channel 的操作都是原⼦的。</p><ul><li><strong>⽆缓冲区通道</strong>： dataqsiz 为 0，发送和接收操作必须同步完成。如果发送⽅没有接收⽅，发送⽅会阻塞，反之</li></ul><p>亦然。</p><ul><li><strong>有缓冲区通道</strong>： dataqsiz ⼤于 0，发送⽅可以将数据写⼊缓冲区，接收⽅可以从缓冲区读取数据。当缓冲区满</li></ul><p>时，发送⽅阻塞；当缓冲区为空时，接收⽅阻塞。</p><p>hchan 使⽤互斥锁（ mutex）来保护对缓冲区和协程队列的访问，确保在并发操作时不会出现数据竞争。通过这些底层结构和机制， channel 实现了⾼效且安全的协程间通信。</p><p>在 Golang 中，channel 可以分为无缓冲 channel 和有缓冲 channel，它们的主要区别在于通信方式和使用场景。以下是两者的通俗理解和具体区别：</p><h2 id="通俗理解无缓冲和有缓冲"><a href="#通俗理解无缓冲和有缓冲" class="headerlink" title="通俗理解无缓冲和有缓冲"></a>通俗理解无缓冲和有缓冲</h2><p><strong>无缓冲 channel（同步 channel）</strong></p><ul><li>无缓冲 channel 就像两个人直接进行面对面的交流。</li><li>发送方和接收方必须同时准备好，才能进行数据传递。</li><li>如果发送方先到，它会一直等待接收方到来；如果接收方先到，它会一直等待发送方发送数据。</li><li>无缓冲 channel 的发送和接收操作是同步的，会阻塞直到双方都准备好。</li></ul><p><strong>有缓冲 channel（异步 channel）</strong></p><ul><li>有缓冲 channel 就像一个快递柜，发送方可以先把东西放在快递柜里，接收方可以在有空的时候来取。</li><li>发送方在缓冲区有空位时可以直接把数据放进去，不需要等待接收方。</li><li>接收方在缓冲区有数据时可以直接取出来，不需要等待发送方。</li><li>有缓冲 channel 的发送和接收操作在缓冲区有空间或数据时可以异步进行，只有在缓冲区满或空时才会阻塞。</li></ul><p>使用场景</p><p><strong>无缓冲 channel</strong></p><ul><li>当需要严格同步两个 goroutine 的执行顺序时。</li><li>当需要确保发送方和接收方同时参与通信时。</li></ul><p><strong>有缓冲 channel</strong></p><ul><li>当需要解耦发送和接收操作时。</li><li>当需要暂存数据，避免发送方或接收方阻塞时。</li></ul><h1 id="Select的用法"><a href="#Select的用法" class="headerlink" title="Select的用法"></a>Select的用法</h1><p>Select 用来处理一个 Goroutine 等待多个 Channel 的情况。类似于 Switch 语句，Select 的每个 case 都是一个通信操作（发送或接收），当有 case 满足条件的时候，则执行对应 case 块的代码。</p><p>当没有 case 满足的时候，Select 逻辑块也会阻塞程序，当有多个 case 满足的时候，Select 会公平选择一个满足条件的 case 语句块执行（GO1.8 之后会随机选择一个）。为了避免阻塞，可以使用 default 。</p><p>在 Golang 并发编程中，<code>select</code> 语句用于处理多个 channel 的通信。它允许程序同时监听多个 channel 上的通信操作，并根据哪个操作最先完成来执行相应的代码块。<code>select</code> 语句在处理多个并发通信时非常有用，可以实现多路复用。</p><h2 id="关键点"><a href="#关键点" class="headerlink" title="关键点"></a>关键点</h2><ol><li><strong>多路复用</strong>：<code>select</code> 会同时监听多个 channel 上的通信操作。</li><li><strong>随机选择</strong>：如果有多个通信操作同时可以执行，<code>select</code> 会随机选择一个执行。</li><li><strong>阻塞</strong>：如果没有通信操作可以立即执行且没有默认分支，<code>select</code> 会阻塞，直到至少有一个通信操作可以执行。</li><li><strong>默认分支</strong>：如果有默认分支，当没有通信操作可以立即执行时，会执行默认分支的代码。</li></ol><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><ol><li><strong>随机选择</strong>：当多个 <code>case</code> 同时满足时，<code>select</code> 会随机选择一个执行，无法预测具体是哪一个。</li><li><strong>阻塞</strong>：如果没有 <code>default</code> 分支且没有通信操作可以立即执行，<code>select</code> 会阻塞。</li><li><strong>死锁风险</strong>：如果所有 <code>case</code> 都无法执行且没有 <code>default</code> 分支，程序可能会陷入死锁。</li><li><strong>效率</strong>：<code>select</code> 的效率较高，适合处理多个并发通信。</li></ol><h1 id="使用sync包"><a href="#使用sync包" class="headerlink" title="使用sync包"></a>使用sync包</h1><p>Golang 并发编程离不开 sync 包，里面提供了很多有用的类型和方法。常用知识点如下：</p><h2 id="Map"><a href="#Map" class="headerlink" title="Map"></a>Map</h2><p>普通的 map 不是并发安全的，容易出现竞争问题。sync.Map 是官方提供的一个并发安全的 Map，不需要自己额外处理锁、协调等操作。该类型提供了以下方法：</p><ul><li>Loads(): 装载键值（获取键值）</li><li>Store(): 储存键值</li><li>Delete(): 删除键值</li><li>LoadOrStore(): 如果存在则获取键值，不存在则存储</li><li>Range(): 遍历 Map</li></ul><h2 id="相反，并发安全的数据有如下"><a href="#相反，并发安全的数据有如下" class="headerlink" title="相反，并发安全的数据有如下"></a>相反，并发安全的数据有如下</h2><ul><li><p>sync.Map：通过读写 map来实现，读请求默认⾛读 map，如果读不到再请求写 map（加锁保证），同时在特定条件满⾜的情况下同步缓存和 DB 中的数据。misses 字段则⽤于计数，记录缓存未命中的次数，当我们要读取map 中某个 key 对应的值时，优先从 read 读取，如果 read 中不存在，则 misses 值加 1，然后继续从 dirty 中读取，当 misses 值达到某个阈值时，sync.Map 就会将 dirty 提升为 read。</p></li><li><p>sync.Pool是⼀个并发安全的临时对象池。它可以安全地被多个 goroutine 同时使⽤，⽤于缓存和复⽤临时对象，减少频繁创建和销毁对象带来的内存分配和垃圾回收压⼒，提⾼性能。</p></li><li><p>原⼦类型包 sync&#x2F;atomic 包;进⾏并发安全的操作。</p></li><li><p>读写锁（ sync.RWMutex）包装的数据结构。</p></li><li><p>Mutex：互斥锁。对于加了锁的操作，其他的 Goroutine 在读取相应对象时会阻塞，知道互斥对象释放。频繁、大量的使用互斥锁会导致性能的降低，应该只在必须用的地方用。互斥锁使用不当还有可能造成死锁、活锁、饿死等情况，就比较复杂了。</p></li></ul><h2 id="sync-Once"><a href="#sync-Once" class="headerlink" title="sync.Once"></a><code>sync.Once</code></h2><p>在 Golang 中，<code>sync.Once</code> 是一个用于确保某个函数或方法只被调用一次的工具。它在并发编程中非常有用，可以用来实现单例模式、资源初始化等场景，确保某些操作只执行一次，即使有多个 goroutine 同时尝试执行这些操作。</p><h3 id="基本用法"><a href="#基本用法" class="headerlink" title="基本用法"></a>基本用法</h3><p><code>sync.Once</code> 提供了两个主要方法：</p><ol><li>**<code>Do(f func())</code>**：执行给定的函数 <code>f</code>，并且保证 <code>f</code> 只会被执行一次，即使有多个 goroutine 调用 <code>Do</code> 方法。</li><li>**<code>Done() chan struct&#123;&#125;</code>**：返回一个通道，当 <code>Do</code> 方法完成时，该通道会关闭。可以用于等待 <code>Do</code> 方法的完成。</li></ol><p>示例代码</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">    <span class="string">&quot;fmt&quot;</span></span><br><span class="line">    <span class="string">&quot;sync&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="keyword">var</span> once sync.Once</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 定义一个需要只执行一次的函数</span></span><br><span class="line">    initFunc := <span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</span><br><span class="line">        fmt.Println(<span class="string">&quot;Initializing...&quot;</span>)</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 多个 goroutine 同时调用 once.Do</span></span><br><span class="line">    <span class="keyword">for</span> i := <span class="number">0</span>; i &lt; <span class="number">5</span>; i++ &#123;</span><br><span class="line">        <span class="keyword">go</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</span><br><span class="line">            once.Do(initFunc)</span><br><span class="line">        &#125;()</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 等待所有 goroutine 完成</span></span><br><span class="line">    time.Sleep(<span class="number">100</span> * time.Millisecond)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>单例模式</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">    <span class="string">&quot;fmt&quot;</span></span><br><span class="line">    <span class="string">&quot;sync&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> (</span><br><span class="line">    instance *MySingleton</span><br><span class="line">    once     sync.Once</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> MySingleton <span class="keyword">struct</span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">NewMySingleton</span><span class="params">()</span></span> *MySingleton &#123;</span><br><span class="line">    once.Do(<span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</span><br><span class="line">        instance = &amp;MySingleton&#123;&#125;</span><br><span class="line">        fmt.Println(<span class="string">&quot;Singleton instance created&quot;</span>)</span><br><span class="line">    &#125;)</span><br><span class="line">    <span class="keyword">return</span> instance</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="comment">// 多个 goroutine 同时获取单例实例</span></span><br><span class="line">    <span class="keyword">for</span> i := <span class="number">0</span>; i &lt; <span class="number">5</span>; i++ &#123;</span><br><span class="line">        <span class="keyword">go</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</span><br><span class="line">            singleton := NewMySingleton()</span><br><span class="line">            fmt.Println(<span class="string">&quot;Got singleton instance:&quot;</span>, singleton)</span><br><span class="line">        &#125;()</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 等待所有 goroutine 完成</span></span><br><span class="line">    time.Sleep(<span class="number">100</span> * time.Millisecond)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>输出：</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Singleton instance created</span><br><span class="line">Got singleton instance: &amp;&#123;&#123;&#125;&#125;</span><br><span class="line">Got singleton instance: &amp;&#123;&#123;&#125;&#125;</span><br><span class="line">Got singleton instance: &amp;&#123;&#123;&#125;&#125;</span><br><span class="line">Got singleton instance: &amp;&#123;&#123;&#125;&#125;</span><br><span class="line">Got singleton instance: &amp;&#123;&#123;&#125;&#125;</span><br></pre></td></tr></table></figure><h3 id="注意事项-1"><a href="#注意事项-1" class="headerlink" title="注意事项"></a>注意事项</h3><ol><li><strong>线程安全性</strong>：<code>sync.Once</code> 是线程安全的，可以安全地在多个 goroutine 中使用。</li><li><strong>函数执行</strong>：<code>Do</code> 方法中的函数只会被执行一次，即使有多个 goroutine 同时调用 <code>Do</code> 方法。</li><li><strong>不可重置</strong>：<code>sync.Once</code> 不能被重置，一旦执行完成，无法再次执行。</li></ol><p><code>sync.Once</code> 是 Golang 并发编程中一个非常有用的工具，用于确保某个函数或方法只被调用一次。它在实现单例模式、资源初始化等场景中非常有用，可以简化代码并提高程序的可靠性。</p><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>最近的项目都使用 Golang 进行开发，因为自己是从头自学，难免踩了很多坑。目前项目接近尾声，抽空对一些重要的知识点做一些总结。</p><h2 id="Goroutine-与-Channel"><a href="#Goroutine-与-Channel" class="headerlink" title="Goroutine 与 Channel"></a>Goroutine 与 Channel</h2><p>什么是 Goroutine 呢？有人说它是轻量级的进程，或者干脆说是协程。其实都不太准确，协程仅仅是在一个进程中进行子程序的切换，而 Goroutine 是可以多线程多路复用的。简而言之，Goroutine 是一个轻量级的、与其他 Goroutine 运行在同一块内存地址中的并发执行的函数模型。它的成本仅仅比堆栈的分配高一点点，所以很廉价。Goroutine 可以在多个线程上通过 Goroutine 自己的调度器实现多路复用。</p><p>那什么是 Channel 呢？它是程序中一种类型化的通道，即在这个虚拟通道中传输的是某种预定义的数据类型。通过相应的操作符如 <code>&lt;-</code> 可以在 Goroutine 之间发送和接收数据。 Channel 在默认情况下，接收或者发送的某端没有执行的时候会阻塞程序。Channel 可以在创建时定义缓冲大小，即缓冲区已满时才会发送缓存区的所有数据。</p><p>Channel 最简单的用法就是利用其阻塞程序的特性来做 Goroutine 结束的标志。例如在 Goroutine 代码块外定义一个 Channel 接收其中的数据，当 Goroutine 代码块内部执行完毕时向 Channel 发送完成信号进而执行后续的代码。</p><p>当程序有多个 Goroutine 或者多个 Channel ，他们管理起来就容易变得混乱。这时就可以考虑使用下文讲到的知识。</p><h2 id="Select-的用法"><a href="#Select-的用法" class="headerlink" title="Select 的用法"></a>Select 的用法</h2><p>Select 用来处理一个 Goroutine 等待多个 Channel 的情况。类似于 Switch 语句，Select 的每个 case 都是一个通信操作（发送或接收），当有 case 满足条件的时候，则执行对应 case 块的代码。当没有 case 满足的时候，Select 逻辑块也会阻塞程序，当有多个 case 满足的时候，Select 会公平选择一个满足条件的 case 语句块执行。为了避免阻塞，可以使用 default 。</p><h2 id="使用-sync-包"><a href="#使用-sync-包" class="headerlink" title="使用 sync 包"></a>使用 sync 包</h2><p>Golang 并发编程离不开 sync 包，里面提供了很多有用的类型和方法。常用知识点如下：</p><h3 id="Map-1"><a href="#Map-1" class="headerlink" title="Map"></a>Map</h3><p>普通的 map 不是并发安全的，容易出现竞争问题。sync.Map 是官方提供的一个并发安全的 Map，不需要自己额外处理锁、协调等操作。该类型提供了以下方法：</p><ul><li>Loads(): 装载键值（获取键值）</li><li>Store(): 储存键值</li><li>Delete(): 删除键值</li><li>LoadOrStore(): 如果存在则获取键值，不存在则存储</li><li>Range(): 遍历 Map</li></ul><p>我在项目中使用该类型替代了自己原本定义的一个全局 Map 类型，相比自己维护互斥锁或者读写锁等操作方便了不少，而且性能有优势（具体没有测试），据官方说明该 Map 类型显著减少了锁的争用。</p><h3 id="Mutex"><a href="#Mutex" class="headerlink" title="Mutex"></a>Mutex</h3><p>互斥锁。对于加了锁的操作，其他的 Goroutine 在读取相应对象时会阻塞，知道互斥对象释放。频繁、大量的使用互斥锁会导致性能的降低，应该只在必须用的地方用。互斥锁使用不当还有可能造成死锁、活锁、饿死等情况，就比较复杂了。</p><h3 id="RWMutex"><a href="#RWMutex" class="headerlink" title="RWMutex"></a>RWMutex</h3><p>读写锁。相较互斥锁，读写锁相较互斥锁性能损耗低些，因为对于只读操作只加共享锁，是支持并发的，仅在写操作上加互斥锁，明显提升了效率。</p><h3 id="Once"><a href="#Once" class="headerlink" title="Once"></a>Once</h3><p>Once 这个对象很有用，它是一个只执行一个操作的对象。该对象仅有一个 Do() 方法，仅当 Once 实例第一次调用 Do() 方法时，Do() 才会调用传递过来的函数。</p><p>这对于要实现单例模式的代码会方便一些，定义一个 Once 对象，将要实现单例的对象的初始化方法传递给 Do()，就能保证单例的并发安全。</p><p>但使用互斥锁不也能解决这个问题吗？其实不然，互斥锁的代价太高，会导致 Goroutines 无法对该变量进行并发访问。那我把它改成读写锁呢？例如：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">var mu sync.RWMutex // 定义读写锁</span><br><span class="line">var someMap map[string]interface&#123;&#125;</span><br><span class="line"></span><br><span class="line">// 并发安全的单例</span><br><span class="line">func GetMap(name string) interface&#123;&#125; &#123;</span><br><span class="line">    // 加读锁，并判断 someMap 是否为空</span><br><span class="line">    // 如果不为空则获取 Map 中的值</span><br><span class="line">    mu.RLock()</span><br><span class="line">    if someMap != nil &#123;</span><br><span class="line">        foo := someMap[name]</span><br><span class="line">        mu.RUnlock()</span><br><span class="line">        return foo</span><br><span class="line">    &#125;</span><br><span class="line">    // 注意这里无法在 else 语句将共享锁升级为互斥锁</span><br><span class="line">    mu.RUnlock()</span><br><span class="line"></span><br><span class="line">    // 如果 someMap 为空加互斥锁，并初始化 someMap</span><br><span class="line">    mu.Lock()</span><br><span class="line"></span><br><span class="line">    // 注意：必须要再一次检查是否为 nil</span><br><span class="line">    if someMap == nil &#123; </span><br><span class="line">        CreateMap()</span><br><span class="line">    &#125;</span><br><span class="line">    foo := someMap[name]</span><br><span class="line">    mu.Unlock()</span><br><span class="line">    return foo</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然而这种方式不觉得太复杂了吗？</p><h1 id="Pool"><a href="#Pool" class="headerlink" title="Pool"></a>Pool</h1><p>Pool 是一组用来保存或者检索的临时对象。Pub() 方法的入参是空接口，意味着可以把任何类型的对象放置在池子中以复用，减轻垃圾回收器的压力，正确的使用能很轻松的构建高效、线程安全的自由列表。</p><h1 id="WaitGroup"><a href="#WaitGroup" class="headerlink" title="WaitGroup"></a>WaitGroup</h1><p>WaitGroup 适用于等待多个 Goroutine 完成的逻辑下使用，控制多个 Goroutine 之间的同步。每新建一个 Goroutine 就可以调用 WaitGroup.Add() 来增加需要等待的 Goroutine 数量，当每个 Goroutine 都运行完毕时各自调用 Done() ，可以在程序的外层调用 Wait() 以阻塞程序直到所有 Goroutine 都调用了 Done()。</p><p>这样就可以在程序中使每个 WaitGroup 之间是同步的，但是 WaitGroup 之内的 Goroutine 是异步的。</p><h1 id="Context"><a href="#Context" class="headerlink" title="Context"></a>Context</h1><p>与 WaitGroup 不同，Context 实现了对串行的 Goroutine 的跟踪和控制，比如一个 Goroutine 在运行过程中派生出了其他 Goroutine，这些派生出的 Goroutine 又派生出了其他 Goroutine，这种 Goroutine 的关系链使用之前的 Channel + Select 来维护会使得程序变得异常复杂。而使用 Context 上下文来实现 Goroutine 间截止时间、取消信号或其他变量的共享和传递会变得简单。</p><p>Context 有四种方法来派生出不同的上下文：</p><ul><li>WithCancel: 传递取消信号</li><li>WithDeadline: 传递截止时间</li><li>WithTimeout: 传递超时信号</li><li>WithValue: 传递其他值</li></ul><p>例如 WithCancel 派生出的上下文，在对应 Goroutine 中调用 cancel() 会使所有同一上下文派生出的所有 Goroutine 关闭，在派生出的 Goroutine 中可以通过监听 ctx.Done() 来判断是否关闭 Goroutine。</p><p>Context 还有许多其他的用途，在 gRPC 、gin 中大量运用了 Context。Context 是并发安全的，所以可以放心的在 Goroutines 之间传递。</p><p>在Golang并发编程中，内存泄露和一些注意事项是需要特别关注的，以下是常见的情况和建议：</p><h1 id="常见内存泄露及注意事项"><a href="#常见内存泄露及注意事项" class="headerlink" title="常见内存泄露及注意事项"></a>常见内存泄露及注意事项</h1><ol><li><p><strong>goroutine泄露</strong></p><ul><li><strong>场景</strong>：goroutine因阻塞（如未关闭的channel、死循环）无法退出，导致内存泄露。每个goroutine占用2KB内存，大量goroutine泄露会造成内存占用持续增加。</li><li><strong>原因</strong>：goroutine在执行时被阻塞而无法退出，如未关闭的channel导致接收方一直等待。</li><li><strong>避免</strong>：确保goroutine有明确的退出机制，如使用<code>context.Context</code>传递取消信号，关闭channel通知协程退出。</li></ul></li><li><p><strong>time.Ticker未关闭</strong></p><ul><li><strong>场景</strong>：time.Ticker每间隔指定时间向通道写数据，若不调用<code>Stop()</code>方法，会一直占用内存。</li><li><strong>避免</strong>：在使用完time.Ticker后，务必调用<code>Stop()</code>方法来停止它。</li></ul></li><li><p><strong>字符串和切片截取</strong></p><ul><li><strong>场景</strong>：长字符串或切片被截取后，如果截取的小部分还在活跃，原大块内存将无法被回收，导致临时内存泄露。</li><li><strong>避免</strong>：在不需要保留原大块内存时，可以复制需要的部分到新的变量，或者使用其他方式避免共享底层数组。</li></ul></li><li><p><strong>Finalizer导致泄漏</strong></p><ul><li><strong>场景</strong>：设置Finalizer后，对象的内存无法被垃圾回收器及时回收，尤其当存在循环引用时。</li><li><strong>避免</strong>：谨慎使用Finalizer，避免不必要的循环引用。</li></ul></li><li><p><strong>Deferring Function Call导致泄漏</strong></p><ul><li><strong>场景</strong>：大量文件打开后仅在函数结束时释放，造成临时内存泄露。</li><li><strong>避免</strong>：在循环中打开文件时，应立即关闭，而不是等待函数结束。</li></ul></li><li><p><strong>内存分配未释放</strong></p><ul><li><strong>场景</strong>：持续分配内存但未释放，如持续向切片中添加数据而未清理。</li><li><strong>避免</strong>：合理管理内存分配和释放，避免不必要的内存堆积。</li></ul></li><li><p><strong>大数组作为参数</strong></p><ul><li><strong>场景</strong>：大数组作为形参时，值拷贝导致内存使用激增。</li><li><strong>避免</strong>：对于大数组，使用切片或指针传递，减少内存占用。</li></ul></li></ol><h2 id="注意事项-2"><a href="#注意事项-2" class="headerlink" title="注意事项"></a>注意事项</h2><ol><li><p><strong>并发安全与同步</strong></p><ul><li>共享资源需用<code>sync.Mutex</code>、<code>sync.RWMutex</code>或原子操作保护，优先使用Channel传递数据，避免直接共享内存。</li></ul></li><li><p><strong>控制并发量</strong></p><ul><li>避免无限制创建协程，使用带缓冲的Channel、Worker Pool或信号量限制并发数。</li></ul></li><li><p><strong>处理协程错误</strong></p><ul><li>在goroutine内部使用<code>defer</code>+<code>recover</code>处理<code>panic</code>，避免整个程序崩溃。</li></ul></li><li><p><strong>避免Channel死锁</strong></p><ul><li>确保Channel的发送和接收成对出现，避免协程永久阻塞，如未关闭的Channel可能导致接收方等待。</li></ul></li><li><p><strong>利用Context传递元数据和取消信号</strong></p><ul><li>使用<code>context.Context</code>传递元数据和取消信号，方便控制goroutine的生命周期。</li></ul></li><li><p><strong>合理使用锁</strong></p><ul><li>避免在持有锁的情况下调用可能导致阻塞的操作，如I&#x2F;O操作，防止死锁。</li></ul></li><li><p><strong>监控和分析</strong></p><ul><li>使用<code>runtime.MemStats</code>监控内存使用情况，使用<code>pprof</code>进行性能分析，及时发现和解决内存和性能问题。</li></ul></li></ol><p>通过遵循以上建议和注意事项，可以有效避免Golang并发编程中的内存泄露问题，编写出高效、稳定的并发程序。</p>]]>
    </content>
    <id>https://herongwei.me/2025/03/28/Golang-%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E5%AE%9E%E6%88%98%E6%80%BB%E7%BB%93/</id>
    <link href="https://herongwei.me/2025/03/28/Golang-%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E5%AE%9E%E6%88%98%E6%80%BB%E7%BB%93/"/>
    <published>2025-03-28T08:12:34.000Z</published>
    <summary>
      <![CDATA[<h1 id="Golang-并发编程实践总结"><a href="#Golang-并发编程实践总结" class="headerlink" title="Golang 并发编程实践总结"></a>Golang 并发编程实践总结</h1><p>目录</p>
<ul>
<li><a]]>
    </summary>
    <title>Golang 并发编程实战总结</title>
    <updated>2026-07-12T06:48:03.888Z</updated>
  </entry>
  <entry>
    <author>
      <name>贺同学</name>
    </author>
    <category term="博客" scheme="https://herongwei.me/categories/%E5%8D%9A%E5%AE%A2/"/>
    <category term="rust" scheme="https://herongwei.me/tags/rust/"/>
    <content>
      <![CDATA[<blockquote><p>你不需要的东西，你不必复出代价。进一步说，你确实需要的东西，你也不必付出代价。</p></blockquote><p>Rust高性能的原因剖析，从零成本抽象、无GC、编译器优化和编码思维这四个方面进行阐述：</p><h3 id="1-零成本抽象"><a href="#1-零成本抽象" class="headerlink" title="1. 零成本抽象"></a>1. 零成本抽象</h3><ul><li><p><strong>高级抽象无性能开销</strong>：Rust的零成本抽象理念，允许开发者利用高级抽象编写代码，这些代码在编译时能够转换成与手写C&#x2F;C++代码同样高效的机器代码。这些高级功能的运行时开销极小甚至没有。</p></li><li><p><strong>泛型和trait的高效实现</strong>：通过使用泛型和trait，可以编写可重用的代码，而不需要为每个具体类型编写重复的代码。这有助于减少代码重复和提高代码的可维护性，同时不会引入额外的性能开销。</p></li><li><p><strong>静态分派优化</strong>：Rust支持静态分派，编译器在编译时就能确定函数调用的具体地址，减少了运行时的开销，提高了程序的性能。</p></li></ul><h3 id="2-无GC"><a href="#2-无GC" class="headerlink" title="2. 无GC"></a>2. 无GC</h3><ul><li><p><strong>避免垃圾收集器的性能影响</strong>：Rust不依赖垃圾收集器（GC）来管理内存，而是通过所有权和借用规则在编译时确保内存安全。这样避免了GC可能导致的程序执行中的不可预测暂停，使得内存管理在编译时就变得可预测。</p></li><li><p><strong>内存管理的高效性</strong>：Rust的所有权模型可以在编译时捕捉大多数内存错误，从而减少运行时错误。这种机制不仅提高了程序的可靠性，还避免了因内存管理问题导致的性能损失。</p></li><li><p><strong>内存布局的优化</strong>：Rust的编译器能够根据程序的需求，对内存布局进行优化，以减少内存碎片和提高内存访问的效率。这使得Rust在内存管理方面具有较高的性能。</p></li></ul><h3 id="3-编译器优化"><a href="#3-编译器优化" class="headerlink" title="3. 编译器优化"></a>3. 编译器优化</h3><p>Rust 采用了 LLVM 作为其编译器后端，这意味着 Rust 代码可以被编译成高效的机器码。LLVM 是一个开源的编译器基础设施项目，它提供了一套编译器技术，模块化，可重用的工具链和库，用于优化和生成高质量的机器码。</p><ul><li><p><strong>高效的编译器</strong>：Rust的编译器进行了大量的优化，包括内联、常量传播、死代码消除等。这些优化能够减少生成的代码的体积，提高程序的运行效率。</p></li><li><p><strong>代码生成的优化</strong>：Rust的编译器能够根据标准化的接口定义生成最优的代码，从而减少不必要的开销。这意味着在实现抽象时，不会引入任何额外的开销，即使对于不使用抽象的代码也不会产生负担。</p></li></ul><h3 id="4-编码思维"><a href="#4-编码思维" class="headerlink" title="4. 编码思维"></a>4. 编码思维</h3><ul><li><strong>性能意识的开发习惯</strong>：Rust的开发者通常具有较强的性能意识，在编码过程中会主动考虑如何编写高效的代码。例如，合理使用类型系统和所有权模型，避免不必要的内存分配和复制操作。</li><li><strong>安全与性能的平衡</strong>：Rust的编码思维强调在保证内存安全的同时追求高性能。开发者在编写代码时，会充分利用Rust提供的各种特性，如模式匹配、枚举类型等，以实现既安全又高效的代码。</li><li><strong>模块化和可复用性</strong>：Rust的零成本抽象和强大的类型系统支持模块化编程，使得开发者能够编写出更加模块化和可复用的代码库。这不仅提高了开发效率，还便于代码的维护和优化。</li></ul><p>综上，我们可以看到，Rust之所以能够实现高性能，得益于其零成本抽象的设计理念、无GC的内存管理机制、强大的编译器优化能力以及开发者注重性能的编码思维。这些因素共同作用，使得Rust在保证内存安全的同时，能够提供与C&#x2F;C++相媲美的高性能表现。</p>]]>
    </content>
    <id>https://herongwei.me/2025/03/24/Rust-%E9%AB%98%E6%80%A7%E8%83%BD%E5%8E%9F%E5%9B%A0%E8%A7%A3%E6%9E%90/</id>
    <link href="https://herongwei.me/2025/03/24/Rust-%E9%AB%98%E6%80%A7%E8%83%BD%E5%8E%9F%E5%9B%A0%E8%A7%A3%E6%9E%90/"/>
    <published>2025-03-24T10:07:56.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>你不需要的东西，你不必复出代价。进一步说，你确实需要的东西，你也不必付出代价。</p>
</blockquote>
<p>Rust高性能的原因剖析，从零成本抽象、无GC、编译器优化和编码思维这四个方面进行阐述：</p>
<h3 id="1-零成本抽]]>
    </summary>
    <title>Rust 高性能原因解析</title>
    <updated>2026-07-12T06:48:03.888Z</updated>
  </entry>
  <entry>
    <author>
      <name>贺同学</name>
    </author>
    <category term="总结" scheme="https://herongwei.me/categories/%E6%80%BB%E7%BB%93/"/>
    <category term="总结" scheme="https://herongwei.me/tags/%E6%80%BB%E7%BB%93/"/>
    <content>
      <![CDATA[<h2 id="重启博客-学习-Rust"><a href="#重启博客-学习-Rust" class="headerlink" title="重启博客 学习 Rust"></a>重启博客 学习 Rust</h2><ul><li><input checked="" disabled="" type="checkbox"> 学习Rust</li><li><input checked="" disabled="" type="checkbox"> 学习Rust的生命周期</li><li><input checked="" disabled="" type="checkbox"> 学习Rust的所有权</li><li><input checked="" disabled="" type="checkbox"> 学习Rust的借用</li><li><input checked="" disabled="" type="checkbox"> 学习Rust的迭代器</li><li><input checked="" disabled="" type="checkbox"> 学习Rust的模式匹配</li><li><input checked="" disabled="" type="checkbox"> 学习Rust的泛型</li><li><input checked="" disabled="" type="checkbox"> 学习Rust的宏</li><li><input checked="" disabled="" type="checkbox"> 学习Rust的错误处理</li><li><input checked="" disabled="" type="checkbox"> 学习Rust的并发</li><li><input checked="" disabled="" type="checkbox"> 学习Rust的标准库</li><li><input checked="" disabled="" type="checkbox"> 学习Rust的第三方库</li></ul>]]>
    </content>
    <id>https://herongwei.me/2025/03/24/2025-03-24/</id>
    <link href="https://herongwei.me/2025/03/24/2025-03-24/"/>
    <published>2025-03-24T09:38:20.000Z</published>
    <summary>
      <![CDATA[<h2 id="重启博客-学习-Rust"><a href="#重启博客-学习-Rust" class="headerlink" title="重启博客 学习 Rust"></a>重启博客 学习 Rust</h2><ul>
<li><input checked="" disabl]]>
    </summary>
    <title>20250324-博客重启啦！</title>
    <updated>2026-07-12T06:48:03.888Z</updated>
  </entry>
  <entry>
    <author>
      <name>贺同学</name>
    </author>
    <category term="读书笔记" scheme="https://herongwei.me/categories/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    <content>
      <![CDATA[<blockquote><p>周末发现了一本有趣的书籍📚  <a href="https://book.douban.com/subject/36150423/">https://book.douban.com/subject/36150423/</a></p></blockquote><p>《我在北京送快递》的作者可以说是一个狠人，从步入社会到如今十几年间，在广东、广西、云南、上海、北京等地辗转打工，做过快递员、夜班拣货工人、便利店店员、保安、自行车店销售、网店工作人员、服装店导购、加油站加油工等基层工作。</p><p>自己还曾经创过业，现在是一名写作者。作为一名“底层打工人”，他经历了很多人未曾听闻的生活，也让我们了解了很多行业内幕。</p><p>整本书 ～12w 字，不算长，但是能从详细的语言描述上感受到作者质朴的工作生活经历以及真挚的情感，特别是在生活中不断产生的各种感悟以及思考，非常真实也非常能走到人心坎里。豆瓣上还有一些彩蛋，比如作者的自述（为什么要出这本书和读库发现他的故事）、媒体采访作者的片段（还有一些真实的照片），推荐大家阅读。</p><p>整理了下作者在书中表达的感悟和自己的一些读后感，也许会对你有所帮助。</p><h2 id="作者感悟"><a href="#作者感悟" class="headerlink" title="作者感悟"></a>作者感悟</h2><ul><li><p>“就像深海里的鱼都是瞎子、沙漠里的动物都很耐渴一样，我是一个怎样的人，很大程度上是由我所处的环境，而不是由我的所谓本性决定的。”</p></li><li><p>“卑贱的人如果心怀不满，就只会欺负别的卑贱的人，因为反抗权势是要吃苦头的。如果实在是谁也欺负不了，那就只能去虐待动物了。人们常常说，爱情是盲目的。但在我看来，爱情恰恰最不盲目、最不功利、最忠于本心。相反，仇恨才是盲目的。”</p></li><li><p>“每个人都会以己度人，你永远无法让一个不真诚的人相信你的真诚。反之，你根本没必要向一个真诚的人证明你的真诚。”</p></li><li><p>“我们也各有各的压力，各有各家里不顺心的事，谁也没有余力顾别人。在那种工作场所里，每个人都被生活压榨着，同情心因此透支，然后不知不觉地变得麻木、冷漠。”</p></li><li><p>“所谓的自由，实际上在于你能意识到什么，而不在于你享有什么。对于一个文化水平不高的农民来说，尽管每年的农务受到二十四节气的限制，但他不会感觉到有什么不自由。</p></li><li><p>农闲的时候和亲朋打打牌，农忙的时候忙完一天的农活儿，晚上回家喝点儿小酒，感觉惬意且满足，仿佛自己所做的都是自己想做的。可是文化水平越高，思维和意识越复杂，人就越难在工作中感觉到自由。”</p></li><li><p>实际上，通过写作我在一定程度上超越了打工和自由的对立：在有限的选择和局促的现实中，我越来越感觉到生活中许多平凡隽永的时刻，要比现实困扰的方方面面对人生更具决定意义。感谢浦睿文化的编辑普照</p></li></ul><h2 id="读后感"><a href="#读后感" class="headerlink" title="读后感"></a>读后感</h2><ul><li><p>每个人的经历都是难得的，每个人的经历也是独一无二，特别赞同作者在书中的一段话，如今我不会再为自己和别人的差异感到惶恐不安，相反，我珍视自己的个性。虽然我仍然很无知和胆怯，但在这之下多了一份坚持和信心。此后无论我打工或写作，那对我来说都是一种自我精神的建设。</p></li><li><p>正视社会的繁杂，正视自己的差异，学会接受现实，也学会保留个性，这就是社会阅历带给作者的成长。</p></li><li><p>精神领域的成长是人生从茫然随波到自我审视的关键，然后才能发现自我、接受自我，开始调整行为和思想，使得内外逐渐趋于一致，达至和谐。</p></li><li><p>一个人稳定的内核建设太重要了，一个人有了稳定的精神内核，就不会为谁的贬低而诚惶诚恐，也不会谁的称赞而沾沾自喜，这种自我认同感的增强，带来的自信和不受他人眼光影响</p></li><li><p>个人意识，是教育最应该达到的基本目的，让每一个人明白自己存在的意义，不是由于外界的肯定，而是存在本身就有意义，这份坚定之上，再去不断的发展自己。作者通过经历的事情和学习，不断反思，得到了这样的结论，实在值得赞叹！</p></li><li><p>幸运的人用童年治愈一生，不幸的人用一生治愈童年我也感受到，那些快乐的时光才成为困苦之中的精神力量。</p></li><li><p>有人按照自己喜欢的方式做自己喜欢的事情，却恰好能够满足雇主、客户或外部机制等的要求，并由此抵达了某种自由。但是这样的幸运听起来似乎可遇不可求。这样的生活实在是太幸运了</p></li><li><p>尽管褒贬不一，依然推荐阅读。积极的，阴暗的，沉默的，冲动的，温情的，崩溃的，宽容的，自私的，工作和生活的点滴。记忆尤深的是“榴莲的愤怒”，心里小小的恶，各种对自我不耻的剖析，亦比多数人勇敢。</p></li><li><p>“真正有魅力的人，一定是个灵魂有趣的人。有趣的灵魂，一定是对世界充满热爱，即便经历低谷，遭遇挫折，对生活不计回报的热爱永不朽坏；有趣的灵魂，一定是对社会充满责任，热爱家人，热爱朋友，愿意为这个社会做自己的贡献；有趣的灵魂，一定拥有广袤的视野，这视野，来自于丰富的阅历，渊博的知识，和从不间断的学习；有趣的灵魂，一定拥有乐观和豁达，不以物喜，不以己悲，不因挫折一蹶不振”</p></li></ul><p><img src="https://i.328888.xyz/2023/05/07/i1Ai7x.jpeg" alt="i1Ai7x.jpeg" loading="lazy" onerror='this.onerror=null;this.src="/img/404.jpg"'></p>]]>
    </content>
    <id>https://herongwei.me/2025/03/24/book_read_20230507/</id>
    <link href="https://herongwei.me/2025/03/24/book_read_20230507/"/>
    <published>2025-03-24T09:17:40.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>周末发现了一本有趣的书籍📚  <a href="https://book.douban.com/subject/36150423/">https://book.douban.com/subject/36150423/</a></p>
</bloc]]>
    </summary>
    <title>《我在北京送快递》读书笔记</title>
    <updated>2026-07-12T08:19:55.391Z</updated>
  </entry>
  <entry>
    <author>
      <name>贺同学</name>
    </author>
    <category term="博客" scheme="https://herongwei.me/categories/%E5%8D%9A%E5%AE%A2/"/>
    <content>
      <![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start-我的第一篇博客"><a href="#Quick-Start-我的第一篇博客" class="headerlink" title="Quick Start 我的第一篇博客!"></a>Quick Start 我的第一篇博客!</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">&quot;My New Post&quot;</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]>
    </content>
    <id>https://herongwei.me/2025/03/24/hello-world/</id>
    <link href="https://herongwei.me/2025/03/24/hello-world/"/>
    <published>2025-03-24T09:17:40.000Z</published>
    <summary>
      <![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for]]>
    </summary>
    <title>2023 0422 我的全球唯一域名诞生了！</title>
    <updated>2026-07-12T08:19:55.392Z</updated>
  </entry>
  <entry>
    <author>
      <name>贺同学</name>
    </author>
    <id>https://herongwei.me/1970/01/01/categories/index/</id>
    <link href="https://herongwei.me/1970/01/01/categories/index/"/>
    <published>1970-01-01T05:37:10.422Z</published>
    <title>分类</title>
    <updated>2026-07-12T06:48:03.888Z</updated>
  </entry>
</feed>
