比特币开发指南815.docx

上传人:田海滨 文档编号:499931 上传时间:2025-07-29 格式:DOCX 页数:41 大小:79.77KB
下载 相关 举报
比特币开发指南815.docx_第1页
第1页 / 共41页
比特币开发指南815.docx_第2页
第2页 / 共41页
比特币开发指南815.docx_第3页
第3页 / 共41页
比特币开发指南815.docx_第4页
第4页 / 共41页
比特币开发指南815.docx_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、请求支付在请求支付之前,程序需要首先生成一个比特币蝇或者从其他程序,如BitcoinCore,获得一个地址。比特币地址的详细信息在交易一节中阐述,并且在该节中给出了为何要防止屡次使用同一个比特币地址的两个重要原因一一而第三个原因那么是与支付请求有关。每次收款时使用单独地址会使区分付款顾客身份变得更加繁琐。程序只需要追踪特定的的支付请求以及其中包含的地址,然后搜索区块链,查询匹配该地址的交易,即可确认身份。下一小节将详细介绍四种相互兼容的方法,用以向支付者提供支付地址和金额。出于便利性和兼容性考虑,推荐支持所述全部方法。1 .钱包程序允许用户在支付界面中粘贴或者手动输入地址和支付金额。当然,这种

2、方法并不方便,但提供了一种有效的退却选择。2 .几乎所有的桌面钱包都可以关联到bitcoin:g,支付者只需要点击链接即可直接进入支付界面,同时支付地址与金额已经预填完整。许多移动钱包也支持此项功能,但网页钱包根本不支持,除非通过安装浏览器扩展程序或者配置URI链接句柄。3 .大多数移动钱包支持扫描包含bitcoin:URIS编码信息的QR码,并且几乎所有的钱包程序都支持显示收款二维码。这同时也方便了在线订单,QR码对于当面交易十分有用。4 .近期的钱包更新增加了对一种新型支付协议的支持,该协议通过X.509证书认证收款者身份,提高了支付的平安性,并且引入了一些重要新特性如退款等。警告:需要特

3、别留神针对收款支付的盗窃行为。尤其要注意的是,私钥绝对不能储存在网络效劳器上,并且支付请求需要通过S或其他方法加密传输,防止中间人攻击替换收款地址。纯文本如果需要只通过复制粘贴手段就能确定支付数量,你需要提供地址、数量和单位。当然最好也包含一个有效时间,例如:(注:所有本节范例使用的均是三曲史L地址。)Pay:mjSklNy9spzU2fouzYgLqGUD8U4liR35QNAmount:100BTCYoumustpayby:2014-04-01at23:00UTC必须指定单位。在撰写本文时所有的流行比特币钱包程序默认显示单位均是bitcoins(BTC)或millibits(mBTC)o大

4、多数都支持选择BTC或mBTC之一作为显示单位,还有一些程序支持以下这些单位。BitcoinsUnit(Abbreviation)1.0bitcoin(BTC)0.01bitcent(cBTC)0.001Iiiillibit(mBTC)0.000001microbit(uBTC)0.00000001satoshi由于BTC和mBTC都被广泛接受,在以复制粘贴文本定义支付订单时,同时指定两种单位下的数额显得更加直观。例如:Pay:mjSklNy9spzU2fOuzYgLqGUD8U4liR35QNAmount:100BTC(100000mBTC)Youmustpayby:2014-04-01at

5、23:00UTCbitcoin:URI在BIP21中定义的bitcoin:URL方案消除了支付者在复制粘贴文本中可能出现的支付单位的混淆。同时也能通过支付订单向支付者提供额外的信息。举个例子:bitcoin:mjSklNy9spzU2fouzYgLqGUD8U4liR35QN7amount=100只有地址是必要的,如果只定义了地址,钱包会生成一个预填好收款地址的支付请求,需要支付者输入支付数量。支付数量总是以BTC的小数形式确定,对于整数数量的BTC(如上例),可以省略小数点。小数数量的BTC的数量开头的0可以省略;例如,下面例子中的ImBTC的请求均是有效的:bitcoin:mjSklNy9

6、spzU2fouzYgLqGUD8U4liR35QN7amount=001bitcoin:mjSklNy9spzU2fouzYgLqGUD8U41iR35QN?amount=0.001还有两个被广泛支持的参数label和messageolabel参数用来标识收款人名字,message参数通常被支付者用来描述支付请求。Label和message参数都被存储在支付者钱包程序中并不会被包含在真正的交易中,所以其他的比特币用户无法看到这两个参数信息。这两个参数必须通过URI编码。四个参数集合起来,通过URl编码,转行显示为如下形式。bitcoin:mjSklNy9spzU2fouzYgLqGUD8U4

7、1iR35QN7amount=0.10&label=Example+Merchant&message=Order+of+flowers%26+chocolates上述的URI可以编码成HTML格式,以兼容不支持URI链接的钱包程序,并且可以向支付者提供一个有效时间。0rderflowers&chocolateusingBitcoin(Pay0.10BTC100mBTCtomjSklNy9spzU2fouzYgLqGUD8U41iR35QNby2014-04-01at23:00UTC)上述代码生成链接如下:Orderflowers&ChoColateSUSingBitCoin(Pay0.10BT

8、C100mBTCtomjSk1Ny9spzU2fouzYgLqGD8U41iR35QNby2014-04-01at23:00TC)一些订单通过用Javascript显示倒计时来表示有效剩余支付时间。在后文中的支付协议一节中可以看到,URI方案可以通过新的可选和必要参数进行扩展。在撰写本文时,唯一被广泛接受的新参数是支付协议中的r参数。程序无论支持哪种形式的URIs链接,最终都需要通过提示由用户最终确认支付,除非用户明确地禁用了提示(可以用于小额支付)。QR码QR码可以用来交换bitcoin:URlS信息,广泛应用于当面交易、图像或影像中。大多数的移动钱包程序和局部桌面钱包程序都支持扫描QR码,

9、直接进入预填支付界面。以下图中的四张比特币QR码显示的是同一个bitcoin:URlS码,分别以四种不同的错误修正级别(显示在在二维码上方)编码生成的。QR码可以包含label和message参数,以及其他可选参数。在本例中为了压缩QR码的大小和保证较低素质的摄像头可以容易扫描成功,并未包含额外参数。QR码提供了四种不同错误修正等级:1.低:最多可修复7%的图像损失2 .中:最多可修复15%的图像损失,但QR码面积比低级修复等级图像大近8%o3 .四分位:最多可修复25%图像损失,但QR码面积比低级修复等级图像大近20%o4,高:最多可修复30%图像损失,但QR码面积比低级修复等级图像大近26

10、错误修正配合校检和(CheCkSUm)可以确保比特币QR码信息完整且不会被意外修改,因此你的程序需要针对不同的显示面积来选择适宜的错误修正等级。显示面积有限时低错误修正等级更加适用,而当具备高分辨率显示能力时四分位修正等级可以帮助实现快速扫码。支付协议比特币核心0.9版本支持新的支付协议。针对支付需求,新的支付协议添加了很多重要的功能。 支持X.509认证和SSL加密,以便能够对接收者的身份进行认证并阻止中间人的恶意攻击。 提供更多支付过程的细节 无需点对点网络,支付方可以直接付款给接收方。这将加快支付过程并为一些方案中的功能的实现做了铺垫,例如“子母交易(接受者可以使用尚未得到确认的款项

11、发起另外的交易)”、离线近场交易、蓝牙交易。在这个版本(x.509)中,支付者还可以付款给例如这样的通用名地址CommonName(CN),而不是付款给一串毫无意义的字符,如:umjSk1Ny9spz2fouzYgLqGUD8U41iR35QNw为了支付过程使用这个支付协议,你使用一个拓展但能够回溯兼容的URL地址,例如:bitcoin:mjSklNy9spzU2fOuzYgLqGUD8U41iR35QN?amount=0.10&Iabel=Example+Merchant&message=Order+of+flowers+%26+chocolates&r=:/example/pay.phpi

12、nvoice%3Dda39a3ee以上命令行当中,除了R命令行之外,均不是本支付协议所必须的。但在你的应用程序中可能包含了它们,以便使那些不支持本协议的钱包实现回溯兼容的功能。R命令会使支持本支付协议的钱包自动忽略其他的参数,只需要从URL地址取回支付命令就可以了。如果有特殊的需要(在此只做推荐而不做为强制要求也可以从效劳器上取回支付命令-从上取回命令会更好一些。浏览器、二维码扫描设备或者其他处理URL的程序可以翻开支付方在URL上的比特币钱包程序。如果钱包程序识别本支付协议,它将会进入R命令所指定的URL地址,R命令中提供一系列MlME格式的收付请求。资源:加文.安德森的“支付请求发生器(P

13、aymentRequestGenerator)”生成了在测试网络上运行的客户URL和支付请求。支付请求和支付细节“支付请求”由谷歌的ProtocolBuffers语言的数据结构所创立。BIP70通过非序列性方式(在支付请求的ProtocolBUffer代码中被定义)来表达数据结构,但以下文本文件中,它们会通过使用简单的或者说是更实用的PythonCGI程序以更多线性命令来呈现。(为了更加简洁清晰,许多正常的CGI最正确实践没有在该程序中使用)整个过程将被举例说明:起初,一个用户点击一个BITCOIN的URL地址或者扫描二维码。为了在脚本中使用protocolbuffer,你需要一个Protoc

14、olBuffer编译器(protoc),你可以直接从GOOGLE下载或者在大多数Linux软件包中找到它。谷歌之外的PrOtOCOlbuffer编译器也是可以用的,要看编程语言的类型。你也需要从比特币核心代码中获取一个“支付请求”的ProtocolBuffer描述。初始化代码从PrOtOCOlBUffer生成的PVthOn代码开始,我们着手开发简单的CGl程序!usrbinenvpython# #Thisistecodegeneratedbyprotoe-python_out=./paymentrequest.protofrompaymentrequest_pb2import*# #Loads

15、omefunctionsfromtimeimporttimefromsysimportstdoutfromOpenSSL.cryptoimportFILETYPE_PEM,load_privatekey,sign# #Copythreeoftheclassescreatedbyprotoeintoobjectswecanusedetails=PaymentDetails()request=PaymentRequest()x509=X509Certificates()上面的启动代码是相当简单的,仅需要UNlX系统的初相时间函数、标准输出的文件描述符、来自OpenSSLlibrary的一局部函数和

16、由PrOtOCOlBUffer生成的数据结构和函数。配置代码接下来,我们将设定配置设置,该设置通常只有在接受者想去做点不同的事情时发生改变。这段代码在!reQuestPavmentRecuest)和details(PaVmentDetaiIS)工程中植入一局部装置。当将其串行化时,PaymentDetaiIS将包含在PaVmerltReCUeSt.之内# #SSLSignaturemethodrequest.pki_type=nx509sha256#Default:none# #MainnetorTestnet?work=test#Default:main# #PostbackURLdetai

17、ls.payment_url=s:/example/pay.py# #PaymentDetailsversionnumberrequest.payment_details_version=1#Default:1# #Certificatechainx509.certificate.append(file(etcapache2/example-cert.der,r).read()# x509,certificate.append(file(/soae/intermediate/cert.derllrn).read()# #LoadprivateSSLkeyintomemoryforsigning

18、laterpriv_key=etcapache2/example-key.pempw=test#Keypasswordprivate_keyload_privatekey(FILETYPE_PEM,file(priv_keyrr).read(),pw)每一行被下面的命令所描述。request.pki_type=x509+sha256n#Default:nonePki_type:(可选)告诉接受者的钱包程序使用何种公钥架构对你的PaymentReelileSt进行力口密签名,以防止其被中间人发起的攻击所更改。如果你不想对PaVmemReeIUeSt进行签名,也可以选择Pki_typeofnone

19、thedefault语句)如果你要选择对PaVmemReaUeSt进行签名,当下有2中选择:x509+shal和x509+sha256,此2种均使用X.509认证系统,与S系统使用的一样;使用住何一种鎏金方式,你盍要被一个认证致翘或用而人之一签名的认沽,Ii给自己签名是无效的T;每个钱包程序可以选择相信信任哪一种认证效劳器,但最有可能的是选择其操作系统所信任的认证效劳器。如果钱包程序没有完整的操作系统,那么其可能是小型的硬件钱包,BIP70建议其使用Mozilla的根证书存储。总的来说,当你接入网络效劳的时候,你的浏览器认证在起作用,将为你的Paymentrequests提供帮助。work=

20、test#Default:mainnetwork:(可选)告知付费一方的钱包你正在使用什么样的比特币网络。BIP70将主网络(实际支付)标记“main”,而将测试网络(类似于主网络,但使用”假币“)标记为“test。如果钱包程序不用在你指定的网络上运行,它将拒绝PaymentRequestodetails.payment_url=ns:/example/pay.pynPaymerIJUrQ:(必要的)告知付费方的钱包程序将支付信息(PaymerItmi股也及稍后会讨论)发向何处。可以是静态URL,比方在例如中那样,也可以是动态URL,例如s:example/pay,py?invoice=123

21、它通常是一个S地址,以阻止第三方通过修改信息来发动攻击(man-in-the-middleattacks)orequest.payment_details_version=1#Default:1paymentdetailsversion:(可选)告知付费方的钱包程序PaVmentDetaiIS的版本信息。正如例如中,唯一的版本是版本1.#Thisisthepubkey/certificatecorrespondingtotheprivateSSLkey#thatwe,11usetosign:x509.certificate.append(file(etcapache2/example-cer

22、t.derr,r).read()x509certificates:(对PaymemReclUeStS进行签名所必须)你必须提供SSL公钥/能够对对应的SSL私匙(用来对PaVmemReCIUeSt进行签名)进行认证# #Ifthepubkey/certabovedidn11havethesignatureofaroot# #certificateauthorityfwedthenappendtheintermediatecertificate# #whichsignedit:# x509.certificate.append(file(,rsome/intermediate/cert.derf

23、r),read()你必须提供任何必要的中介认证(man-inthe-middleattacks),使你的认证与付费方信任的认证效劳器的根认证相连。例如Mozilla的根证书存储。认证必须以清晰具体的命令提供一相同的命令被使用在阿帕奇(APaChe)的SSLCertifiHteFile指令和其他效劳软件中。下面的数字显示了认证的证书链和每个认证(根认证除外)将会如何被下载到X509证书的血3buffer的信息中。具体而言,第一个应提供的认证必须是X509认证(对应用来签名的SSL私匙),称之为leaf认证(IeafCertifiCate)任何的中介认证(intermediateCertifiCa

24、teS)必须将被签名的SSL公钥与根认证(CA证书)相连,每一个中介认证被分开连接,每一个DER格式的认证包含了在任意路径上追随根认证的认证签名。priv_key=etcapache2/example-key.pempw=ntestn#Keypasswordprivate_key=load_privatekey(F工LETYPE_PEM,file(priv_key,r).read(),PW)(为PaymentRequests签名所必须)在你的SSL数据库支持格式中(DER格式不是必须的),你需要一个SSL私匙。在程序中,我们从一个PEM文件下载它。(在你的CGl代码中嵌入你的密码,像这里一样,

25、无疑是个坏主意)SSL私匙不会应你的要求被发送在这,我们仅仅下载它进入内存,为了能够使用它给request签名。代码变量现在让我们看看变量,你的CGl程序为每笔支付而设置。# #Amountoftherequest# #P2PKHpubkeyhashpubkey_hash=,2bl4950b8d31620c6cc923c5408a701blec0a020,# #P2PKHoutputscriptenteredashexand.convertedtobinary# OP_DUPOP_HASH160OP_EQUALVERIFYOP_CHECKSIG# 76a91488achex_script=76

26、a9+14n+pubkey_hash+88+acserialized_script=hex_script.decode(,fhex)# #LoadamountandscriptintoPaymentDetaiIsdetails.outputs.add(amount=amount,script=serialized_script)# #Memotodisplaytothespenderdetails.memo=nFlowers&chocolates# #Datawhichshouldbereturnedtoyouwiththepaymentdetails.merchant_data=nInv

27、oice#123”每一行代码的意义如下描述amount=10000000#Insatoshis(=100mBTC)am。Lmt:(可选)你希望付费方支付的数量。你可能从你的购物车程序或者BTC兑换汇率转换工具的命令中给出指令。如果你不指定该数量,钱包程序将提示付费方默认的支付数量(这点在募捐中是有用的)PUbkey_hash=2bl4950b8d31620c6cc923c5408a701blec0a020# OP_DUPOP_HASH160OP_EQUALVERIFYOP_CHECKSIG# 76a91488achex_script=76+,a9n+14+pubkey_hash+88+acse

28、rialized_script=hex_script.decode(hex)script:(必须的)你必须指定你要付费方支付的输出脚本任何有效的脚本都是可以的。在例如中,我们要求的脚本是P2PKH输出脚本。首先我们得到一个公钥HASH,这个HASH就是通常使用在本段文字URL例如中的那个比特币地址的HASH:mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN.接下来,我们把这个HASH使用16进制,转换成标准的P2PKH输出脚本,如代码注释所示。最后,我们将输出脚本从16进制转换成为序列化格式。details.outputs.add(amount=amount,script=

29、serialized_script)OUtPUtS:(必要的)将输出脚本和数量(可选)添加到PaymemDetaiIS输出数组中。指定多组脚本(multiplescripts)和数量(scripts)并将其作为合并退避策略的一局部,是可以做到的。随后将来“合并退避条款但叵侬Avoidance)”中进行描述。details.memo=nFlowers&chocolates三e间:(可选)增加一个向付费者展示的备忘录(使用UTF-8纯文本,内嵌HTML或者其他MARKUP的将不会被处理。details.merchant_data=nInvoice#123merchanJCIata:(可选)当款项被

30、支付后,添加任意数据,这些数据会被返回给接受者。你能使用这些数据追踪你的款项,尽管你可以通过生成一个唯一地址来追踪你的每一笔支付。memo和nerchantdata可以使任意字节长,但是如果太长,也许整个PaVmentReCllJeSt会受至U50000个字节的限制,其中也包括通常是几个KB的用于保存证书链的容量。在后面的小节中将提到,运恒经常在支付后被付费方用于组成密码收据的一局部。衍生数据接下来,让我们看看你的CGI程序可以自动衍生出来的一些信息# #Requestcreationtime# #请求创立的时间details.time=int(time()#Currentepoch(Unix

31、)time# #Requestexpirationtime# #请求到期的时间details.expires=int(time()+60*10#10minutesfromnow# #PaymentDetailsiscomplete;serializeitandstoreitinPaymentRequest# #支付细节是完整的;序列化支付细节并存在PaymentRequest对象中request.serialized_payment_details=details.SerializeToString()# #Serializedcertificatechain# #序列化验证链request.

32、pki_data=x509.SerializeToString()# #InitializesignaturefieldsowecansignthefullPaymentReqUeSt# #初始化签名,以便我们能会整个PaYmentReqUeSt对象签名request.signature=n# #SignPaymentRequest# #对FaymentReqUeSt对象签名request.signature=sign(private_key,request.SerializeToString(),sha256)下面对各行进行详细的解释details.time=int(time()#Curre

33、ntepoch(Unix)timeTime:(必须)PaymentRequests必须指明他们是什么时候被创立的,用距离1970-01-01T00:00UTC的秒数表示details.expires=int(time()+60*10#10minutesfromnowexpires:(可选)PaymentReqUeSt也可以设定一个失效时间,当过了这个之间之后这些PaymentRequest就不在可用。你很可能想让接收者能够设定失效时间;在此我们使用了一个我们认为比拟合理的选择,十分钟。如果这个请求绑定在一个基于法币比照特聪(faktosatoshis)的汇率上,那么你可能希望以你获取汇率时的对

34、冲值作为依据;request.serialized_payment_details=details.SerializeToString()serialized_payment_detaiIs:(必须)到现在为止,我们已经完成了创立PyamentDetaiIs的所有设置,所以我们使用SeriaIizeToString函数,把PaymentDetaiIs从比特币协议的缓冲码(protocolbuffercode)映射成PaymentRequest的适宜的属性。request.pki_data=x509.SerializeToString()pki_data:(签名的PaymentRequests所

35、必须)序列化验证链的PKI数据并把这些数据存在PaymentRequest中。request.signature我们已经填写了出了签名之外的PaymentRequest所有的属性,但是,在我们给他签名之前,我们必须赋值给signature属性一个空的占位符来完成初始化。request.signature=sign(private_keyzrequest.SerializeToString(),sha256)SignatUre:(签名的PaymentReqUeStS必须)现在我们使用完整的序列化的PaymentRequest,内存中配置区的私钥和pkijype指定的哈希公式(在这个例子中使用的s

36、ha256)创立签名。输出代码既然我们已经添加了PaymentRequest的所有属性,我们现在可以对其序列化并且通过头发送它,例如下面的代码:PrintnContent-Type:application/bitcoin-paymentrequestPrintnContent-Transfer-Encoding:binaryprint(必须)BIP71定义了PaymentRequests,PaymentsPaymentACKs的内容类型file.write(stdout,request.SerializeToString()rquest:(必须)现在,我们输出序列化过的PaymentReqUe

37、St(其中包含序列化过的PaymentDetails)。序列化之后的数据是二进制的,所以我们不能使用Python的print函数,因为它会添加很多无关的行。下面的截屏显示了在BitcoinCore0.9中GUI程序是怎样创立一个经过验证的PaymentDetaiIs的。支付如果消费者拒绝支付,钱包程序不会再给接收者的效劳器发送任何信息,除非消费者有点击了其他的指定那位接收者效劳器的URL如果消费者确定支付,钱包程序会至少创立一个交易事务用来支付PaymentDetaiIs区的每个付款项(outputs).钱包程序可能会播送这个交易事务,BitcoinCore0.9会这样做,但是这不是必须的。无

38、论钱包程序是否播送交易事务,它都会给PaymentRequest一个回复信息,这个回复信息被称为Payment。Payment包含四个属性。 merchant_data:(可选)一份PaymentDetaiIs的merchant_data属性的拷贝。 transactions必须)支付到PaymentDetaiIs中的输出(OUtPUtS)的个或者多个签名过的交易事务。 refund_to:(必须)接受者可以发送局部或者全部的refund的一个或者多个输出脚本。 memo:(可选)发送给接收者的一个UTF-8编码的文本备忘录。不能包含HTML或者其他的标记。消费者不应该假定接受者肯定会阅读他们

39、的备忘录文本。Payment会通过PaymentDetaiIs中提供的payment_url来发送。止匕url应该是一个s地址以防止传输过程中有人发动攻击,篡改消费者的refundjo输出脚本。发送Payment的时候,钱包程序必须设置以下头:Content-Type:application/bitcoin-paymentAccept:application/bitcoin-paymentackPaymentACK支付确认接收者在payment_url的CGI程序会接收支付信息并且将其用比特币协议的缓冲码(PrOtOColBuffersCode)解码。交易事务(transactions)会被检

40、查接收者请求的输出脚本(OUtPUtSCriPtS)是否已经被支付了,是否已经被播送到了网络中(除非网络中已经存在了)。如果必要的话,CGI程序会检查merchant_data参数,并且发送一个包含以下头的PaymentACK确认。Content-Type:application/bitcoin-paymentackContent-Transfer-Encoding:binary然后发送另一个使用比特币协议缓冲码(PrOtOCol-BUfferS-encoded)编码的包含一个或者两个属性的信息. Payment:(必须)这是一个正在被确认的支付信息的完整拷贝(以序列化的形式)。 memo:(

41、可选)一个使用UTF-8编码的文本备忘录,用来提醒消费者他们支付款项的状态。此备忘录不应该包含HTML或者其他标记。接收者不应该假定消费者会阅读这些备忘录。PaymentACK确认并不意味着支付完成了,它仅仅意味着支付是正常的。支付在支付事务被区块链确认后,整个支付才真正的完成。但是,消费者的钱包程序应该展示给消费者,支付正在处理中,以便消费者能把注意力转移到其他地方。收据与PaymentRequestjPaymentDetaiIsjPayment以及PaymentAeK不同,并没有一个专门的收据对象(receiptobject)o但是,我们可以从签名的PaymentDetaiIs和一个或者多

42、个已经确认的交易事务中,推算出一个密码学上可证实的收据。一个签过名的PaymentDetaiIs指明了需要支付到的输出脚本(OUtPUtscripts)(script),需要支付多少(amount),以及时间(expires)。比特币区块链指明了这些输出(OUtPUtS)是否支付了要求数目的比特币,并且能够提供一个交易创立的大概时间。有了这些信息,我们就可以验证是否消费者使用了接受者私有的SSLkey支付了比特币给接收者。翻译第11局部VerifyingPayment验证付款AsexplainedintheTranSaCtiOnSandBlOCkChainsections,broadcasti

43、natransactiontothenetworkdoesn,tensurethatthereceivergetspaid.Amaliciousspendercancreateonetransactionthatpaysthereceiverandasecondonethatpaysthesameinputbacktohimself.Onlyoneofthesetransactionswillbeaddedtotheblockchain,andnobodycansayforsurewhichoneitwillbe.正如在TranSaetionS和BlOCkChain局部解释的一样,向比特币网络

44、中播送一个比特币交易,并不能保证接收者一定得到支付。一个恶意的黑客在创立一个支付接收者的交易的同时.,同时创立一个支付给自己的交易。这两个交易记录只有一个会被添加到区块链中,没有人能确定哪一个会。Twoormoretransactionsspendingthesameinputarecommonlyreferredtoasadoublespend.两个或多个交易响应了同一个请求,通常被称为再次支付。Oncethetransactionisincludedinablock,doublespendsareimpossiblewithoutmodifyingblockChainhistorytore

45、placethetransaction,whichisquitedifficult.Usingthissystem,theBitcoinprotocolcangiveeachofyourtransactionsanupdatingconfidencescorebasedonthenumberofblockswhichwouldneedtobemodifiedtoreplaceatransaction.Foreachblock,thetransactiongainsoneCOnfirmatiOrLSincemodifyingblocksisquitedifficult,higherCOnfirm

46、ationscoresindicategreaterprotection.一旦一笔交易记录被添加到区块链中,再次支付是不可能的。除非通过修改区块链历史记录替代交易记录,这是非常困难的。通过系统机制,比特币协议可以给每笔交易一个可以更新的基于数据块数量的信任度得分。当需要替换一个交易时,数据块数量需要被更改。对于每一个数据块,交易获得一次确认。因为修改数据块数量是非常困难的,更多确实认次数说明更高的平安性。0COnfirmatiOns:Thetransactionhasbeenbroadcastbutisstillnotincludedinavblock.Zeroconfirmationtransactions(UCConfirmedtransactions)shouldgenerallynotbetrustedwithoutriskanalysis.AlthoughminersusuallyConfirmthefirsttransactiontheyreceive,fraudstersmaybeabletomanipulatethenetworkintoincludingtheirversionofatransaction.0次确认:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机应用/办公自动化

宁ICP备18001539号-1