比特币开发指南815.docx
《比特币开发指南815.docx》由会员分享,可在线阅读,更多相关《比特币开发指南815.docx(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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 比特 开发 指南 815
