尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Grin 合约思想解析:无脚本链上的原子互换、闪电网络与密码学合约构造
区块链Web3【免费下载链接】grinMinimal implementation of the Mimblewimble protocol.项目地址https://gitcode.com/gh_mirrors/gr/grin点击查看免费下载导读Grin 区块链不支持脚本语言但这并不意味着它无法承载复杂的链上合约。本文以仓库中的 doc/contract_ideas.md 与 doc/contracts.md 为核心线索系统梳理 Mimblewimble 生态中多位密码学家Andrew Poelstra、John Tromp 等提出的合约构想从 Pedersen 承诺与 Schnorr 聚合签名两大内置原语出发逐层推导无脚本原子互换Atomic Swap、类哈希原像挑战、闪电网络Lightning Network、锁时交易Lock-time与零知识条件支付ZKCP的代数构造。读者读完本文将掌握这些合约背后签名即脚本的数学原理并能在 Grin 源码中找到对应的内核特征KernelFeatures、聚合签名接口与锁高校验实现理解理论构想与工程落地之间的对应关系。背景无脚本链的合约思路Grin 是一个 Mimblewimble 协议的最小实现见仓库根目录 README.md其链上没有图灵完备脚本也没有比特币式的OP_*操作码。合约能力完全来自链本身内置的少数密码学原语再以越来越巧妙的方式组合而成如 doc/contracts.md 开篇所述。值得强调的是这些构造方式并非 Grin 开发团队原创主要归功于 Torben Pryds Pedersen、Gregory Maxwell、Andrew Poelstra、John Tromp、Claus Peter Schnorr 等一批密码学家。本文所依据的doc/contract_ideas.md正是这些思想的原始记录汇编——其内容大量来自 Mimblewimble 邮件列表上的技术讨论消息编号 msg00022、msg00036、msg00047、msg00086 等可以视为该项目的合约思想备忘录。要理解这些合约必须先明确三个内置原语Pedersen 承诺所有输出形如r*G v*H其中r是盲因子、v是金额、G与H是同一椭圆曲线群上的两个独立生成元。聚合签名Schnorr / MuSig可对任意消息做多方签名聚合。锁高lock_height交易核可携带一个绝对或相对高度未达高度前区块拒绝包含该核。下文先回顾这三个原语的工程实现再进入contract_ideas.md的合约世界。内置原语回顾合约的地基Pedersen 承诺金额被盲因子隐藏在 Grin 中所有 UTXO 都由r*G v*H形式的 Pedersen 承诺表示。由于H的离散对数未知承诺只暴露值而不暴露谁拥有这也正是后续无脚本合约能成立的隐藏性基础。源码侧承诺的求和处理集中在 core/src/core/committed.rs 的Committedtrait 中sum_commitments收集输入、输出承诺并处理overage手续费或奖励sum_kernel_excesses汇总所有内核 excessverify_kernel_sums校验内核 excess 之和 输出承诺之和扣除输入与手续费不匹配时返回KernelSumMismatch。这套承诺可相加的性质是所有下文合约多方输出、条件锁时、原子互换能进行代数运算的根本原因。聚合签名用标量算术构建合约最简单的聚合签名构造如下doc/contracts.md 1.2 节待签名消息MGrin 中为手续费或fee | lock_height私钥x与公钥x*G一次性随机数knonce。构造挑战e SHA256(M | k*G | x*G)与标量s k e*x完整签名即为(s, k*G)。验证时重算e并检查s*G k*G e * x*G对 Grin 交易而言令私钥x等于输出盲因子之和减去输入盲因子之和即可为整笔交易构造内核签名——内核中保存 excess 承诺与其签名从而在隐藏所有金额的同时证明交易不增发货币并签署手续费。在源码中这一层由 core/src/libtx/aggsig.rs 封装与底层rust-secp256k1-zkp的 aggsig 模块对接calculate_partial_sig给定签名者私钥、私密 nonce、所有参与者的公钥 nonce 之和nonce_sum、可选的公钥之和pubkey_sum与消息产出部分签名verify_partial_sig用相同的pub_nonce_sum、公钥与消息验证部分签名add_signatures将多个部分签名与 nonce 之和聚合成完整签名subtract_signature从完整签名中减去一个部分签名——这正是后文无脚本原子互换中计算差值s - s的底层操作sign_with_blinding直接用盲因子BlindingFactor签署消息用于交易内核 excess 签名见 core/src/libtx/build.rs 中kernel.excess_sig aggsig::sign_with_blinding(...)的用法。因为签名只是标量 公钥所以可以仅用简单算术加减乘把多个交易绑在一起——这就是contract_ideas.md中所有无脚本构造的数学源泉。绝对锁时交易与相对锁时交易绝对锁时类比比特币 nLockTime交易可花费的高度h被写进待签名消息与交易核M fee | h锁高h包含在交易内核中含锁高大於当前区块高度内核的区块会被拒绝在 Grin 源码中内核特征由 core/src/core/transaction.rs 的KernelFeatures枚举表达其中HeightLocked { fee, lock_height }即绝对锁时内核kernel_sig_msg()计算待签消息hash(features || fee_fields || lock_height)。区块校验在 core/src/core/block.rs 的verify_kernel_lock_heights中完成任何lock_height self.header.height的内核直接返回KernelLockHeight错误交易池在入池时也会调用 chain/src/chain.rs 的verify_tx_lock_height校验tx.lock_height() next_block_height不满足则报ImmatureTransaction见 pool/src/transaction_pool.rs 与 pool/src/types.rs。相对锁时把锁高定义成相对某个内核首次进入链状态的高度。Tx2 需满足自 Tx1通过其内核承诺C被包含后经过h个区块才能生效且待签消息变为M fee | h | C并需附上包含C的 Merkle 证明。在源码中相对锁时由KernelFeatures::NoRecentDuplicate { fee, relative_height }即 NRD 内核实现relative_height为NRDRelativeHeight取值限定在1..WEEK_HEIGHT一周高度之间见 core/src/core/transaction.rs。相对高度的合法性校验可见 chain/tests/nrd_validation_rules.rs。原子互换从哈希原像到完全无脚本contract_ideas.md的第一大主题是原子互换Atomic Swap——两条链上的两方在不信任彼此的前提下交换资产且要么双方都成功、要么双方都回滚。基于哈希原像的版本Poelstra 在 msg00022 中的基本描述在另一条链上Igno 向我发送代币而我只有通过揭示某个哈希原像他知道、我不知道才能赎回。在 MW 链上我们做同样的交换使 Igno 能通过揭示原像拿走我的代币当他取走代币时必然揭示原像从而我也能取走我的代币。注意这要求两条链都支持哈希原像所有比特币脚本衍生链、以太坊、以及 Mimblewimble 都支持。这一版本的完整协议细节2-of-2 多签、锁时退款、原像换取签名在本文锁时交易与 ZKCP部分有更详细的展开contracts.md的原子互换一节也给出了同构的六步构造Bob 发送sr kr x e*rr与x*GAlice 广播后计算sr - sr得到原像x。无脚本版本转换密钥 sconvPoelstra 在 msg00036 中提出了更进一步的思想没有原像的原子互换。代数上假设我要把 1 个 MW1 链上的币给 Igno换取另一条链上的 MW2 币与经典方案相同双方先在每条链上把币放入 2-of-2 输出。双方各自拒绝在对方给出锁时退款交易前移动自己的币锁定时间设置为我能比对方更早取回我的币。这与 Tier Nolan 的经典比特币原子互换一致锁定时间差是因为协议中段 Igno 能先取走他的币而我暂时不能我必须确保他不能取走并同时反悔。Igno 和我构造把锁定币转移到最终目的地的交易。我们就内核与签名 nonce特别是挑战e与e达成一致。Igno 给我一个转换密钥sconv满足sconv * G R - R eP - eP我签署 MW1 交易把币给 Igno并把签名发给他。现在 Igno 签署 MW1 交易给自己取币。为此他加上自己的签名s k xe其中k是他的私密 nonce、x是他的私钥——这两个值我不知道但其公钥部分已被锁进挑战e。我随后计算s s sconv——这恰好是 Igno 在 MW2 交易中那一半签名——于是我能取走我的币。关键观察我在第 3 步就能验证sconv的合法性该验证方程足以保证我算出的s通过验证当且仅当s通过验证。一旦两个签名公开任何人都能算出sconv s - s。由此得到两个性质不泄露任何密钥分享sconv无害因为任何拿到最终签名的人本就可以算出它可否认性deniability该方案依赖Igno 在我知道s之前给我sconv这一点双方都无法证明任何一对签名我们中的任意一方都能伪造出上面的完整交互记录。Poelstra 的结论是这种多交易原子链接是一个相当通用的原语可用于链接闪电通道等场景——也许我们根本不需要哈希原像。John Tromp 的六步双链完整方案msg00047 中John Tromp 给出了上述思想在 MW 链与 MW 链之间、从 2-of-2 持仓输出出发的完整六步协议并配以逐笔交易的代数表格。记号约定小写字母表示角色r 为盲因子、k 为 nonce大写字母表示由谁选取/计算IIgnoAAndrew数字为序号表示另一条链。前提是MW 与 MW 使用同一条曲线与相同的生成元 G、H且双方共享所有对盲因子与 nonce 的承诺为简化讨论忽略找零与手续费Tromp 特别提醒手续费必须写入内核并签名防止中继节点或矿工劫持——中继可自行添加输出与内核截留一半手续费矿工则可规避 coinbase 锁时。步骤 1把原始输出转入 2-of-2 持仓输出链角色inputblinding/outputkernelnonce/challengesignatureMWIgnorI0*Ga*HrI1rI1-rI0kI1sI1kI1e1*(rI1-rI0)MWAndrewrA1rA1kA1sA1kA1e1*rA1MWtx1(rI1rA1)*Ga*HrI1rA1-rI0e1H(kI1*GkA1*G)s1sI1sA1MWIgnorI1rI1kI1sI1kI1e1*rI1MWAndrewrA0*Ga*HrA1rA1-rA0kA1sA1kA1e1*(rA1-rA0)MWtx1(rI1rA1)*Ga*HrI1rA1-rA0e1H(kI1*GkA1*G)s1sI1sA1双方还必须为 2-of-2 输出构造范围证明range proof此处从略。构成签名sI1, sA1, sI1, sA1此刻还不能共享——只有在退款有保障时锁仓才是安全的。步骤 2准备锁时退款交易防互换失败链角色inputoutputkernelnonce/challengesignatureMWIgnorI2*Ga*HrI2-rI1kI2sI2kI2e2*(rI2-rI1)MWAndrew-rA1kA2sA2kA2e2*-rA1MWtx2(rI1rA1)*Ga*HrI2-rI1-rA1e2H(L||kI2*GkA2*G)s2sI2sA2构成签名sI2与sA2由双方共享并验证。MW 上的 tx2 类似构造但锁定时间L更早。此时共享步骤 1 的四个构成签名才安全它们被求和为 tx1 的s1与 tx1 的s1。该步骤可简化令rI2 rI1省略kI2与sI2直接取s2 sA2。Andrew 对此的评语是在 MW 中复用密钥极其容易制造 footgun。不过我认为这里实际是安全的你只是在直接反转第一笔交易。当 tx1 与 tx1 都确认后进入步骤 3若后续任何步骤失败任一方都可广播自己的退款交易。步骤 3构造 2-of-2 输出上的互换交易链角色inputoutputkernelnonce/challengesignatureMWIgno-rI1kI3sI3kI3e3*-rI1MWAndrewrA3*Ga*HrA3-rA1kA3sA3kA3e3*(rA3-rA1)MWtx3(rI1rA1)*Ga*H-rI1rA3-rA1e3H(kI3*GkA3*G)s3sI3sA3链角色inputoutputkernelnonce/challengesignatureMWIgnorI3*Ga*HrI3-rI1kI3sI3kI3e3*(rI3-rI1)MWAndrew-rA1kA3sA3kA3e3*-rA1MWtx3(rI1rA1)*Ga*HrI3-rI1-rA1e3H(kI3*GkA3*G)s3sI3sA3至此原子互换被归结为s3 与 s3 的交换需要 Igno 揭示 s3 的同时让 Andrew 得到 s3——办法是让 Andrew 知道sI3与sI3之差。步骤 4可验证地链接 Igno 在两个交易中的签名Igno 揭示sconv sI3 - sI3 kI3 e3*(-rI1) - (kI3 e3*(rI3-rI1))Andrew 验证sconv*G kI3*G - e3*rI1*G - kI3*G e3*(rI3-rI1)*G步骤 5让 Igno 在 MW 上取得互换所得tx3 出现在 MW 链上即揭示了s3。步骤 6让 Andrew 在 MW 上取得互换所得Andrew 计算s3 sI3 sA3 sconv sI3 sA3 sconv s3 - sA3 sA3然后广播 tx3。整个协议完成。这个方案的工程落地点在于签名只是标量sconv的传递与验证完全依赖 core/src/libtx/aggsig.rs 中的subtract_signature/add_signatures这类签名算术接口——理论表格中的每一列s k e*(blind)都能对应到calculate_partial_sig的一次调用。闪电网络LNs类哈希原像挑战与重盲化从 HTLC 到新构造Poelstra 在 msg00022 中记录他向 Thaddeus Dryja 展示了如何用锁时与哈希原像实现 HTLC哈希时间锁合约Dryja 认为这足以创建闪电通道——原则上我们获得了完整的闪电支持。msg00029 则是一堆回复无特别具体内容。随后在 msg00086 中Poelstra 给出一个**行为更像哈希原像挑战、且支持重盲化reblinding**的新构造。核心思想把x - xG当作哈希函数x是xG的原像。有两种相关但不同的能力(a) 构造一个揭示原像的签名(b) 构造一个预签名pre-signature在原像的帮助下变成正式签名。基本构造收到币的条件是揭示 x假设我把xG发给 Rusty他想在我给他x的前提下给我打币。我有密钥P1、nonceR1他有密钥P2、nonceR2。我们共同构造公钥为P1 P2的多签而 Rusty 会安排得让我不告诉他x就无法完成签名双方就R1, R2, P1, P2达成一致。双方都可计算挑战e H(P1 P2 || R1 R2 || tx)。我发送s k1 - x - x1e其中R1 k1GP1 x1G。他可用sG R1 - xG - eP1验证。他发来s2 k2 - x2e他那一半多签。我补上s1 k1 - x1e完成签名最终签名为(s1 s2, R1 R2)。只要这个签名公开我就能算出x s1 - s——签名本身就成了原像的载体。中间跳不知道 x 也能中转如果 Rusty 是闪电通道的中间跳他希望在自己揭示x的前提下收到币他自己并不知道x不能像上面第 3 步那样直接构造s k1 - x - x1e。于是角色反转Rusty 从 Tadge 那里收币双方就R1, R2, P1, P2达成一致。Tadge 的密钥与 nonce 是R1与P1但关键R1 - xG k1G——即 Tadge 的 nonce 被k1G偏移。双方计算e H(P1 P2 || R1 R2 || tx)。Tadge 发送预签名s k1 - x1eRusty 用sG R1 - xG - eP1验证。一旦 Rusty 得到x他就能算s1 s - x——这即 Tadge 那一半最终签名。Rusty 自己算s2并完成签名。重盲化防止路径关联真正的 Rusty 抱怨过他在我这边与在 Tadge 那边使用同一个xG是隐私泄露——在洋葱路由闪电通道中xG复用会让路径上任意两个参与者即使不直接相连在串通时发现彼此同属一条路径。修复很简单Rusty 选一个重盲化因子rG。我把x给他如前但 Tadge 要求他提供的是(x r)我把xG作为挑战给 Rusty他转成xG rG给 Tadge。由于 Rusty 知道r他能完成转换。对任何观察者而言两个挑战表现为均匀独立随机。组合成闪电路径假设 Andrew 想通过 Bob 和 Carol 给 Drew 打币路径为A -- B -- C -- D每个箭头是一条闪电通道。只有 Andrew 知道完整路径他对每个参与者做洋葱加密每个参与者只知道前后邻居。Andrew 从 D 处取得挑战T xG从 B、C 处取得重盲化因子U、V。利用上面的技巧A → BA 给 B 打币条件是他学会T U V的离散对数B → CB 给 C 打币条件是他学会T V的离散对数B 知道U的离散对数足以满足 A 的挑战C → DC 给 D 打币条件是他学会T的离散对数——即 D 的原始挑战C 知道V的离散对数足以满足 B 的挑战。最终路径上的交易全部由单个、均匀随机、相互独立的 Schnorr 签名签署——尽管它们都属于同一条原子的闪电路径。这正是无脚本闪电的威力所在。两点工程注意每次交易内容变化以及 nonce 变化s值都必须重新传递由于它依赖对方 nonce每次通道更新可能需要额外一轮交互上述构造完全不依赖被签内容它同样适用于 Mimblewimble、BitcoinSchnorr、Monero多签环机密交易、EthereumSchnorr甚至可以跨链链接交易。锁时交易Lock-time2-of-2 持仓 锁时退款msg00022 给出一个自包含的锁时协议我要向 Igno 发送一个比特币条件是他揭示哈希原像。他给我哈希e。流程如下我把币发送到一个由我们两人 2-of-2 控制的多签输出但我不完成签署结果 excess 值的那一半。Igno 构造一笔把我币退回的交易锁时到未来某个时间我们完成这笔交易Igno 做他那部分我可以稍后再做。2a我广播第一笔交易于是链上出现只有经双方同意才能花费的币。我构造把币转给 Igno 的交易在 excess 中用哈希e签署、锁时留空并完成我这部分签名。此时 Igno 有两个选择(a) 完成交易——做他那部分签名并向网络包括我揭示原像(b) 什么都不做——那么锁时过后我把币取回。这一模式正是多方限时锁定的雏形contracts.md中将其形式化为——Alice 用与 Bob 共享的输出构造 2-of-2 交易但不参与内核签名Bob 构造锁时退款交易如 1440 个区块、约 24 小时后双方完成 2-of-2 交易并广播。此后双方可用锁定的资金自由构造更多交易若 Bob 拒绝合作Alice 只需在锁时过后广播退款。该合约可直接用于单向支付通道。ZKCP零知识条件支付msg00022 中 Poelstra 回忆了 ZKCPZero-Knowledge Contingent Payments的场景Igno 生成一个零知识证明证明哈希原像能解密某个我关心的问题的解。他给我加密后的解、哈希与证明然后我们执行前述的以原像换金钱的交换。本质上是把锁时 原像合约与零知识证明组合金钱的释放条件从揭示原像升级为原像 该原像确实解密出正确结果。这展示了 Mimblewimble 无脚本合约的可组合性——contract_ideas.md中Scripting etc.一节收录的 msg00025 与 msg00029 正是对这一方向的进一步讨论以邮件列表中的多轮回复形式存在。衍生合约矩阵从原语到工程综合contract_ideas.md与contracts.md可以把整个合约谱系归纳如下每一项都能在 Grin 现有原语上找到落点合约需要的原语在 Grin 中的实现对应无需信任交易交互式构造聚合签名aggsig::calculate_partial_sig/verify_partial_sig三步数据交换多方输出多签Pedersen 承诺 聚合签名 范围证明committed::verify_kernel_sums盲因子之和rarb构成内核 excess多方限时锁定2-of-2 锁时KernelFeatures::HeightLockedverify_kernel_lock_heights条件输出锁时承诺可加性 绝对锁时两个内核承诺C1C2由Key3Key1Key2支配相对条件输出锁时上述 相对锁时KernelFeatures::NoRecentDuplicateNRD 内核原子互换锁时 2-of-2 原像/转换密钥subtract_signature计算sconv哈希时间锁闪电锁时 原像 重盲化内核消息M fee | h签名算术可迁移其中条件输出锁时值得一提的细节contracts.md2.5 节因为私钥可加Key3 Key1 Key2、承诺可加C3 C1 C2把两笔相关交易的输出纠缠在一起就能把一个无条件锁时变成有条件锁时——Tx1含 Out1可立即上链确认Tx2 未达锁高前不可广播若 Alice 只知道Key3Out1 只能在锁高后被她花费而知道Key2的 Bob 可以立即花费 Out1。这与比特币的OP_CHECKLOCKTIMEVERIFY语义相对应。源码印证理论与实现的对照理论文档中的每个公式都可以在仓库中找到对应实现聚合签名接口core/src/libtx/aggsig.rs 提供calculate_partial_sig对应s k e*x、verify_partial_sig对应s*G k*G e*x*G验证、add_signatures对应s sum(si)与subtract_signature对应原子互换中的s - s。内核结构与锁时core/src/core/transaction.rs 的KernelFeatures::HeightLocked { fee, lock_height }是绝对锁时的载体kernel_sig_msg()按hash(features || fee || lock_height)生成待签消息TxKernel::verify()用 excess 作为公钥验证签名。区块拒绝未来锁高core/src/core/block.rs 的verify_kernel_lock_heights对每个HeightLocked内核检查lock_height self.header.height违反即报KernelLockHeight。交易池门槛pool/src/transaction_pool.rs 在入池时调用 chain/src/chain.rs 的verify_tx_lock_height未到期的交易以ImmatureTransaction拒绝——这与文档中锁定高度大于当前高度的交易会被拒绝完全一致。测试用例core/tests/core.rs 的test_block_with_timelocked_tx验证了lock_height1等于当前高度的区块合法、lock_height2的区块抛出KernelLockHeight(2)——这是文档锁时语义的直接工程证据。相对锁时chain/tests/nrd_validation_rules.rs 以及 core/src/core/transaction.rs 的NRDRelativeHeight取值1..WEEK_HEIGHT实现了文档中相对锁时交易的构想。整体校验逻辑doc/validation/validation_logic.md 的 Block 一节明确列出Verify no kernels have a future lock height与Verify the big sum与committed.rs的verify_kernel_sums一一对应。这些实现表明contract_ideas.md中的构想不是停留在纸面的空想——聚合签名、锁时内核、承诺求和三大原语已经在 Grin 主链中落地原子互换、闪电通道、条件支付等合约只需在这些原语之上按文档中的代数步骤组合即可。结语无脚本合约的边界与可能性回顾doc/contract_ideas.md的整条脉络可以得出三点结论签名即脚本Mimblewimble 虽无脚本但 Schnorr 聚合签名的线性算术s k e*x提供了比哈希原像更通用的挑战-响应原语足以实现原子互换与闪电网络可组合性承诺相加、密钥相加、签名相加三个性质让合约可以像搭积木一样叠加——2-of-2 持仓 锁时退款 转换密钥即构成原子互换再加重盲化即构成洋葱闪电路径可否认与隐私无脚本方案天然具备可否认性任何一方都能伪造交互记录而重盲化让路径参与者无法关联——这是比特币脚本方案难以同时获得的性质。对于想要进一步探索的读者仓库中的 doc/contracts.md含中文版 doc/translations/contracts_ZH-CN.md提供了更结构化的合约推导而 core/src/libtx/aggsig.rs、core/src/core/transaction.rs 与 core/src/core/committed.rs 则是验证这些构造的最佳源码现场。赞分享区块链Web3【免费下载链接】grinMinimal implementation of the Mimblewimble protocol.项目地址https://gitcode.com/gh_mirrors/gr/grin点击查看免费下载相关推荐PaddlePaddle UVDoc错误排查手册10个常见问题及解决方案PaddlePaddle UVDoc错误排查手册10个常见问题及解决方案 PaddlePaddle UVDoc_safetensors是飞桨生态中用于文档处理工业异常检测新标杆PatchCore昇腾Ascend910B NPU适配版深度解析工业异常检测新标杆PatchCore昇腾Ascend910B NPU适配版深度解析 PatchCore昇腾Ascend910B NPU适配版是一种基于内存库Uniswap V3 闪电贷实战Dapp-Learning 闪电贷合约源码解析与回调机制Uniswap V3 闪电贷实战Dapp Learning 闪电贷合约源码解析与回调机制 本文基于 Dapp Learning 仓库中 uniswapv3 闪示例工程区块链上一篇终极ABAP Excel报表解决方案abap2xlsx完整配置与实战指南下一篇Label Studio终极指南5分钟搭建你的AI数据标注工作台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

jackson-databind 升到 2.21.4 就安全了吗?不够,2.21.5 也不够了:现在要 2.21.7 / 2.18.11(2026-10-12 更正)

jackson-databind 升到 2.21.4 就安全了吗?不够,2.21.5 也不够了:现在要 2.21.7 / 2.18.11(2026-10-12 更正)

2026-10-12 更正 本文写于 2026-08-07,当时官方一共 11 条公告,结论是升到 2.18.9 / 2.21.5 / 3.1.5。**这组版本号已经过时。**之后官方又发了几批公告,截至 2026-10-12,jackson-databind 与 jackson-core 合计 26 条,一次修完要升到 2.18.11 / 2.21.7 / 2.22.3 / 3.1.7 / 3.2…

📅 2026/10/13 6:37:25
ABB PFEA112‑20 3BSE050091R20 Tension Control Amplifier

ABB PFEA112‑20 3BSE050091R20 Tension Control Amplifier

ABB PFEA112‑20 3BSE050091R20 is a high‑precision Pressductor tension control amplifier module. It receives measuring signals from ABB PFTL series tension load cells, performs signal conditioning and real‑time tension calculation, and outputs analog cont…

📅 2026/10/13 6:37:25
冒泡排序可视化实战:Coding Challenge 114 的 Processing 与 p5.js 双实现深度解析

冒泡排序可视化实战:Coding Challenge 114 的 Processing 与 p5.js 双实现深度解析

教程文档示例工程 【免费下载链接】website-archive Archive of the Coding Train website (first version) 项目地址: https://gitcode.com/gh_mirrors/we/website-archive 点击查看 免费下载 导读 本文以 Coding Train(本仓库)第 114 号编…

📅 2026/10/13 6:32:24
MORE NEWS

更多资讯

📰

Node-Red环境搭建避坑指南:从零跑通第一个节点

1. 为什么我劝你先别急着拖节点,把环境搭明白再说 很多人第一次接触 Node-Red,是被它那种“拖拖拽拽就能跑通一个物联网流程”的演示吸引进来的。打开浏览器,左边一栏节点,中间一块画布,把 inject、function、debug 三…

📰

Context-Mode:一种解决代码导航迷航的上下文模式

写代码的时候最怕的不是报错,而是“迷路”。尤其是在一个几千行的文件里滚动半天,光标停住了,却完全想不起来自己现在正处于哪个类、哪个函数、哪个分支里。我几年前第一次遇到这个困境,是因为接手一个多人维护的项目,…

📰

Aurelio 上手:一个本地优先的个人财富管理应用,AI 只提建议不直改数据

2152 stars MIT Python local-first项目定位 Aurelio 是运行在本机的财富管理与财务规划应用,带一个可选的自然语言 AI 顾问。数据存放于本地 backend/data.db,不上传、不注册账号。 覆盖范围:银行/券商账户、持仓、基金穿透(按…

📰

Litellm实战:统一多LLM API网关的部署与排坑指南

如果手头同时接入三五家 LLM 服务商,你会很快发现一件事:真正麻烦的不是模型能力,而是 API 格式。A 家用这种报文,B 家用那种结构,错误码也各说各话,今天需求要换模型,明天就得改一版配套代码。…

📰

基于Spark与Django的胆结石数据分析与可视化系统设计

1. 这个题目为什么值得做:选题价值与技术选型逻辑1.1 从“毕业设计要被pass”说起的选题思路每年到了毕设选题的季节,很多同学来问我:老师给的题目要么是“XX管理系统”,要么是“A算法改进B算法”,前者工作量倒是够&am…

📰

lsp-mode 故障排查完全指南:从日志、服务器路径到最小环境复现

开发工具 【免费下载链接】lsp-mode Emacs client/library for the Language Server Protocol 项目地址: https://gitcode.com/gh_mirrors/ls/lsp-mode 点击查看 免费下载 导读 lsp-mode 是 Emacs 社区主流的 Language Server Protocol 客户端实现。当语言服务器无…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬