1. 引言

Matthew Green和Ian Miers 发表于2017年论文《Bolt: Anonymous Payment Channels for Decentralized Currencies》。

相关代码实现见:

  • https://github.com/boltlabs-inc/libzkchannels

使用payment channel进行链下支付的典型方案有:

  • Lightning Network:Joseph Poon 和 Thaddeus Dryja 2016年论文 The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments
  • Duplex Micropayment Channels:Christian Decker 和 Roger Wattenhofer 2015年论文 A fast and scalable payment network with Bitcoin duplex micropayment channels

无需将每笔交易提交到链上,channel在2方初始建立a shared deposit时会使用链,然后2方可直接进行支付——调整该deposit中相应的ownership shares,仅 在需要关闭channel 或 存在争议需要解决 时,才会再与链上通讯。

若2方之间无直接的payment channel,可通过中间peer路由实现支付。

payment channel的最大优势在于,可在无需引入可信第三方和中心化机制的情况下,大幅减少链上的交易存储空间。

尽管payment channel可解决扩容问题,但是存在一些隐私弱点:尽管交易发生在链下,任何人都可获知 the pseudonymous identities and initial (resp. final) channel balances of the
participants。更严重的是,对于交易对手方,payment channel可提供的隐私保护有限。
更严重的是,通过建立channel来为Tor bandwidth 或 web content 付费,用户可含蓄地将该channel的每笔交易 关联 到其通过该channel的其他所有支付信息。

Bolt(Blind Off-chain Lightweight Transactions)中,包含了一系列技术,用于构建privacy-preserving unlinkable payment channels for a decentralized currency。本文提出了三种实现方式:【将通道内双方的角色分别称为customer客户 和 merchant供货商。】

  • 1)单向支付通道:在单向支付通道中,客户向供货商付款,不会暴露客户身份信息,供货商也无法关联该通道内的其他交易。
  • 2)双向支付通道:在双向支付通道中,客户与供货商之间可相互付款。支持exchange任意正负值,适于 需提供退款功能 或 交易发起方不是支付收款人 等场景。
  • 3)间接通道:将双向支付通道 扩展为 支持第三方支付,引入不可信中介扮演“bridge”角色,使得未连接的双方可进行价值交换。中介无法知道交易中各方的身份,也无法知道交易的金额。可将MMM方之间的通道数由O(M2)O(M^2)O(M2) reduce为 O(M)O(M)O(M)。

链的作用主要为:

  • 验证published transactions
  • 根据public rules解决争端

1.1 payment channel背景知识

  • 开通channel时,双方需对channel内各自的balance share达成一致,分别表示为非负整数B0merchB_0^{merch}B0merch​ 和 B0custB_0^{cust}B0cust​。通过向链上发起一笔支付交易来建立channel。
    若交易结构正确,链上会将提交的金额存入escrow中。
  • 然后,customer可发起向merchant的链下支付。
    对于某正数或负数支付金额ϵi\epsilon_iϵi​,第iii笔支付可看成是a request to update Bicust=Bi−1cust−ϵiB_{i}^{cust}=B_{i-1}^{cust}-\epsilon_iBicust​=Bi−1cust​−ϵi​ 和 Bimerch=Bi−1merch+ϵiB_{i}^{merch}=B_{i-1}^{merch}+\epsilon_iBimerch​=Bi−1merch​+ϵi​,同时限制Bimerch≥0B_i^{merch}\geq 0Bimerch​≥0 以及 Bicust≥0B_i^{cust}\geq 0Bicust​≥0。
  • 任何时间,任何一方或双方都可申请关闭通道——通过向链上提交channel closure message。
    若closure message中表明双方对channel的当前state未达成共识,则链上会运行dispute resolution算法来决定最终的channel balances。
    设置一个足够的delay期限,使得每一方都有机会贡献其closure message。各方可使用链上支付交易将channel中的final share balance恢复到各自的账号内。

任何payment channel必须满足2个条件:

  • universal arbitration通用仲裁:若双方对channel的share state未达成共识,链上可在无需任何private信息的请看看下进行争端仲裁。
  • succinctness:为了使支付可扩展,提交到链上的信息必须是紧凑的,即,不应与channel balance、交易数量、以及交换的金额 等呈线性关系。

payment channel的隐私性:

  • 1)payment channel的隐私性不是绝对的。双方都知悉channel的建立或关闭,也必须知道channel的初始和最终value。
  • 2)channel的一方,假设为customer,必须负责发起支付,从而知道该channel的当前balance以及历史支付记录。
  • 3)隐私性主要体现在:当收到一笔来自某merchant的支付时,merchant仅知道在该open channel中发生了一笔有效的支付(正值或负值)。链仅知道具有某balance的channel已开启或关闭。【延伸为对中介路由来说也适用,中介路由仅知道在openchannel中2个用户之间发生了一笔有效的交易。】

1.2 构建隐私支付通道总览

本文提出了2种构建隐私支付通道的方案:

  • 1)基于e-cash方案,实现在单向支付通道中,构建由customer到merchant的固定金额的succinct 支付。保留了传统支付通道的功能和隐私性。
  • 2)引入了更复杂的abort condition,实现双向支付通道内任意金额(可为正值或负值)的支付。可支持path payment,用户可通过untrusted 中介实现隐私支付。

1.2.1 e-cash的单向支付通道

e-cash scheme中有一个名为bank的可信第三方,bank会issue one-time tokens(又名coins),customer可一次性赎回这些one-time tokens。

merchant承担bank的角色,会issue a “wallet” of anonymous coins to the customer,customer可spend这些coins back to the merchant。
关闭channel时,customer会将剩余的coins发给自己,然后向链上提供相应的证据。merchant可通过提交双花证明来抗议customer的statement。

以上方案存在如下弱点:

  • 1)最明显的,不是succinct的,关闭过程中customer需要提交其所有unspent coins。-》借助compact e-cash[CHL05]机制可解决。本文将关闭通道的开销reduce为a single fixed-size message。增加了merchant 和 customer 链下的沟通开销。
  • 2)存在时差:只有customer的资金在链上托管了,merchant才能为该customer issue a wallet。整个过程需要数分钟到数小时。与此同时,当merchant issue wallet失败 或 终止wallet激活 时,要确保customer可将其资金拿回。
  • 3)应可避免customer "framing"攻击(此时merchant为其自身issue coins,然后指控是customer双花了),协议应具有排他性,即在链上应可区分是cheating customer真的双花了,还是merchant创建了错误的双花。

1.2.2 双向支付通道

单向支付通道限制了:所有支付仅能由customer 到 merchant。

因此,基于现有(non-anonymous)支付通道 + 盲签名和zkProofs,来实现双向隐私支付通道。

关键点在于:
防止dishonest customer在通道关闭时使用老版本的refund token。

为此,在每次支付时,customer都需要给merchant一个revocation token for the previous state。如果customer表现honest,则该revocation token将永远不会关联channel 或 任何previous transactions。
一旦customer misbehave——将过期的refund token提交上链,则merchant可立即监测到该情况,将该revocation token提交到链上作为customer恶行的证明,链上会将该channel的balance都奖励给merchant。

1.2.3 由直接支付 到 第三方支付

基于双向支付通道可构建第三方支付。A 通过 untrusted中介I 向 B 支付。
本文的主要优势在于,中介I 无法将交易关联到用户,也不知道特定交易包含的金额。即使I compromised,其也无法claim any transactions passing through it。

1.2.4 Aborts

对于单项支付通道,当通道关闭时,最终channel balances将公开。customer和merchant之间的支付为non-interactive的,为完全匿名的。

对于双向支付通道,在执行过程中终止时,merchant可让customer处于无法再发起支付交易的状态,这无法阻止merchant向链上求助来关闭通道,但需要考虑2方面的隐私:

  • 1)merchant可通过人为终止来驱逐他人,以减少anonymity set。
  • 2)merchant可关联用户与a repeating sequence of transactions,通过aborting the user in the middle of the sequence。

对于传统商业设置,abort的后果可很小:无论是何种支付机制,若供货商无法提供合适的商品,customer可终止交易。对于微支付场景,应考虑abort的情况。customer应扫描链上未成熟的关闭,若customer的open channels数低于其最小anonymity set,则abort该channel。

2. 相关定义

2.1 匿名支付通道 APC

APC(Anonymous Payment Channel)匿名支付通道为2方基于某链(支付网络,该支付网络应可conditionally escrowing funds and binding these transactions funds to some data,如记录Bitcoin链上)构建的链下支付通道。

APC中包含了一组probabilistic算法:

  • KeyGenKeyGenKeyGen
  • InitCInit_{\mathcal{C}}InitC​
  • InitMInit_{\mathcal{M}}InitM​
  • RefundRefundRefund
  • RefuteRefuteRefute
  • ResolveResolveResolve

以及2个交互协议:

  • Establish
  • Pay

实例化匿名支付通道的流程为:

  • 1)merchant M\mathcal{M}M生成一组长期有效的keypair (pkM,skM)←KeyGen(pp)(pk_{\mathcal{M}}, sk_{\mathcal{M}})\leftarrow KeyGen(pp)(pkM​,skM​)←KeyGen(pp),并将该身份告知所有customers。
    merchant将其初始状态设置为 S←Ø\mathbf{S}\leftarrow \text{\O}S←Ø。
  • 2)customer C\mathcal{C}C 会生成一次性keypair (pkC,skC)(pk_{\mathcal{C}}, sk_{\mathcal{C}})(pkC​,skC​),用于某single channel。
  • 3)customer和merchant对各自的initial channel balances B0cust,B0merchB_0^{cust}, B_0^{merch}B0cust​,B0merch​达成共识。
  • 4)customer和merchant对达成共识的initial channel balances 各自执行InitPInit_{\mathcal{P}}InitP​算法,分别派生出channel token TC,TMT_{\mathcal{C}}, T_{\mathcal{M}}TC​,TM​。
  • 5)customer和merchant将各自的channel token以交易的形式提交到链上,以托管合适的金额。
  • 6)一旦资金被verifiably escrowed,customer和merchant双方运行Establish协议来激活支付通道。若双方不认可the initial channel balances,则协议返回⊥\perp⊥,且可关闭通道。
  • 7)若通道激活成功,customer可发起Pay协议任意多次,直到一方 或 双方关闭该通道。
  • 8)若customer想要关闭通道,可执行RefundRefundRefund算法,将结果channel closure message rcCrc_{\mathcal{C}}rcC​ 与channel identifier 一起提交到链上。
  • 9)merchant基于customer的closure message rcCrc_{\mathcal{C}}rcC​,运行RefuteRefuteRefute算法,来获得merchant closure message rcMrc_{\mathcal{M}}rcM​。
  • 10)链上执行ResolveResolveResolve算法来决定final channel balance,使得每方可获得已托管资金的确定份额。

2.2 APC的正确性和安全性

APC的正确性是指:若整个过程中都是是正确且honest执行的,则每次运行Pay协议都是成功的,且最终的RefuteRefuteRefute输出可反应正确的final channel balance。

APC的安全性主要体现在:

  • 1)Payment anonymity:支付匿名性是指,即使merchant与一组malicious customers一起串通,也无法知悉某customer的spending pattern。
  • 2)Balance:分为merchant的balance 和 customer的balance。是指若honest执行ResolveResolveResolve算法,任何adversary无法获取多于其应得份额的资金。

3. APC的技术要点

APC中涉及的技术要点有:

  • 1)Commitment scheme:本文使用基于DLP的Pedersen commitment scheme。
  • 2)对称加密scheme 和 one-time 对称加密scheme:要求可提供IND-CPA(Ciphertext indistinguishability)安全性。
  • 3)伪随机函数PRF:在构建单向匿名支付通道时,需要PRF提供efficient proofs of knowledge。PRF除具有标准的伪随机属性之外,还应具有strong pre-image resistance属性,即找到不同的(s′,x′)(s',x')(s′,x′)使得Fs(x)=Fs′(x′)F_s(x)=F_{s'}(x')Fs​(x)=Fs′​(x′)成立的概率可忽略。本文推荐使用Dodis-Yampolskiy PRF,有fs(x)=g1/(s+x)f_s(x)=g^{1/{(s+x)}}fs​(x)=g1/(s+x)。
  • 4)签名机制:具有的特征为:1)a protocol for a user to obtain a signature on the value(s) in a commitment without the signer learning anything about the message(s);2)a protocol for (non-interactively) proving knowledge of knowledge of a signature。具体可使用基于Strong RSA假设的[CL02] 或 基于blinear groups的[BCKL08, CL04]。安全性上,这些签名机制应满足existential unforgeability under chosen message attack (EU-CMA)。
  • 5)Non-Interactive Zero-Knowledge Proofs:如用于证明:1)a proof of knowledge of a committed value;2)a proof that a committed value is in a range。

4. APC协议

本文实际实现了3种APC协议:

  • 1)基于e-cash技术的单向匿名支付通道:仅支持固定金额。
  • 2)双向匿名支付通道:支持任意金额,支持abort。
  • 3)通过中介的第三方匿名支付通道。

4.1 单向匿名支付通道

主要对[CHL05]中的compact e-cash技术进行改进实现的高效、succinct单向匿名支付通道。

4.1.1 compact e-cash

在compact e-cash scheme中,customer withdraw a fixed-size wallet capable of generating BBB coins。customer的wallet基于tuple (k,sk,B)(k,sk, B)(k,sk,B),其中:

  • kkk为(interactively generated)seed for伪随机函数FFF
  • sksksk为customer的私钥。
  • BBB为wallet中的coins数量。

customer的wallet一经merchant签名,即可用于生成最多BBB coins:
第ithi^{th}ith coin包含了tuple (s,T,π)(s,T,\pi)(s,T,π),其中:

  • sss为“serial number”,计算方法为s=Fk(i)s=F_k(i)s=Fk​(i)。
  • TTT为“double spend tag”,计算方式为,若某一coin被双花,则该结合该double spend tag来reveal customer的key pkpkpk(或sksksk)。
  • π\piπ为non-interactive zero-knowledge proof of the following statements:
    • 1)0<i≤B0<i\leq B0<i≤B
    • 2)Prover知道sksksk
    • 3)Prover具有wallet (k,sk,B)(k,sk,B)(k,sk,B)的签名
    • 4)pair (s,T)(s,T)(s,T)为correctly structured with respect to the signed wallet。

整个构建过程,可保证Verifier可立即发现双花,因为2笔交易使用相同的serial number sss。
结合double-spend tags,Verifier可恢复spender的public key。
与此同时,各个coin spends无法与 用户或其他coin spends 进行关联。

基于compact e-cash构建的单向支付通道,merchant承担bank角色,会为customer issue a wallet of BBB coins,customer可将其匿名地 spend back to the merchant。
在关闭通道时,customer可简单滴spends any unused coins “to herself”,从而向merchant证明其没有该通道的spending capability(若后续再尝试spend这些coins,merchant可将其看作是双花行为)。
但是compact e-cash提供了succinct wallet,但是未能在关闭通道时提供succinct protocol。因为customer无法在不影响wallet中之前花费coin隐私性的情况下,简单地公开wallet secrets。因此,需要一种机制来succinctly reveal only a fraction of the coins in a wallet,而无需reveal all the coins。与此同时,还希望避免复杂的证明。

本文的方案为:merchant会存储必要的信息来验证通道关闭,因此需要对[CHL05]中的compact e-cash scheme进行改进。
具体为:


其中的EstablishPay协议为:

4.2 双向支付通道

4.1节的单向支付通道,存在如下缺陷:

  • 1)仅支持由customer向merchant发起支付
  • 2)仅支持fixed-value coins

因此需要构建双向支付通道,支持:

  • compact closure
  • compact wallet
  • a single run of the Pay protocol to transfer arbitrary values (受限于最大支付金额)

双向支付通道的customer wallet 与 单向支付通道的customer wallet 结构类似,包含了:

  • B0custB_0^{cust}B0cust​
  • a random wallet public signature key wpkwpkwpk

当merchant为wallet的内容提供盲签名后,该wallet被激活。

Signed wallets are obtained as in the previous protocol, with a commitment being placed in the anchor transaction and signing happening once the transaction is confirmed.

不同于之前协议中使用a series of individual coins来支付ϵ\epsilonϵ,此处,customer和merchant简单地将现有价值为BcustB^{cust}Bcust的signed wallet 交换为 价值Bcust−ϵB^{cust}-\epsilonBcust−ϵ的新signed wallet(对应有a fresh wallet public key wpknewwpk_{new}wpknew​)。此时的ϵ\epsilonϵ可为正值,也可为负值。
customer采用zero knowledge proof和签名来证明 the contents of the new requested wallet are constructed properly,该新wallet的balance与之前的balance之差为ϵ\epsilonϵ,且(Bcust−ϵ)≥0(B^{cust}-\epsilon)\geq 0(Bcust−ϵ)≥0。
与此同时,customer需要公开wpkoldwpk_{old}wpkold​,以此向merchant保证该wallet不会双花。old wallet将由customer使用相应的私钥wskwskwsk进行“revoked” message签名来使其失效。
关闭通道时,customer需要向链上提供由merchant签名的valid wallet。

构建过程中的调整在于:使现有wallet失效的同时,签名一个新的wallet。若merchant在old wallet失效之前签名了新wallet,则customer可retain the funds in the old wallet while continuing to use the new one。若merchant在签名新wallet之前使old wallet失效,若merchant拒绝签名新的wallet,则customer没有办法来关闭通道。

为此,需要通过interactive payments,区分在关闭通道时提供的value,采用2个子阶段协议来获取每组值。不公开最新的wallet www,customer使用包含了BcustB^{cust}Bcust、当前wallet公钥 以及 merchant签名 的 refund token rtrtrt来关闭通道,
即,将Pay协议分为2个阶段:

  • 1)第一阶段:customer获取来自于merchant对refund token的盲签名。
  • 2)第二阶段:customer使老钱包失效,然后merchant签名新钱包。若merchant拒绝签名新钱包,则customer可使用rtrtrt来安全地关闭通道。

双向支付通道整个构建过程为:


其中双向支付通道中的EstablishPay协议为:

双向支付通道的一个主要限制在于:

  • malicious merchant可abort the protocol。但是,该协议本身可保证,当abort发生时,customer的资金不会遭受损失,因为customer可简单地向链上提供其refund token rtw′rt_{w'}rtw′​来恢复其balance。
  • customer的匿名信。merchant可将customer置于无法继续spend,只能关闭通道的状态,从而可link the payment to the channel。不过,若通道使用匿名currency,则该影响可很有限。
  • malicious merchant可利用abort来减少系统的anonymity set,使得多个channel进入无法正常工作的状态。实际上,这种攻击可在链上生成visible signal,使得customer可终止其支付。

4.3 双向第三方支付通道

若A与中介I开通了双向支付通道,B与中介I开通了双向支付通道,则A可通过中介I向B进行支付。

双向第三方支付通道的主要挑战在于支付的原子性,即:
一旦中介I向接收方B付款,则A才向中介I付款。这将给中介I带来风险,若A无法完成整个支付。同时,若中介disonest,也会给A带来风险。

回忆下4.2节双向支付通道Pay协议的2个阶段:

  • 1)交换refund tokens来reclaim escrowed funds。
  • 2)为后续支付生成匿名钱包。

为了保证chained transaction A→I→BA\rightarrow I\rightarrow BA→I→B 的安全,要求这2个环节中的第一阶段为原子式成功或失败。

为此,需要给refund tokens增加条件,这些条件为simple statements for the network to evaluate on examining a token during the Resolve protocol。
特别地,为了避免接收方BBB claiming funds form III if 付款方AAA has not delivered a corresponding payment to III,为此,需要给BBB的refund token引入如下条件:

  • 1)BBB必须为AAA的previous wallet生成a revocation message(即a signature using AAA的wskwskwsk)。可保证,一旦BBB force a payment on I→BI\rightarrow BI→B,由于III具有相应的revocation token,A→IA\rightarrow IA→I无法被reverse。
  • 2)AAA未向链上提交包含wskwskwsk的revocation token。若A→IA\rightarrow IA→I已被reverse,因为wpkwpkwpk已在链上,则BBB无法force the payment on I→BI\rightarrow BI→B。

4.3.1 隐藏支付金额

在第三方支付通道中,由于III作为积极参与者,并不维护channel的状态,III也无需知道支付的金额。只要A,BA,BA,B对支付金额ϵ\epsilonϵ达成共识(即双方在各自的channel中有足够的金额),任何一方都无法向III透露ϵ\epsilonϵ。III仅确信the balance of funds is conserved。

为了隐藏支付金额,需要将图3 Pay协议中构建π2\pi_2π2​的proof statement进行修改:
不再向merchant公开ϵ\epsilonϵ,customer需对ϵ\epsilonϵ进行commit,然后在支付中将该值作为secret input。同时,也要调整协议中BBB的wallet,BBB需要证明其wallet已调整了−ϵ-\epsilon−ϵ。
整个π2\pi_2π2​调整为:

然后AAA向III证明that the two payments cancel or (if feefeefee is non-zero),leave BBB with feefeefee extra funds via a proof:

第三方支付通道整个流程为:

第三方支付通道中的Pay协议为:

第三方支付通道的主要挑战在于:
malicious III可选择性地在交易中终止协议,从而迫使AAA和BBB向链上提交交易以恢复其资金。可link该payment到A,BA,BA,B的channel。这种问题,在交互式协议中,很难从根本上避免。

可在通道中冲入匿名currency,以尽可能地减少匿名信的威胁。关联2个不同的channel并不会泄露参与者的身份。最重要地是,由于中介仅可在每个通道使用一次abort技术,merchant无法关联同一通道内的不同支付。最后,执行abort的中介会在链上产生公开记录,使得参与者可回避该malicious中介。

4.4 隐藏支付balance

以上三种创建方式,当通道关闭时,存在channel balance将会被公开的隐私问题。
While individuals can protect their identities and initial channel balances by using an anonymous currency mechanism to fund channels, the information about channel balances leaks useful information to the network.

注意,对于不存在争议的通道关闭流程,可按如下方式隐藏信息:

  • 通道关闭时,customer向链上提交a commitment to the final channel balance,以及 a zero-knowledge proof that she possesses a valid channel closure token(即,为a signature on the channel balance in our bidirectional construction)。

在类似Zerocash [SCG+14]的系统中,the final payment redeeming coins to the merchant and customer can be modified to include an additional statement: the amounts paid in this transaction are consistent with the commitment, and do not exceed the initial funding transaction that created the channel.【本文未来将进一步研究】

Bolt: Anonymous Payment Channels for Decentralized Currencies 学习笔记相关推荐

  1. Vector Commitment Techniques and Applications to Verifiable Decentralized Storage学习笔记

    1. 引言 Campanelli等人 2020年论文<Vector Commitment Techniques and Applications to Verifiable Decentrali ...

  2. 《Go语言圣经》学习笔记 第八章 Groroutines和Channels

    <Go语言圣经>学习笔记 第八章 Groroutines和Channels 目录 Goroutines 实例:并发的Clock服务 实例:并发的Echo服务 Channels 并发的循环 ...

  3. 联邦学习笔记—《Communication-Efficient Learning of Deep Networks from Decentralized Data》

    摘要: Modern mobile devices have access to a wealth of data suitable for learning models, which in tur ...

  4. BOLT.NET 学习笔记(一) 开篇 用.net winform 快速开发 炫酷的界面

    BOLT.NET 学习笔记(一) 开篇 用.net winform 快速开发 炫酷的界面 bolt 基本介绍 Bolt界面引擎是迅雷公司从2009年开始开发的第四代界面库.迅雷7是首个采用该引擎成功开 ...

  5. Sprites: Payment Channels that Go Faster than Lightning(精灵:比闪电还快的支付渠道) 阅读笔记

    Sprites: Payment Channels that Go Faster than Lightning(精灵:比闪电还快的支付渠道) 阅读笔记 论文发表信息: FC-2019 论文关键点摘录: ...

  6. Spring源码学习笔记:经典设计模式之策略模式

    1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 0.策略模式(Strategy pattern) 指定义了算法家族,分别封装起来,让它们之间可以互相替换,此模 ...

  7. MySQL 索引学习笔记

    MySQL 索引学习笔记 索引基本概念 索引优点 B-Tree 索引 基本原理 使用场景 使用限制 哈希索引 基本原理 使用限制 自适应哈希索引 处理哈希冲突 相关面试题 高性能索引策略 独立的列 前 ...

  8. amazeui学习笔记--css(常用组件6)--图标Icon

    amazeui学习笔记--css(常用组件6)--图标Icon 一.总结 1.关注用法即可:在 HTML 上添加添加 am-icon-{图标名称} class. <span class=&quo ...

  9. Programming Entity Framework-dbContext 学习笔记第五章

    ### Programming Entity Framework-dbContext 学习笔记 第五章 将图表添加到Context中的方式及容易出现的错误 方法 结果 警告 Add Root 图标中的 ...

  10. opencv学习笔记(二):基于肤色的人手检测

    opencv学习笔记(二):基于肤色的人手检测 原文:http://blog.csdn.net/wzmsltw/article/details/50849810 先写了人手的检测程序,下一步基于检测程 ...

最新文章

  1. android广告平台刷量,数据显示:Android平台广告营收首超iOS
  2. 高清电影如何加载字幕【解决】
  3. python爬虫之路自学教程_python 爬虫学习之路
  4. jquery --- DOM操作、表单元素的初始化
  5. 利用异步I/O复制文件及详解
  6. png?wxfrom=5wx_lazy=1
  7. 启动失败java.lang_关于jeesite启动失败的问题java.lang.UnsupportedClassVersionError
  8. html完全自学手册,完全自学手册PHP+Ajax(PPT) 第3章 HTML基础.ppt
  9. iphone图片编辑画笔_iPhone手机怎么编辑图片?还不知道的话真的要了解一波了~...
  10. 在BUF和BUF+1、BUF+2单元分别放有一个无符号字节型数,编程序将其中最大数存入MAX单元,并在屏幕上显示
  11. 声纹识别demo_语音识别、声纹识别的区别及测试
  12. 过了所有技术面,却倒在 HR 一个问题上
  13. 在单端输入应用中连接差分放大器
  14. JAVA版聊天室小软件
  15. MuseScore入门教程(三、添加声部)
  16. 微信小程序如何接入微信支付
  17. 静态库与动态库之间的区别
  18. SAS:字符串常用函数简介
  19. 使用moment计算两个日期的相差天数
  20. jsp+ssm计算机毕业设计宠物狗领养网站【附源码】

热门文章

  1. EMV规范(五)——脱机数据认证
  2. SGE上的qsub以及作业的状态查看
  3. Excel催化剂开源第35波-图片压缩及自动旋转等处理
  4. for循环后面的分号
  5. php怎么获得今天的日期,PHP怎么获取今天、昨天、明天的日期-php教程
  6. SpringBoot常用标签的理解
  7. Entry name *.xml collided终极解决方案
  8. Ospf Forwarding address路由选路的影响
  9. pcf8591简明教程 及 51单片机最大只能读到127问题解决
  10. NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis