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…...
C++:赋值运算符(17)
赋值也就是将后面的值赋值给变量,这里最常用的就是 ,a1那么a就是1,此外还包含以下的赋值运算 等于int a 1; a10 a10加等于int a 1; a1;a2-减等于int a 1; a-1;a0*乘等于int a 2; a*5;a10/除等于int a 10; a/2;a5%模等于int a 10; a%…...
Spring Boot | Spring Boot的“数据访问“、Spring Boot“整合MyBatis“
目录: 一、Spring Boot”数据访问概述“二、Spring Boot”整合MyBatis”1. 基础环境搭建 (引入对应的“依赖启动器” 配置数据库的“相关参数”)① 数据准备 (导入Sql文件)② 创建项目,引入相应的启动器,编写数据库对应的“实体类”③额外添加pom.xml文…...
ActiViz中的数据集vtkPolyData
文章目录 前言一、数据结构二、数据内容三、几何操作四、数据导入与导出五、数据可视化六、函数详解1、SetPoints(vtkPoints points):2、SetPolys(vtkCellArray polys):3、GetNumberOfPoints():4、GetNumberOfCells():5、GetPointData():6、GetCellData():7、Ge...
【测试篇】测试用例
文章目录 前言具体设计测试用例等价类边界值场景设计法判定表(因果图)正交排列(用的非常少)错误猜测法 前言 什么是测试用例?? 测试用例是针对软件系统或应用程序的特定功能或场景编写的一组步骤…...
Shell学习 - 2.24 Shell let命令:对整数进行数学运算
let 命令和双小括号 (( )) 的用法是类似的,它们都是用来对整数进行运算,读者已经学习了《Shell (())》,再学习 let 命令就相当简单了。 注意:和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数…...
langchain Chroma 构建本地向量数据库
langchain Chroma 构建本地向量数据库 # import from langchain_community.document_loaders import TextLoader from langchain_community.embeddings.sentence_transformer import (SentenceTransformerEmbeddings, ) from langchain_community.embeddings import HuggingFa…...
Rust 中的字符串类型:`str` 和 `String`
Rust 中的字符串类型:&str 和 String 文章目录 Rust 中的字符串类型:&str 和 String1. &str:不可变的字符串引用2. String:可变的字符串3、字符串使用综合案例代码执行结果 在 Rust 编程语言中,有两种主要…...
Visual Studio(VS) 搭建 QT 开发环境
Visual Studio(VS) 搭建 QT 开发环境 在当今的软件开发领域,Visual Studio(VS)是一款备受欢迎的集成开发环境(IDE),而 QT 则是一个强大的跨平台应用程序框架。将两者结合使用,可以为开发人员提供高效、便捷的开发体验。本文将详细介绍如何在 VS2022 中搭建 QT 开发环…...
Qt模拟面试(超硬核)
1. 请简要介绍一下你的 Qt 开发经验。 建议:诚实地描述你的 Qt 经验,包括你使用过的 Qt 版本、开发过的项目类型、遇到的挑战以及如何解决它们。 假如你没有开发经验,可以提供一些关于 Qt 开发的一般信息和常见的经验分享。 Qt 是一个跨平…...
某眼实时票房接口获取
某眼实时票房接口获取 前言解决方案1.找到veri.js2.找到signKey所在位置3.分析它所处的这个函数的内容4.index参数的获取5.signKey参数的获取运行结果关键代码另一种思路票房接口:https://piaofang.maoyan.com/dashboard-ajax https://piaofang.maoyan.com/dashboard 实时票房…...
北京天海网站建设公司/百家号关键词排名
作者程苓峰,互联网观察者和参与者。现任腾讯网科技中心总监,主要经历有:四川人,留学3年,经济学学士,管理学硕士;干过杂志主 笔、门户主编、社交网站产品经理;发起开放博客联盟&#…...
北京好一点的微网站开发公司/手机上可以创建网站吗
作用:持有对象 由于程序运行时才会根据某些条件去创建对象。数组也可以持有对象,但是由于长度固定受限严重,所以Java提供了一套完整的容器类来解决这个问题。最基本类型List、Set、Map、Queue。简单容器分布图(详见thinking in Ja…...
定制开发电商网站建设多少钱/手机百度高级搜索入口在哪里
目录 文章目录目录RSS 多队列网卡RSS 技术实现原理RSS FilterRSS HASH硬中断信号绑定ethtool 操作指令RSS 多队列网卡 在以往,一张 NIC 只具有一个 Rx Queue,对应一个 CPU Core 来进行收包处理。在多核时代,为了充分利用 Multi-CPU Cores&am…...
seo管理系统易语言/应用宝aso优化
2019独角兽企业重金招聘Python工程师标准>>> Apache服务器80端口被占用——解决方法 80端口被占用解决办法有两种: 1.关闭占用80端口的程序,这时Apache服务器会正常启动; 2.修改Apache的端口,比如改为8081;…...
济南做企业网站公司/治疗腰椎间盘突出的特效药
最近在做应用的时候,遇到了需要选择图片上传头像的需求。本着代码搬运工的精神,在网上浏览了一圈,发现解决办法都大致如下:Intent intentFromGallery new Intent();intentFromGallery.setType("image"); // 设置文件类…...
南昌网站建设方案/网站 软件
论文地址:https://www.rose-hulman.edu/class/se/csse461/handouts/Day37/nister_d_146.pdf 摘要 我们展示了一个系统可以评估运动的一个立体头或者一个移动相机基于视频输入。这个系统运行在实时低时延以及运动评估使用航行目的。前端系统是一个特征跟踪器。点特征…...