示例工程区块链【免费下载链接】Dapp-LearningDapp learning project for developers at all stages. Becoming and cultivating sovereign individuals. Nonprofit organization.项目地址https://gitcode.com/gh_mirrors/da/Dapp-Learning点击查看免费下载本文以 Dapp-Learning 仓库中defi/stablecoin/RAI/readme.md为主线系统讲解 RAI 作为非锚定、超额抵押、治理最小化算法稳定资产的完整运作机制从格里芬困境与稳定币不可能三角出发深入赎回价格/赎回率双价格模型、PID 自动利率控制器、GEB 合约架构并延伸到 FLX 代币经济与治理最小化路线帮助读者建立从经济原理到链上实现的完整认知。背景为什么需要 RAIRAI 由 Reflexer Labs 开发是一种仅由 ETH 支持的稳定资产。与其他由央行发行的稳定币如 USDT、USDC不同RAI 不锚定美元等法币而是依靠算法维持价格稳定主打治理最小化Governance Minimization——在尽可能少的人为干预下自主运转。正因如此创始团队 Reflexer Labs 将 RAI 称为金钱之神God of Money。RAI 的核心定位是降低或延迟资产波动性的方案以便为其它 DeFi 协议提供这类低波动性的资产作为基础的标的资产。也就是说RAI 并不追求与某一种法币的固定汇率而是追求低波动让持有者获得接近于稳定币的确定性同时避免法定货币体系带来的中心化风险。稳定币不可能三角与前文提到的蒙代尔三元悖论类似加密世界中存在稳定币的三元悖论资本效率、价格稳定性和去中心化三者不能同时兼得。试图同时获得这三者的 ESD、BAC、UST 等项目最终都走向了失败。RAI 的取舍是明确牺牲部分资本效率采用较高的超额抵押与清算比例换取价格稳定性与去中心化。格里芬困境RAI 的诞生背景离不开稳定币特里芬困境格里芬困境为了保证全球主要结算货币美元的充足性美国不得不印出超本国需求的美元但由于货币超发又难以保证本国通货膨胀处于正常水平。也就是说在确保国际资金充足的情况下实际上伤害了本国的利益。任何锚定美元发行的稳定币本质上都在放大这种法币体系的矛盾——RAI 的解法是彻底放弃锚定让稳定资产的价格由系统内部算法自主调节。RAI 的核心原理非锚定、超额抵押与赎回率与 DAI 的渊源MCD 的硬分叉RAI 在很多方面与 DAI 相似是 MakerDAO MCD多抵押 Dai系统的硬分叉。但与 DAI 的关键区别在于DAI 的目标价格恒定为 1 美元而 RAI 的目标价格是可变的。RAI 有一个任意设定的初始目标价格——发行时初始目标价格为 3.14 美元。只要市场价格与目标价格不同RAI 就会通过算法调整利率也就是赎回率redemption rate以应对价格变化。当赎回率调整时人们会选择铸造或销毁 RAI通过改变代币供应量RAI 价格就能保持稳定。从经济模型的继承关系看RAI 类似单一抵押 DAISCD用户超额抵押 ETH按照赎回价格也就是目标价格生成稳定币 RAI支付年化 2% 的利息即可持续使用 RAI用户随时可以按照系统赎回价格偿还 RAI 并支付借贷利息赎回自己的 ETH。两个价格目标价格赎回价格与市场价格RAI 存在两个价格赎回价格redemption price系统希望 RAI 具有的价格即系统内债务的计价基准。DAI 始终停留在 1 美元而 RAI 的赎回价格可变。市场价格market price市场对 RAI 的评估价格。用户收到的 RAI 单位数取决于目标价格但价值不取决于目标价格。例如假设 RAI 的最小抵押比率为 145%用户存入了 1 ETH1 ETH 100 美元。用户可以提取价值高达 69 美元的 RAI如果 RAI 的目标价为 1 美元那么价值 69 美元的 RAI 相当于 69 个 RAI如果目标价为 3 美元那么价值 69 美元的 RAI 只有 23 个 RAI。因此RAI 的目标价格可以理解为系统内债务的价格——它决定了单位债务对应多少枚 RAI而非 RAI 的美元价值。基本组成模块从仓库defi/RAI/README.md的整理看RAI 系统由以下核心概念组成模块说明Reflex-indexRAI非锚定资产与自身抵押品相比波动性较低赎回价格系统希望 RAI 具有的价格DAI 恒为 1 美元RAI 可变市场价格市场评估 RAI 的价格赎回率用于激励用户产生更多杠杆或偿还债务的利率可为正数或负数赎回率逐渐改变赎回价格借贷能力一个单位抵押品可以借出多少个 RAI每次系统收到其接受的抵押品类型的价格供给更新时供给数据除以赎回价格、再除以清算率即可计算借贷能力稳定费率年化 2%清算罚金18%–20%以借贷能力为例假设 ETH 价格为 1000 美元清算比例为 150%当前 RAI 赎回价格为 3 美元则 1 ETH 的借贷能力约为1000 / 3 / 1.5 222.2 RAI。RAI 的稳定机制如何维持均衡当 RAI 的市场价格等于其目标价格时可以说 RAI 到达了均衡模式。当 RAI 的均衡被扰动时控制器会设定反向市场利率——具体来说根据目标价格与市场价格的相对差来确定利率。在系统中有两类角色Holder出借人通过市场价格购买并持有 RAI 的人。Borrower借款人 / minter抵押 ETH 生成 RAI 的投资者即 SAFE users。SAFE users 抵押 ETH 生成 RAI 后RAI 就相当于 SAFE users 的负债。注意这里的负债计价采用赎回价格与市场价格无关当 SAFE users 想要还清债务时也是按照赎回价格偿还给协议并支付一定利息。与 MakerDAO 稳定费的对比在 MakerDAO向 DAI 的贷款人收取稳定费stability fee。如果稳定费是 3%借了 100 DAI那么一年后就欠 103 DAI。MakerDAO 促进稳定性的方式之一是当 DAI 价格下降时让 MKR 持有人投票增加稳定费借款人到期需要偿还更多的 DAI这意味着借款人需要在市场中买入更多的 DAI 以偿还贷款总体贷款美元计价不变从而将 DAI 价格推回 1 美元的固定汇率。RAI 的利率机制更有趣例如如果 RAI 的市场价格从均衡点下跌了 10%而 RAI 调节机制的反应是设置 x%/天的利率那么 RAI 实际上是将目标价格提高了 x%/天。对 RAI 借款人来说由于债务被重新定价为更高的成本这与直接向他们收取利率具有同样的效果将促使其买入更多的 RAI 以偿还贷款但实际锚定美元成本不变。这种机制鼓励借款人偿还债务为此他们需要购买 RAI从而帮助 RAI 恢复平衡。供求两侧的反馈路径ETH 杠杆需求上升 → 质押并卖出 RAI质押出 RAI并用 RAI 买入 ETH→ RAI 价格下降RAI 需求上升 → 购买 RAI → RAI 价格上升。PID 平衡机制两种失衡情形的闭环响应RAI 系统通过 PID 控制模块下文详述输出赎回率形成负反馈闭环情形一市场价格大于赎回价格当市场对 RAI 的需求旺盛导致市场价格上涨时系统通过 PID 控制模块输出负的赎回率。负的赎回率意味着赎回价格不断下降使赎回价格更加显著地低于市场价格。于是系统内的 Borrower 倾向于增加借款——通过质押 ETH 获得新的 RAI 并出售给市场获利使 RAI 供应量提高、市场价格降低同时Holder 预期未来赎回价格下跌会联动市场价格下跌有动机卖掉 RAI 规避价格下跌。两种行为都会增加市场上 RAI 的供给使市场价格逐渐下降至与赎回价格一致。情形二市场价格小于赎回价格当市场对 RAI 的需求萎靡导致市场价格下跌时系统通过 PID 控制模块输出正的赎回率导致赎回价格不断上涨。Borrower 预期未来还债成本更高更倾向于从市场购买 RAI 偿还给系统否则未来还债成本更大使 RAI 供应量降低同时 Holder 预期未来价格上涨更有动力持币甚至吸引新 Holder 入场买入 RAI。两种行为都会增大对 RAI 的需求使 RAI 价格不断上涨接近赎回价格。PID 控制器链上的自动货币政策PID比例-积分-微分控制是经典的工业控制理论。Reflexer 将其应用于加密货币的货币政策正是 RAI 实现无治理自动化的核心。目前线上 RAI 使用了P比例和 I积分没有使用 D微分。比例-积分控制公式仓库defi/RAI/PID.md给出了完整的数学表达设accumulatedLeak perSecondCumulativeLeak^Δt对积分项施加的泄漏系数类似负利率则比例项P redemptionPrice - marketPrice赎回价格与市场价格的偏差积分项I accumulatedLeak · I_old (P P_old) / 2 · Δt对历史偏差做带泄漏的时间加权累积采用黎曼和近似积分。随后将 P 乘以比例增益 Kp、I 乘以积分增益 Ki 并求和P P_old · Kp I I_old · Ki PI P I噪声屏障与速率限幅噪声屏障noise barrier如果计算出的P·Kp I·Ki输出没有打破噪声屏障则忽略太小的反馈参数返回中性值。目前线上 PIRawPerSecondCalculator 的noiseBarrier为 1即|PI| 0不会忽略任何反馈。判定条件为|PI| (2 - noiseBarrier) · redemptionPrice - redemptionPrice。速率限幅getBoundedRedemptionRate()对最终速率做限制处理feedbackOutputLowerBound PI feedbackOutputUpperBound目前线上下限为-999999.999999999999999999999、上限为1000000000000000000000000实际可忽略若PI 0 PI defaultRedemptionRatedefaultRedemptionRate -1000000则设置PI NEGATIVE_RATE_LIMIT近似 1若defaultRedemptionRate PI 1则PI defaultRedemptionRate - NEGATIVE_RATE_LIMIT若1 PI则PI defaultRedemptionRate PI。调用流程与关键合约PID 速率更新的完整调用链如下PIRateSetter.updateRate()每隔一段时间触发赎回率更新。该函数任何人都可以触发并领取一点奖励补偿 gas 费用目前设置的更新间隔是 12 小时。函数内部通过orcl.getResultWithValidity()从预言机获取市场价格通过oracleRelayer.redemptionPrice()获取此前的赎回价格。PIRawPerSecondCalculator.computeRate()由 PID 模块计算新的反馈参数updateDeviationHistory(proportionalTerm, accumulatedLeak)更新偏差历史PI getGainAdjustedPIOutput(P, I)计算 PI 反馈参数breaksNoiseBarrier()过滤过小的反馈参数getBoundedRedemptionRate()对 PI 做限幅处理。对应合约源码仓库文档摘录// geb-rrfm-rate-setter/src/PIRateSetter.sol contract PIRateSetter { function updateRate(address feeReceiver) external { ... // accumulatedLeak uint256 iapcr (defaultLeak 1) ? RAY : rpower(pidCalculator.pscl(), pidCalculator.tlv(), RAY); uint256 calculated pidCalculator.computeRate( marketPrice, redemptionPrice, iapcr ); // set rate try setterRelayer.relayRate(calculated, feeReceiver) { ... } } } // geb-rrfm-calculators/src/calculator/PIRawPerSecondCalculator.sol contract PIRawPerSecondCalculator is SafeMath, SignedSafeMath { function computeRate( uint marketPrice, uint redemptionPrice, uint accumulatedLeak ) external returns (uint256) { ... // The proportional term is just redemption - market. Market is read as having 18 decimals so we multiply by 10**9 int256 proportionalTerm subtract(int(redemptionPrice), multiply(int(marketPrice), int(10**9))); // Update the integral term by passing the proportional (current deviation) and the total leak updateDeviationHistory(proportionalTerm, accumulatedLeak); lastUpdateTime now; // Multiply P by Kp and I by Ki and then sum P I in order to return the result int256 piOutput getGainAdjustedPIOutput(proportionalTerm, priceDeviationCumulative); if ( breaksNoiseBarrier(absolute(piOutput), redemptionPrice) piOutput ! 0 ) { (uint newRedemptionRate, ) getBoundedRedemptionRate(piOutput); return newRedemptionRate; } else { return TWENTY_SEVEN_DECIMAL_NUMBER; } } }赎回价格本身的更新遵循复利式递推公式redemptionPrice_new redemptionPrice_old · redemptionRate^Δt从源码结构看getNextPriceDeviationCumulative通过riemannSum(proportionalTerm, lastProportionalTerm) · timeElapsed完成积分项的梯形近似再叠加带泄漏的历史累积项体现了典型的 PI 控制器离散化实现。GEBRAI 背后的协议架构GEB 是 RAI 协议的核心合约仓库本质上是 MCDMakerDAO-dss的修改版。仓库defi/RAI/GEB.md总结了 GEB 相对 MCD 的核心改进可以理解的变量名称自主反馈机制改变系统参与者的激励可添加 SAFE 保险SAFE Saviour固定和递增的折扣拍卖而非英国式拍卖用于出售抵押品自动调整系统中的几个参数一组合约约束长期治理的参数控制可以一次将稳定费用发送到多个地址可以在盈余拍卖和其他类型的策略之间切换以删除系统盈余每种抵押品类型有两个价格一个用于生成债务另一个专门用于清算 SAFEStability Fee Treasury 可以支付 Oracle 调用或其他自动化系统的 gas 费用。核心模块地图GEB 按职责划分为以下模块对应defi/RAI/GEB.md的 Core Module 章节模块职责SAFE EngineSAFE、系统币与抵押品数据库跟踪所有债务和抵押余额Liquidation Engine协议清算机制使外部参与者清算 SAFE 并转移抵押品/债务Accounting Engine协议记账员跟踪盈余与赤字通过拍卖平衡系统Auction Module抵押品拍卖、债务拍卖与盈余拍卖Oracle Module抵押品与系统币价格的真相来源Token ModuleERC20 代币、权限合约与进出系统的适配器Money Market Module利率设定与收取TaxCollectorSustainability Module资源管理引擎Stability Fee Treasury 等Automation Module自动设置参数的合约集合Governance Module达成共识的工具DSPause 延迟机制Shutdown Module系统关机结算GlobalSettlement、ESMSAFE Engine系统的心脏SAFE Engine 存储所有 SAFE用户的抵押和债务仓位并跟踪所有债务和抵押平衡。该合约是最重要的系统组件为尽可能减少出错可能它没有任何外部依赖。其核心数据结构如下struct SAFE { uint256 lockedCollateral; // [wad] 仓位中锁定的抵押品总量 uint256 generatedDebt; // [wad] 仓位生成的债务总量 } struct CollateralType { uint256 debtAmount; // [wad] 该抵押品类型发行的总债务 uint256 accumulatedRate; // [ray] 该抵押品类型计提利息的累加器 uint256 safetyPrice; // [ray] SAFE 被允许生成债务的最低价格 uint256 debtCeiling; // [rad] 该抵押品类型可生成债务的上限 uint256 debtFloor; // [rad] 使用该抵押品的 SAFE 必须生成的最低债务 uint256 liquidationPrice; // [ray] SAFE 被清算的价格 }稳定费计提方面accumulatedRate将针对抵押品类型产生的标准化债务generatedDebt转换为债务现值实际债务发行量 利息该费率通过updateAccumulatedRate由 TaxCollector 调用更新每次更新后新计提的稳定费用都会添加到 surplusDst 的coinBalance中。清算引擎与拍卖模块Liquidation Engine 使外部参与者能够清算 SAFE将其抵押品发送到 CollateralAuctionHouse同时将部分债务发送到 AccountingEngine。liquidateSAFE可以随时调用但只有在目标 SAFE 处于亏损状态时才成功当锁定的抵押品乘以抵押品的清算价格liquidationPrice小于其当前价值的负债已生成债务乘以累积利率 accumulatedRate时SAFE 即处于亏损状态。其中需要注意Safety ratios安全比率与清算比率的区别安全比率是对 SAFE 生成债务时使用的最小抵押率通常比清算比率更保守更高清算比率是 SAFE 被清算时的最小抵押率。拍卖模块分为三类CollateralAuctionHouse出售不足抵押 SAFE 中的抵押品维持系统整体健康。支持英式拍卖竞标者用逐渐增加的系统币竞标固定数量的抵押品以及 FixedDiscount / IncreasingDiscount 单阶段折扣拍卖——后者更具资本效率和用户友好性且允许任何人使用闪电贷购买抵押品DebtAuctionHouse通过将协议代币拍卖以换取一定数量的盈余系统币摆脱会计引擎的债务SurplusAuctionHouseBurning / Recycling / PostSettlement 三个版本通过拍卖一定数量的内部系统币换取协议代币清除 AccountingEngine 的盈余。预言机模块Oracle 模块负责将价格源更新输入并推入系统由三个核心组件组成Medianizer获取某种资产的价格源FSMFeed Security Module/ OSMOracle Security Module为从 Medianizer 获取的价格引入延迟OSM 确保新价格在指定延迟后才被系统接受DSMDampened Security Module则限制两个连续价格更新之间的最大价格变化OracleRelayer按赎回价格将价格数据除以质押率再将结果除以质押率将最终输出推入 SAFEEngine。它还为每种抵押品类型存储两种价格安全价格仅用于生成债务与清算价格用于 liquidateSAFE同时负责存储赎回价格并使用赎回率更新它。updateCollateralPrice是公开可调用的函数分三个阶段先与抵押品类型的 orcl 交互获取价格及有效性再计算safetyPrice与liquidationPrice从 OSM 获取的值除以赎回价格再除以 safetyCRatio / liquidationCRatio最后调用safeEngine.modifyParameters更新系统内抵押品价格。代码实现见defi/RAI/GEB.md中的OracleRelayer.sol摘录。关机模块Shutdown Module 负责在严重威胁长期市场失序、黑客攻击或安全漏洞时对系统关机并将所有抵押品退还给用户。结算可由紧急关机模块ESM触发——治理需要存入并销毁一定数量的协议代币或治理方直接访问 GlobalSettlement 绕过 ESM 结算系统。GlobalSettlement 关闭 GEB 并确保 SAFE 与系统币用户收到应得的资产净值。部署地址RAI 已部署在以太坊主网仓库defi/RAI/README.md给出了完整的部署地址表节选关键合约{ NETWORK: mainnet, GEB_SAFE_ENGINE: 0xCC88a9d330da1133Df3A7bD823B95e52511A6962, GEB_TAX_COLLECTOR: 0xcDB05aEda142a1B0D6044C09C64e4226c1a281EB, GEB_LIQUIDATION_ENGINE: 0x4fFbAA89d648079Faafc7852dE49EA1dc92f9976, GEB_ACCOUNTING_ENGINE: 0xcEe6Aa1aB47d0Fb0f24f51A3072EC16E20F90fcE, GEB_COIN: 0x03ab458634910AaD20eF5f1C8ee96F1D6ac54919, GEB_ORACLE_RELAYER: 0x4ed9C0dCa0479bC64d8f4EB3007126D5791f7851, GEB_RRFM_CALCULATOR: 0xddA334de7A9C57A641616492175ca203Ba8Cf981, GEB_GLOBAL_SETTLEMENT: 0xee4cf96e5359d9619197fd82b6ef2a9eae7b91e1, MEDIANIZER_RAI: 0x92dC9b16be52De059279916c1eF810877f85F960, MEDIANIZER_ETH: 0xb825e25856bD98b3f2FAF2aEb6Cb8742B38C4025, GEB_JOIN_ETH_A: 0x2D3cD7b81c93f188F3CB8aD87c8Acc73d6226e3A }完整列表含 SAFE_MANAGER、GEB_COIN_UNISWAP_POOL、CHAINLINK_AGGREGATOR 等可查阅 defi/RAI/README.md 的 Addresses 章节。治理最小化最小化治理意味着在 GEB 部署过程中采取的一系列步骤最终使治理无法控制或升级大多数核心合约许多参数将由其他外部合约自主设置。这是 RAI 区别于绝大多数稳定币项目的核心特征。治理最小化的要求为了实现 GEB 的治理最小化需要满足以下要求见 GovernanceMinimization.md协议的治理不能添加或计划添加更多的抵押品种类所有治理最小化基础设施必须经过生产环境的审计和测试系统必须积累足够的盈余在其主要财政中以承担至少 6 个月的预言机、PID、状态管理等费用。各组件的最小化潜力GEB 的每个组件都有不同程度的治理最小化潜力例如Liquidation Engine治理将保持控制连接/断开 SAFE 救世者的能力可选择授权外部合约自动设置onAuctionSystemCoinLimitOracle Relayer治理可能被允许将赎回率设为 0%除此之外治理完全可以被移除SAFE Engine治理需要允许外部合约每隔几个小时/天自动设置每种抵押品的债务上限并根据最新赎回价格调整债务下限Tax Collector治理可选择有限控制稳定费率例如为每种抵押品设置每年 1%–2% 的上下限PID 控制器治理可能需要长期保持一定控制——例如当系统稳定币在交易所流动性不足时暂停控制器。即使如此OracleRelayer 也会对赎回率设置上下限防止潜在的治理攻击立即摧毁协议。三个治理最小化层级GEB例如 RAI将经历三个级别的治理最小化Level 1发布后 14 个月治理从 LiquidationEngine、DebtAuctionHouse、SurplusAuctionHouse、Collateral Auction Houses、OracleRelayer、CoinERC20、CollateralJoin contracts、TaxCollector、ESM 等合约的控制中移除Level 2发布后 18 个月治理从 SAFEEngine、AccountingEngine、GlobalSettlement、Lender of First Resort Pool、RAI Controller、ProtocolTokenAuthority、ProtocolTokenPrintingPermissions、Auto Surplus Buffer Setter 等合约的控制中移除Level 3所有剩余治理必须由社区掌握社区将评估完全从更多合约例如 PID中移除控制的可行性。FLX协议的后备与治理代币RAI 采用双代币机制FLX 是其治理代币FLX 对于 RAI 就像 MKR 对于 DAI。FLX 在协议中有两个主要功能后备机制BackstopFLX 股东是 RAI 协议出现问题时的第一道防线第二道防线是通过债务拍卖市场发行新的 FLX 代币以 RAI 代币为交换获取这些新 FLX 代币取消治理Ungovernance一旦治理最小化完成FLX 持有人将能够从 RAI 中移除任何剩余的治理组件或继续管理难以治理的组件如预言机或与其他协议交互的组件。在协议实现治理最小化之前RAI 设置三种手续费向借款人收取的稳定费率用途Stability Fee Treasury智能合约负责支付 Oracle 更新或任何其他旨在自动化 RAI 参数的合约FLX 持有人协议的第一道防线——为其产生的 RAI 代币以 FLX 形式拍卖拍卖所得 FLX 随后发送到股权池回购和销毁在协议资产负债表中累积 RAI 代币足够多后拍卖部分 RAI 换取 FLX 并销毁通缩 FLX 供给。目前 FLX 除了参与治理外协议向用户收取的利息一部分会用于回购销毁 FLX同时协议对组建 FLX/ETH 流动性池LP也有一定激励。RAI 的生态应用场景RAI 独特的赎回率机制为 DeFi 生态提供了新的组合维度见defi/RAI/README.md的用途章节Unique Money Markets独特货币市场如果 Alice 从货币市场借款并支付 5% 年利率借出 RAI而 RAI 赎回价格每年下降 10%她实际上每年获得 5% 收益预计 RAI 市场价格一年内下降 10%反之Bob 以 4% 年利率出借 RAI 而赎回率为 10% 时他的头寸每年赚取约 14%期权定价开发者可以构建期权协议将赎回利率视为 RAI 的内在利率据此确定看涨/看跌期权价格Pegged Coins / Synthetic Assets固定货币项目可以使用 RAI 作为 ETH 的更稳定替代品在 ETH 市场严重崩溃时RAI 为持有者提供更多时间解除仓位再清算Yield Aggregator将 RAI 的正赎回利率与 Compound 或 Aave 上的借贷相结合是优化收益的可能方式Sophisticated Arbitrageurs套利者可观察赎回价格行为并结合市场情绪寻找理想交易时机也可向资本池提供专门的 RAI 交易服务并分成利润Portfolio Management Strategies将赎回率数据纳入组合管理策略。深入阅读本文涉及的核心文档与源码梳理均可在当前仓库中进一步研读RAI 主文档历史、核心业务流程与稳定机制GEB 协议架构合约流程、核心模块与源码摘录RAI PID 机制控制公式、限幅逻辑与调用流程治理最小化指南要求、各组件潜力与三个层级算法稳定币总览AMPL / ESD / BAC / Frax 对比赞分享示例工程区块链【免费下载链接】Dapp-LearningDapp learning project for developers at all stages. Becoming and cultivating sovereign individuals. Nonprofit organization.项目地址https://gitcode.com/gh_mirrors/da/Dapp-Learning点击查看免费下载相关推荐Ng Zorro Modal 信息提示对话框info/success/error/warning 的使用与源码实现解析Ng Zorro Modal 信息提示对话框info/success/error/warning 的使用与源码实现解析 导读 本文聚焦 ng zorro an示例工程区块链jsprit代码架构深度解析理解模块化设计的精妙之处jsprit代码架构深度解析理解模块化设计的精妙之处 jsprit是一个基于Java的开源工具包专为解决复杂的车辆路径问题VRP而设计。作为一款强大的路后端交通物流dplyr na_if() 完全指南类型稳定、大小稳定与错误处理机制深度解析dplyr na_if 完全指南类型稳定、大小稳定与错误处理机制深度解析 na_if 是 dplyr 数据清洗工具箱中用于把某个恼人的值替换成 NA 的标数据分析上一篇微信聊天记录永久保存指南3步掌握你的数字记忆主权下一篇从入门到精通Raspberry Pi固件编译与部署的完整流程基于rpi-firmware项目创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考