DLC原理解析及其优化思考
1. 引言
Discreet Log Contract (DLC) 是由麻省理工学院的Tadge Dryja在2018年提出的一套基于预言机的合约执行方案。DLC 允许两方根据预定义的条件进行有条件付款。各方确定可能的结果并进行预签名,并在预言机签署结果时使用这些预签名来执行支付。 因此,DLC可实现新的去中心化金融应用,同时保证比特币存款的安全。
与闪电网络相比,DLC具有以下显著优势:
- 隐私性:DLC在隐私保护方面优于闪电网络,合约细节仅在参与方之间分享,而不会在区块链上存储。相比之下,闪电网络交易通过公开的通道和节点路由,其信息公开且透明;
- 财务合约的复杂性和灵活性:DLC能够直接在比特币网络上创建和执行复杂的金融合约,如衍生品、保险和赌约等,而闪电网络主要用于快速的小额支付,无法支持复杂应用;
- 降低对手方风险:DLC资金被锁定在多签合约中,只有在预定义事件的结果出现时才会释放,减少了任一方不遵守合约的风险。尽管闪电网络减少了信任需求,但在通道管理和流动性提供方面仍存在一定的对手方风险;
- 无需管理支付通道:DLC操作无需创建或维护支付通道,而这是闪电网络的核心组成部分,通道管理既复杂又耗资源;
- 特定用例的可扩展性:闪电网络在一定程度上提高了比特币的交易吞吐量,而DLC在比特币上的复杂合约方面提供了较好的可扩展性。
虽然DLC在比特币生态应用中极具优势,但是仍存在一些风险和问题,如:
- 密钥风险:预言机的私钥和承诺的随机数具有泄露或丢失风险,导致用户资产损失;
- 中心化信任风险:预言机中心化问题,容易导致拒绝服务攻击;
- 去中心化无法密钥派生:如果预言机去中心化,则预言机节点仅拥有私钥分片。但是,去中心化的预言机节点无法基于私钥分片直接使用BIP32进行密钥派生;
- 串谋风险:如果预言机节点之间串谋、或与参与方串谋,则仍没解决预言机的信任问题。需要一个可靠的监督机制,使得预言机信任最小化;
- 固定面额找零问题:条件签名需要在构建合约之前有确定性的可枚举事件集合来构建交易。因此,DLC用于资产重新分配会有最小金额的限制,导致存在固定面额的找零问题。
为此,本文提出一些方案和优化思路,解决DLC的风险和问题,提高比特币生态系统的安全性。
2. DLC原理
Alice和Bob签署一个对赌协议:投注第n+k个区块的哈希值是奇数或偶数。如果是奇数,则Alice赢得游戏,可在t时间内提取资产;如果是偶数,则Bob赢得游戏,可在t时间内提取资产。使用DLC,通过预言机传递第n+k的区块信息来构造条件签名使得正确的获胜方赢得所有资产。
- 1)初始化:椭圆曲线生成元为 G G G,阶为 q q q。
- 2)密钥生成:预言机、Alice和Bob独立生成各自的私钥和公钥。
- 预言机的私钥为 z z z,公钥为 Z Z Z,满足关系 Z = z ⋅ G Z=z\cdot G Z=z⋅G;
- Alice的私钥为 x x x,公钥为 X X X,满足关系 X = x ⋅ G X=x\cdot G X=x⋅G;
- Bob的私钥为 y y y,公钥为 Y Y Y,满足关系 Y = y ⋅ G Y=y\cdot G Y=y⋅G。
- 3)注资交易: Alice和Bob一起创建一笔注资交易,各自将1BTC锁在一个2-of-2的多签输出(一个公钥 X X X属于Alice,一个公钥 Y Y Y属于Bob)。
- 4)合约执行交易:Alice和Bob创建两笔合约执行交易(Contract Execution Transaction, CET),用于花费注资交易。
预言机计算承诺
R : = k ⋅ G R:=k\cdot G R:=k⋅G
然后,计算 S S S和 S ′ S' S′
S : = R − h a s h ( O d d N u m b e r , R ) ⋅ Z , S ′ : = R − h a s h ( E v e n N u m b e r , R ) ⋅ Z S:=R-hash(OddNumber,R)\cdot Z,\\ S':=R-hash(EvenNumber,R)\cdot Z S:=R−hash(OddNumber,R)⋅Z,S′:=R−hash(EvenNumber,R)⋅Z
广播 ( R , S , S ′ ) (R,S,S') (R,S,S′)。
Alice和Bob各自计算对应的新公钥
P K A l i c e : = X + S , P K B o b : = Y + S ′ . PK^{Alice}:=X+ S,\\ PK^{Bob}:=Y+ S'. PKAlice:=X+S,PKBob:=Y+S′. - 5)结算:当第n+k个区块出现后,预言机根据该区块的哈希值,生成对应的 s s s或 s ′ s' s′。
- 如果第n+k个区块的哈希值为奇数,则预言机计算并广播 s s s
s : = k − h a s h ( O d d N u m b e r , R ) ⋅ z s:=k-hash(OddNumber,R)\cdot z s:=k−hash(OddNumber,R)⋅z - 如果第n+k个区块的哈希值为偶数,则预言机计算并广播 s ′ s' s′
s ′ : = k − h a s h ( E v e n N u m b e r , R ) ⋅ z s':=k-hash(EvenNumber,R)\cdot z s′:=k−hash(EvenNumber,R)⋅z
- 如果第n+k个区块的哈希值为奇数,则预言机计算并广播 s s s
- 6)提币:Alice或Bob其中一个参与方能根据预言机广播的 s s s或 s ′ s' s′,提取资产。
- 如果预言机广播 s s s,则Alice可以计算出新私钥 s k A l i c e sk^{Alice} skAlice,并提取锁定的2个BTC
s k A l i c e : = x + s . sk^{Alice}:= x + s. skAlice:=x+s. - 如果预言机广播 s ′ s' s′,则Bob可以计算出新私钥 s k B o b sk^{Bob} skBob,并提取锁定的2个BTC
s k B o b : = y + s ′ . sk^{Bob}:= y + s'. skBob:=y+s′.
- 如果预言机广播 s s s,则Alice可以计算出新私钥 s k A l i c e sk^{Alice} skAlice,并提取锁定的2个BTC
分析:
- Alice计算的新私钥 s k A l i c e sk^{Alice} skAlice与新公钥 P K A l i c e PK^{Alice} PKAlice满足离散对数关系
s k A l i c e ⋅ G = ( x + s ) ⋅ G = X + S = P K A l i c e sk^{Alice}\cdot G= (x+s)\cdot G=X+S=PK^{Alice} skAlice⋅G=(x+s)⋅G=X+S=PKAlice
该情况下,Alice提币会成功。 - 同理,Bob计算的新私钥 s k B o b sk^{Bob} skBob与新公钥 P K B o b PK^{Bob} PKBob满足离散对数关系
s k B o b ⋅ G = ( y + s ′ ) ⋅ G = Y + S ′ = P K B o b sk^{Bob}\cdot G= (y+s')\cdot G=Y+S'=PK^{Bob} skBob⋅G=(y+s′)⋅G=Y+S′=PKBob
该情况下,Bob提币会成功。
此外,如果预言机广播 s s s,对Alice有用,但是对Bob没用。因为,Bob无法用于计算出对应的新私钥 s k B o b sk^{Bob} skBob。同理,如果预言机广播 s ′ s' s′,对Bob有用,但是对Alice没用。因为,Alice无法用于计算出对应的新私钥 s k A l i c e sk^{Alice} skAlice。
最后,上述描述省略了时间锁。需要添加时间锁,使得一方计算出新私钥,在t时间内提币。否则,如果超出t时间,则另一方使用原私钥就能提走资产。
3. DLC优化
3.1 密钥管理
在DLC协议中,预言机的私钥和承诺的随机数至关重要。如果预言机的私钥和承诺的随机数泄露或丢失,则容易导致以下4种安全问题:
- (1)预言机丢失私钥 z z z
如果预言机丢失私钥,则DLC 无法结算,导致需要执行 DLC 退款合约。因此,DLC协议中设置了退款交易,以防止预言机丢失私钥。 - (2)预言机泄露私钥 z z z
如果预言机的私钥泄露,则所有基于该私钥的 DLC 都面临欺诈结算风险。窃取私钥的攻击者可以签署想要的任何消息,实现对未来所有合约结果的完全控制。此外,攻击者不仅限于发布单个签名消息,还可以发布冲突的消息,如同时签署第n+k个区块的哈希值为奇数和偶数。 - (3)预言机泄露或重用随机数 k k k
如果预言机泄露随机数 k k k,则在结算阶段,不管预言机广播 s s s或 s ′ s' s′,攻击者均可如下计算出预言机的私钥 z z z
z : = ( k − s ) / h a s h ( O d d N u m b e r , R ) z:=(k-s)/hash(OddNumber,R) z:=(k−s)/hash(OddNumber,R)
z : = ( k − s ′ ) / h a s h ( E v e n N u m b e r , R ) z:=(k-s')/hash(EvenNumber,R) z:=(k−s′)/hash(EvenNumber,R)
如果预言机重用随机数 k k k,则经过2次结算,攻击者可以根据预言机广播的签名,根据以下四种情况之一解方程组,求出预言机的私钥 z z z,
情况1:
s 1 = k − h a s h ( O d d N u m b e r 1 , R ) ⋅ z s_1=k-hash(OddNumber_1,R)\cdot z s1=k−hash(OddNumber1,R)⋅z
s 2 = k − h a s h ( O d d N u m b e r 2 , R ) ⋅ z s_2=k-hash(OddNumber_2,R)\cdot z s2=k−hash(OddNumber2,R)⋅z
情况2:
s 1 ′ = k − h a s h ( E v e n N u m b e r 1 , R ) ⋅ z s_1'=k-hash(EvenNumber_1,R)\cdot z s1′=k−hash(EvenNumber1,R)⋅z
s 2 ′ = k − h a s h ( E v e n N u m b e r 2 , R ) ⋅ z s_2'=k-hash(EvenNumber_2,R)\cdot z s2′=k−hash(EvenNumber2,R)⋅z
情况3:
s 1 = k − h a s h ( O d d N u m b e r 1 , R ) ⋅ z s_1=k-hash(OddNumber_1,R)\cdot z s1=k−hash(OddNumber1,R)⋅z
s 2 ′ = k − h a s h ( E v e n N u m b e r 2 , R ) ⋅ z s_2'=k-hash(EvenNumber_2,R)\cdot z s2′=k−hash(EvenNumber2,R)⋅z
情况4:
s 1 ′ = k − h a s h ( E v e n N u m b e r 1 , R ) ⋅ z s_1'=k-hash(EvenNumber_1,R)\cdot z s1′=k−hash(EvenNumber1,R)⋅z
s 2 = k − h a s h ( O d d N u m b e r 2 , R ) ⋅ z s_2=k-hash(OddNumber_2,R)\cdot z s2=k−hash(OddNumber2,R)⋅z - (4)预言机丢失随机数 k k k
如果预言机丢失随机数 k k k,则对应的DLC 无法结算,需要执行 DLC 退款合约。
因此,为提高预言机私钥的安全性,应使用BIP32派生出子秘钥或孙密钥,用于签名。此外,为提高随机数的安全性,应使用私钥和计数器的哈希值 k : = h a s h ( z , c o u n t e r ) k:=hash(z,counter) k:=hash(z,counter),作为随机数 k k k,以防随机数重复或丢失。
3.2 去中心化预言机
DLC中,预言机的作用至关重要,提供了决定合约结果的关键外部数据。为提高这些合约的安全性,则需要去中心化预言机。与中心化预言机不同,去中心化预言机将提供准确和防篡改数据的责任分散到多个独立节点上,可以减少依赖单一故障点的风险,并降低操纵或针对性攻击的可能性。通过去中心化预言机,DLC可以实现更高程度的无需信任和可靠性,确保合约执行完全依赖于预定条件的客观性。
Schnorr门限签名可以实现去中心化预言机。Schnorr门限签名具有以下优势:
- 1)增强安全性:通过分散密钥的管理,门限签名减少了单点故障的风险。即使部分参与方的密钥被泄露或受到攻击,只要不超过设定的阈值,整个系统仍然安全。
- 2)分布式控制:门限签名实现了对密钥管理的分布式控制,无单一实体掌握全部签名权力,从而降低了权力过于集中带来的风险。
- 3)提高可用性:只需达到一定数量的预言机节点同意即可完成签名,提高了系统的灵活性和可用性。即使部分节点不可用,也不会影响整体系统的可靠运行。
- 4)灵活性与可扩展性:门限签名协议可以根据需要设置不同的阈值,适应各种不同的安全需求和场景。此外,它也适用于大规模网络,具有良好的可扩展性。
- 5)可追责性:每个预言机节点基于私钥分片对消息生成签名分片,其他参与方均可使用对应的公钥分片验证该签名分片的正确性,实现追责。如果正确,则累加签名分片,生成完整签名。
因此,Schnorr门限签名协议在提高安全性、可靠性、灵活性、可扩展性和可追责性等的去中心化预言机中具有显著优势。
3.3 去中心化与密钥管理耦合
在密钥管理技术中,预言机拥有一个完整密钥 z z z,基于完整密钥 z z z和增量 ω \omega ω,使用BIP32,能够派出大量的子密钥 z + ω ( 1 ) z+{{\omega }^{(1)}} z+ω(1)和孙密钥 z + ω ( 1 ) + ω ( 2 ) z+{{\omega }^{(1)}}+{{\omega }^{(2)}} z+ω(1)+ω(2)。对于不同的事件,预言机能够使用不同的孙私钥 z + ω ( 1 ) + ω ( 2 ) z+{{\omega }^{(1)}}+{{\omega }^{(2)}} z+ω(1)+ω(2)对对应的事件 m s g msg msg生成对应的签名 σ \sigma σ。
在去中心化预言机应用场景下,有 n n n个参与方,需要 t + 1 t+1 t+1个参与方进行门限签名。其中, t < n t<n t<n。 n n n个预言机节点各自拥有一个私钥分片 z i , i = 1 , . . . , n {{z}_{i}},i=1,...,n zi,i=1,...,n。这 n n n个私钥分片 z i {{z}_{i}} zi对应一个完整私钥 z z z,但是完整私钥 z z z从始至终不出现。在完整私钥 z z z不出现的前提下, t + 1 t+1 t+1个预言机节点使用私钥分片 z i , i = 1 , . . . , t + 1 {{z}_{i}},i=1,...,t+1 zi,i=1,...,t+1对消息 m s g ′ msg' msg′生成签名分片 σ i ′ \sigma_i' σi′,签名分片 σ i ′ \sigma_i' σi′合并为完整的签名 σ ′ \sigma ' σ′。验证方使用完整公钥 Z Z Z能够校验消息签名对 ( m s g ′ , σ ′ ) (msg',\sigma ') (msg′,σ′)的正确性。由于需要 t + 1 t+1 t+1个预言机节点联合生成门限签名,所以具有较高的安全性。
但是,在去中心化预言机应用场景下,完整私钥 z z z不出现,无法直接使用BIP32进行密钥派生。换言之,预言机去中心化技术与密钥管理技术无法直接耦合。
论文Distributed Key Derivation for Multi-Party Management of Blockchain Digital Assets提出门限签名场景下的分布式密钥派生方法。该论文的核心思想是根据拉格朗日插值多项式,私钥分片 z i z_i zi与完整私钥 z z z满足如下插值关系
z i = ∑ j = 1 n f j ( i ) = z + ∑ j = 1 n a 0 , j + a 1 , j i + . . . + a t , j i t z_i = \sum\limits_{j = 1}^n {{f_j}(i)} =z+\sum\limits_{j = 1}^n {a_{0,j}+a_{1,j}i+...+a_{t,j}i^t} zi=j=1∑nfj(i)=z+j=1∑na0,j+a1,ji+...+at,jit
上式两边均加上增量 ω \omega ω,则得到以下等式
z i + ω = z + ω + ∑ j = 1 n a 0 , j + a 1 , j i + . . . + a t , j i t z_i +\omega =z+\omega +\sum\limits_{j = 1}^n {a_{0,j}+a_{1,j}i+...+a_{t,j}i^t} zi+ω=z+ω+j=1∑na0,j+a1,ji+...+at,jit
该等式表明:私钥分片 z i z_i zi加上增量 ω \omega ω,与完整私钥 z z z加上增量 ω \omega ω仍满足插值关系。换言之,子私钥分片 z i + ω z_i+\omega zi+ω与子密钥 z + ω z+\omega z+ω满足插值关系。因此,各个参与方能够使用私钥分片 z i z_i zi加上增量 ω \omega ω派生出子私钥分片 z i + ω z_i+\omega zi+ω,用于生成子签名分片,且使用对应的子公钥 Z + ω ⋅ G Z+\omega\cdot G Z+ω⋅G能够进行有效性验证。
但是,需要考虑增强型与非增强型BIP32。增强型BIP32以私钥、链码和路径为输入,计算SHA512,输出增量和子链码。而非增强型BIP32以公钥、链码和路径为输入,计算SHA512,输出增量和子链码。门限签名情况下,私钥不存在,所以只能使用非增强型BIP32。或使用同态哈希函数,则有增强型BIP32。但是,同态哈希函数与SHA512不同,与原BIP32不兼容。
3.4 OP-DLC:预言机信任最小化
DLC中,Alice和Bob之间的合约是根据预言机签名的结果来执行的,因此需在一定程度上信任预言机。所以,预言机的行为正确,是DLC运行的一大前提。
为预言机去信任化,已有研究根据n个预言机的结果执行DLC,减少对单个预言机的依赖。
- "n-of-n"模型表示使用n个预言机签订合约,并根据n个预言机的结果执行合约。该模型要求n个预言机均在线签名。如果有预言机离线或对结果有分歧,则影响DLC合约执行。信任假设为n个预言机均为诚实的。
- "k-of-n"模型表示使用n个预言机签订合约,根据其中k个预言机的结果执行合约。如果有超过k个预言机串谋,则影响合约的公正执行。此外,使用"k-of-n"模型时,需要准备的CET数量,是单个预言机或"n-of-n"模型的 C n k C_n^k Cnk倍。信任假设为n个预言机中至少有k个预言机是诚实的。
增加预言机数量,并没有实现对预言机的去信任化。因为当预言机作恶后,合约受损方没有链上申诉通道。
因此,本节提出OP-DLC,在DLC中引入乐观挑战机制。n个预言机在参与设置DLC之前,需提前质押构建permisssionless 链上OP游戏,承诺不作恶。如果有任何一个预言机作恶,则Alice或Bob或任何其它诚实预言机或其它第三方诚实观察者,均可发起挑战。如果挑战方赢得游戏,则链上惩罚作恶预言机,罚没其押金。此外,OP-DLC也可采用"k-of-n"模型来签名。其中,k值甚至可为1。因此,信任假设降为只要网络中有一个诚实的参与方就可发起OP挑战,惩罚作恶的预言机节点。
当根据Layer2计算结果,对OP-DLC结算时:
- 如果预言机使用错误的结果签名,使得Alice利益受损,则Alice可使用Layer2正确计算结果,对预言机提前质押的permisssionless 链上OP游戏发起挑战。Alice赢得游戏,惩罚作恶预言机,弥补损失;
- 同理,Bob、其它诚实预言机节点、第三方诚实观察者均可发起挑战。但是,为防止恶意挑战,挑战方也需要质押。
因此,OP-DLC使得预言机节点之间互相监督,使得预言机信任最小化。该机制仅需要一个诚实参与方,容错率99%,较好地解决了预言机串谋风险。
3.5 OP-DLC + BitVM双桥
当DLC用于跨链桥,DLC合约结算时需要进行资金分配:
- 需要通过CET预先设置。这意味着DLC的资金结算粒度是有限的,如Bison网络以0.1 BTC为粒度。存在问题:用户在Layer2的资产交互不应受限于DLC CET的资金粒度。
- 当Alice想要对其Layer2资产结算时,会强制将用户Bob的Layer2资产也结算到Layer1。存在问题:每个Layer2用户应可自由选择出入金,而不受其它用户出入金影响。
- Alice和Bob协商花费。存在问题:要求二者愿意配合。
因此,为解决上述问题,本节提出OP-DLC + BitVM双桥。该方案使得用户即可通过BitVM的permissionless bridge进行入金和出金,也可以通过 OP-DLC 机制入金和出金,实现任意粒度找零,且提高资金流动性。
在OP-DLC中,预言机为BitVM联盟,Alice为普通用户,Bob为BitVM联盟。在设置OP-DLC时,所构建的CET中,给用户Alice的output可在Layer1上立即花费,给Bob的output中构建一个“Alice能参与挑战的DLC游戏”并设置timelock锁定期。当Alice想要出金时:
- 如果BitVM联盟作为预言机,正确签名,则Alice可在Layer1取款。但是,Bob等待锁定期过后可在Layer1提款。
- 如果BitVM联盟作为预言机,作弊,导致Alice利益受损。但是,Alice可对Bob的UTXO发起挑战。如果挑战成功,则可罚没Bob的金额。注意:其它BitVM联盟成员之一也可发起挑战,但Alice利益受损,最有动机发起挑战。
- 如果BitVM联盟作为预言机,作弊,导致Bob利益受损。但是,BitVM联盟中的一个诚实成员可对“BitVM 游戏”发起挑战,惩罚作弊的预言机节点。
此外,当用户Alice想要从Layer2出金,但是OP-DLC合约内预设的CET没有匹配的金额,则Alice可选择以下方式:
- 通过BitVM出金,由BitVM operator在Layer1垫付。BitVM bridge假设为BitVM联盟中有一个诚实参与方。
- 通过OP-DLC中的某个CET出金,同时剩余的找零由BitVM operator在Layer1垫付。OP-DLC出金会关闭DLC通道,但DLC通道中剩余的资金会转向BitVM Layer1资金池,而不会强迫其他Layer2用户出金。OP-DLC bridge信任假设为通道内有一个诚实参与方。
- Alice和Bob协商花费,无需预言机参与,要求Bob配合。
因此,OP-DLC + BitVM双桥具有以下优势:
- 使用BitVM解决了DLC通道资金找零问题,降低CET的设置数量,且不受CET资金粒度影响;
- 将OP-DLC bridge和BitVM bridge结合,为用户提供多种出金入金通道,任意粒度找零;
- 将BitVM联盟设置为Bob和预言机,通过OP机制,使得预言机信任最小化;
- 将DLC通道的出金余量引入到BitVM bridge资金池,提升资金利用率。
4. 结论
DLC出现在Segwit v1(Taproot)激活之前,且已实现DLC通道与闪电网络的集成,并将DLC扩展为可在同一DLC通道内更新执行连续合约。借助Taproot和BitVM等技术,将可在DLC内实现更复杂的链下合约验证结算,同时结合OP挑战机制,实现预言机信任最小化。
参考文献
[1] Bitlayer团队博客 Bitlayer Core Technology: DLC and Its Optimization Considerations
相关文章:
DLC原理解析及其优化思考
1. 引言 Discreet Log Contract (DLC) 是由麻省理工学院的Tadge Dryja在2018年提出的一套基于预言机的合约执行方案。DLC 允许两方根据预定义的条件进行有条件付款。各方确定可能的结果并进行预签名,并在预言机签署结果时使用这些预签名来执行支付。 因此ÿ…...
tigramite教程(七)使用TIGRAMITE 进行条件独立性测试
文章目录 概述1 连续数值变量1.1 ParCorr 偏相关(ParCorr类)1.2 鲁棒偏相关(RobustParCorr)非线性检验1.3 GPDC1.4 CMIknn 2a. 分类/符号时间序列2b. 混合分类/连续时间序列多变量X和Y的测试 概述 这个表格概述了 X ⊥ Y ∣ Z X\…...
【DevOps工具篇】使用Ansible部署Keycloak oauth2proxy 和 单点登录(SSO)设置
【DevOps工具篇】使用Ansible部署Keycloak oauth2proxy 和 单点登录(SSO)设置 目录 【DevOps工具篇】使用Ansible部署Keycloak oauth2proxy 和 单点登录(SSO)设置Ansible 基础知识部署 Keycloak创建 OIDC-客户端创建 oauth2proxy 部署顶级 Ansible PlaybookHost.iniplayboo…...
鸿蒙OS开发实例:【应用状态变量共享】
平时在开发的过程中,我们会在应用中共享数据,在不同的页面间共享信息。虽然常用的共享信息,也可以通过不同页面中组件间信息共享的方式,但有时使用应用级别的状态管理会让开发工作变得简单。 根据不同的使用场景,ArkT…...
C#清空窗体的背景图片
目录 一、涉及到的知识点 1.设置窗体的背景图 2.加载窗体背景图 3.清空窗体的背景图 二、 示例 一、涉及到的知识点 1.设置窗体的背景图 详见本文作者的其他文章:C#手动改变自制窗体的大小-CSDN博客 https://wenchm.blog.csdn.net/article/details/137027140…...
Qt 实现的万能采集库( 屏幕/相机/扬声器/麦克风采集)
【写在前面】 之前应公司需要,给公司写过一整套直播的库( 推拉流,编解码),类似于 libobs。 结果后来因为没有相关项目,便停止开发&维护了。 不过里面很多有用的组件,然后也挺好用的,遂开源出来一部分。…...
将写好的打印机代码打包成jar包然后直接注册成windows服务,然后通过调用插件的接口地址将流传到接口实现解析并无需预览直接通过打印机直接打印PDF文件
实现文件流PDF不需要预览直接调用打印机打印实现方案就是,将写好的打印机代码打包成jar包然后直接注册成windows服务,然后通过调用插件的接口地址将流传到接口实现解析并无需预览直接通过打印机直接打印PDF文件。源码地址...
加密软件VMProtect教程:使用脚本-功能
VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic(本机)、Virtual Pascal和XCode编译器。 同时,VMProtect有一个内置的反汇编程序,可以与Windows和Mac OS X可执行文件一起…...
51单片机入门_江协科技_21.1_开发板USB口连接建议
1. 目前我自己用的普中A2版本的开发板,操作失误导致在开发板连接电脑并通电的情况下误将跳线帽触碰到开发板的3.3V与GND,导致USB口浪涌,2个电脑上面的USB口烧毁,开发板暂时没有任何问题,电脑USB口现在只是接通后有电&a…...
基于Spring Boot 3 + Spring Security6 + JWT + Redis实现登录、token身份认证
基于Spring Boot3实现Spring Security6 JWT Redis实现登录、token身份认证。 用户从数据库中获取。使用RESTFul风格的APi进行登录。使用JWT生成token。使用Redis进行登录过期判断。所有的工具类和数据结构在源码中都有。 系列文章指路👉 系列文章-基于SpringBoot3…...
Kubernetes(k8s):精通 Pod 操作的关键命令
Kubernetes(k8s):精通 Pod 操作的关键命令 1、查看 Pod 列表2、 查看 Pod 的详细信息3、创建 Pod4、删除 Pod5、获取 Pod 日志6、进入 Pod 执行命令7、暂停和启动 Pod8、改变 Pod 副本数量9、查看当前部署中使用的镜像版本10、滚动更新 Pod11…...
【随笔】Git 高级篇 -- 相对引用2(十三)
💌 所属专栏:【Git】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…...
xilinx AXI CAN驱动开发
CAN收发方案有很多,常见的解决方案通过是采用CAN收发芯片,例如最常用的SJA1000,xilinx直接将CAN协议栈用纯逻辑实现,AXI CAN是其中一种; 通过这种方式硬件上只需外接一个PHY芯片即可 上图加了一个电平转换芯片 软件设计方面&…...
Python:百度AI开放平台——OCR图像文字识别应用
一、注册百度AI开放平台 使用百度AI服务的步骤为: 注册:注册成为百度AI开放平台开发者;创建AI应用:在百度API开放平台上创建相关类型的的AI应用,获得AppID、API Key和Secret Key;调用API:调用…...
OpenEuler/Centos制作离线软件源
需求背景: 一般线上服务器都是不能连接外网,服务器安装好系统之后就需要部署相关软件,此时因为无法联网导致无法下载软件,所以都会做一个本地的离线软件源,本文简单介绍如何快速利用已经下载好的rpm包,制作…...
论文笔记:基于多粒度信息融合的社交媒体多模态假新闻检测
整理了ICMR2023 Multi-modal Fake News Detection on Social Media via Multi-grained Information Fusion)论文的阅读笔记 背景模型实验 背景 在假新闻检测领域,目前的方法主要集中在文本和视觉特征的集成上,但不能有效地利用细粒度和粗粒度…...
攻防世界 xff_referer 题目解析
xff_referer 一:了解xxf和Referer X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。 一般的客户端发送HTTP请求没有X-Forwarded-For头的࿰…...
open-cd框架调试记录
源于论文Changer: Feature Interaction Is What You Need forChange Detection 源码位置:open-cd/README.md at main likyoo/open-cd (github.com) 同样是基于MMSegmentation框架的代码,不符合本人编程习惯所以一直也没有研究这东西,近期打…...
【算法刷题day17】Leetcode:110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和
文章目录 Leetcode 110.平衡二叉树解题思路代码总结 Leetcode 257. 二叉树的所有路径解题思路代码总结 Leetcode 404.左叶子之和解题思路代码总结 草稿图网站 java的Deque Leetcode 110.平衡二叉树 题目:** 110.平衡二叉树** 解析:代码随想录解析 解题思…...
Linux云计算之Linux基础2——Linux发行版本的安装
目录 一、彻底删除VMware 二、VMware-17虚拟机安装 三、MobaXterm 安装 四、Centos 发行版 7.9的安装 五、rockys 9.1的安装 六、ubuntu2204的安装 一、彻底删除VMware 在卸载VMware虚拟机之前,要先把与VMware相关的服务和进程终止 1. 在windows中按下【Windo…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
数据库——redis
一、Redis 介绍 1. 概述 Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点: 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应 多数据结构支持&…...
