比特币改进方案

区块链技术巴比特2017-11-25 06:45:25  阅读 -评论 0

作者: Gavin Andresen <gavinandresen@gmail.com>

译者:骨髓行走

比特币改进方案

摘要:

这个比特币改进方案(Bitcoin improvement proposal 以下简称BIP)描述了一种在商人和顾客之间的交流协议,该协议使得顾客获得更好的购物体验,并且在支付环节能够更有效的防范中间人的攻击(man-in-the-middle attack)。

改进动机:

现行的比特币支付协议的运作情况如下:

1.顾客添加商品到在线购物车,并决定以比特币进行支付

2.卖家产生一个独特的支付地址,并附上顾客订单,要求顾客支付。

3.顾客从卖家网页上粘贴比特币地址并把它粘贴到任意正在使用的钱包。

4.顾客对发送的卖家地址的支付进行授权,并通过P2P网络向全网广播。

5.卖家服务器检测到该支付,并且待到足够的交易确认形成后承认该支付。

本比特币改进方案(BIP)对上述支付协议进行了延伸,使其得以支持一些新的功能。

1.新增人可读的,安全的支付地址—–顾客进行支付的地址不再是一个无法理解的34个字母的比特币地址,而是一个类似“website.com”的地址

2.添加一个支付安全性证明,使得顾客能在和商家发生纠纷时使用这一证明。

3.抵挡中间人攻击的方法是,在交易由硬件钱包授权之前,替换卖家和攻击者的比特币地址。

4.增加支付被接受的消息,那样的话顾客可以瞬间知道卖家收到了支付,并对其支付进行了处理或正在处理

5.增加退款地址,该地址由买家钱包软件自动发送给卖家,因此出现退款或者订单因为某些原因没有成立的情况时,卖家不用联系顾客了。

改进协议

这个比特币改进方案描述了一种使用Google’s Protocol Buffers编码的支付协议消息,已验证使用X.509 certificates(译者注:可能是一种专业名词),并在http/https.上得以实现。之后的比特币改进方案也许会将此支付协议延伸到其他编码,PKI系统或传输协议上。

该支付协议由3条消息组成:支付请求,支付,以及支付PaymentACK(译者注:可能又是一种专业名词)。起初,顾客显示出其准备支付的意愿,卖家的服务器以一条支付请求的消息作为回应,流程图如下(译者:红字是笔者标注的,用以说明的更清楚,如有意见,欢迎在评论区指正)

比特币改进方案

改进协议中的消息

输出:

输出被用在支付请求的消息中以说明一笔支付(或部分支付)应该送到哪里去。它们也被用在支付消息中,以说明一笔退款应该送到哪里。

Message Output{

Optional unit64 amount = 1 [default = 0]

Optional bytes script = 2}

上述代码的解释:

Amount是支付1聪(即0.00000001 BTC

Script:一个“TxOut”Script代表着支付该送到哪里。这将是标准比特币交易Scripts中的一个。该项是可选的,使得日后对这个协议进行扩展。

支付细节/支付请求消息

支付请求被分成2个消息,用以支持日后的扩展。信息集合被装在支付细节消息中。而支付细节又被裹在支付请求消息中,支付请求消息包含了关于卖家和数字签名的元信息。

Message paymentDetails{

Optional string network = 1[default = “main”]

Repeated Output outputs = 2

Required unit 64 time = 3

Optional unit64 expires = 4

Optional string memo = 5

Optional string payment_url = 6

Optional bytes merchant_data = 7

}

代码解释:

Network:无论是在产品比特币网络中的主要支付,还是在测试性网络中的支付测试。如果一个客户端收到来自该客户端不支持的网络的支付请求,客户端会加以拒绝。

Outputs:在比特币送到的地方会有一个或多个输出。如果总Output为0,顾客会被问及支付量是多少,并且比特币客户端会选择任何或者所有的Outputs用以支付。如果Output不为0,那么顾客将支付应有的支付量,且支付应在那些不为0的Output中被分开。

Time:Unix数字时间戳将会在支付请求创建时产生。

Expires:Unix数字时间戳在支付请求被认为无效时会被产生。

Memo:一种会展示给顾客看的UTF-8编码,纯文本记录。用以解释该支付请求是干什么的。

Payment-url:在一个支付消息发送出去获得一个支付ACK消息时产生。任意数据都可能被卖家使用来验证交易请求消息。当卖家不需要时,该条可以忽略之。

Merchant-data:卖家不需要把支付消息和支付请求消息连接起来,或者如果他们将每个支付请求与一个单独的支付地址连接起来。

一个支付请求中支付细节消息是可选则附在卖家的验证信息中的。代码如下

Message PaymententRequest {

Optional unit32 payment_details_version=1 [default =1]

Optional string pki_type =2 [default= “none”]

Optional bytes pki_date =3

Required bytes serialized_payment_details =4

Optional bytes signatuire = 5;

}

Payment-details version:下文会对更新升级进行讨论

Pki-type:公钥基础设施(pki)用以验证卖家身份。所有的执行过程应该支持“none”,”x509+sha256”和”x509+shal”。

Pki data:Pki系统的数据,用以验证卖家身份,能被用来创造一个数字签名。

serialized_payment_details:一种序列化的支付细节消息。

Signature:是一种0字节的数组,在数量较多的订单中以序列化形式存在,在PKI data中使用公钥。

当比特币钱包程序收到支付请求消息时,必须做下面几件事来保证授权支付:

1.验证卖家的身份且签名使用PKI系统,当pki_type的值不为空时。

2.验证顾客系统上的时间早于支付细节消息的有效期。若不如此,那么支付请求被拒绝。

3.显示卖家的身份并询问买家是否想提交支付请求。

支付请求消息大于50,000字节的,应该被钱包软件拒绝,以此来减轻拒绝服务的攻击(denial-of-service)

支付:

支付消息会在买家授权支付后发出

授权支付代码:

Message Payment {

Optional bytes merchant_date =1 ;

Repeated bytes transactions =2;

Repeated Output refund_to =3;

Optional string memo =4;

}

Merchant_data:从PaymentDetails.merchant_data. 复制而来。卖家会使用发票上的数字或者任何其他他们需要的数据来将支付和支付请求消息进行匹配。恶意的客户端会对卖家数据进行修改,所以卖家数据应该以某种方式进行授权。

Transactions:那些全额支付给交易请求消息的交易。

Refund_to:如果必要,在卖家归还退款时会有一个或多个输出

Memo:UTF-8编码,纯文本记录,从买家到卖家之间产生。

若买家授权支付,那么比特币客户端会:

1.创造并签署一个或多个交易来买足PaymentDetails.outputs这个参数

2.将交易在全网进行广播

3.如果PaymentDetails.payment_url 被指定,将会有一个支付消息附在那个URL上。支付消息是序列化的,并作为POST请求的主体被发送。

那些和payment_url服务器进行交换数据所产生的错误将报告给买家。

PaymentDetails.payment_url应该安全可靠能防范中间者攻击

钱包软件通过HTTP协议发送支付消息,这一行为应该有正确的内容格式和适合的抬头格式,正如BIP 71中定义的那样:

Content-type: application/bitcoin-payment

Accept:application/bitcoin-paymentcheck

当卖家服务器收到支付消息时,它必须决定交易是否满足了支付条件。当且仅当此时,交易记录才会向全网进行广播。

PaymentACK:

这个paymentACK消息是支付协议里的最后一环。它从卖家服务器发出,送到买家比特币钱包,以此对支付消息作出响应:

Message paymentACK {

Required Payment payment = 1;

Optional string memo =2

}

Payment:支付消息的复制版,用以激活paymentACK消息。如果客户端实施了某种其他的方式将支付消息和这个ACK消息连接起来,上述激活步骤则被忽略。

Memo:UTF-8编码记录,用以显示买家的交易状态(例如:支付一个比特币来购买十一个衣架的交易正在处理中)

定位:

那些支持多语言的卖家应该产生针对不同语言的支付请求消息,将请求和语言连接,或者在merchant_data. 中嵌入一个语言标签。他们也应该产生一个针对不同语言的ACK消息,且基于原生消息之上。

例如:一个说希腊语的买家浏览者希腊语版本的卖家网站,点击了一个”Αγορά τώρα” 链接,这产生了一个支付请求,并且其中merchant_data应该被设置为”lang=el&basketId=11252″.买家进行支付,他们的比特币客户端发送一个支付消息,卖家网站以ACK消息进行回应,用希腊语表示为:”σας ευχαριστούμε”.

证书:

默认的PKI系统使用X.509证书。当 pki_type是 ”x509+sha256″或”x509+sha1″时,pki_data的格式就变成了一个“协议–缓冲——编码”式的证书链:

Message X509Certificates {

Repeated bytes certificate = 1;

}

若pki_type是”x509+sha256″,那么支付消息会使用SHA256算法进行加密。如果pki_type 是”x509+sha1″,那么SHA1算法会被使用。

证书包含着实体的公钥,电子化的对支付请求消息进行签名将是第一个证书。随后也许会有很多附加的证书,每一个次级证书用以验证前一个证书,一直寻找到一个可信的根授权。接受者必须通过[RFC5280]验证证书链,并且当任何验证失败出现时加以拒绝。

受信任的根证书将从操作系统中获得:如果验证在一个没有操作系统的设备上完成,那么我推荐 Mozilla root store(译者:也许是一种完善根授权的办法)

扩展性:

协议缓冲序列格式在设计之时就定位于可扩展的目的。在一些特别的,新的,可选的领域中,可以加上一条信息,或者是被以往的实施行为给忽略。

交易细节消息也许会扩展一些新的可选的功能,并且仍被视作“初代版本”。旧的实施行为将能对支付请求消息中包含新领域的部分进行验证签名,但是将不能显示是什么新东西被加入到这个消息中。

如果在未来的某个时点,卖家产生支付请求的消息只被新的实施行为所接收,他们可以通过拒绝新的2代版本的支付细节消息来达到上述目的。旧的实施行为应该让用户知道他们应该更新软件了,这通过发送一条更高版本的支付细节消息而被知晓。

那些需要在一些特殊方面延伸消息方案的实施计划应该以1000为起始使用标签,并应该在维基页面:https://en.bitcoin.it/wiki/Payment_Request上更新,以防和其他扩展相冲突

参考文献(略)

译者比特币地址  1H3hKU3LAm7Mqg66RuC5f5R2xxJibjygaQ

声明:链世界登载此文仅出于分享区块链知识,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。此文如侵犯到您的合法权益,请联系我们100@7234.cn

    参与讨论 (0 人参与讨论)

    相关推荐

    区块链投资趋势报告:巨头入场布局行业趋于成熟

    区块链投资趋势报告:巨头入场布局行业趋于成熟

    来自:https://mp.weixin.qq.com/s?__biz=MzI4NzIxOTY1NA==&amp;mid=2650632639&amp;idx=1&amp;sn=e6d1c29731d992a80410aaee82ec3ea6&amp;chksm=f3d8db16c4af520097e4a64a71b1d4743ac326b9f027

    重新发明货币

    重新发明货币

    一、货币的演化过程 先简单回顾一下人类货币的演化过程,大概有以下阶段: a. 1.0版本:自然货币(贝壳、牲口、金银……) 这个阶段,货币基于一般等价物的稀有性或者实用性,货币不可能出现人为操纵的超发。 b. 2.0版本:早期纸币、银票到本位纸币 当贸易量越来越大,实物货币太不方便了,而且大家发现其实并不在意货币本身有什么价值,在意的只是这么多的货币能不能交换到足够的物品,于是纸币这种信用货

    从比特币交易看欧洲央行虚拟货币分类

    从比特币交易看欧洲央行虚拟货币分类

      互联网对传统社会的颠覆从未停止,在其完成对信息流、商流、物流、资金流的初步改造之后,或将以虚拟货币的形式打破现有货币体系   4月18日,在中国极客张沈鹏创办的比特币交易平台(42BTC.com)上,比特币对人民币的平均交易价为576元。当天,该平台完成了100个比特币的交易量。仅仅过去一周,4月25日上午,比特币对人民币的平均交易价已达到906元。据42BTC网站统计:在过去的32个月

    欧洲央行-比特币报告

    3.1 比特币 3.1.1 基本特征          比特币可能是最成功的,也可能是最有争议的虚拟货币方案,由日本程序员中本聪(译者注:事实上,中本聪是不是日本人,甚至是不是单个人无从考证)在2009年设计并实现。该计划基于一个类似于BitTorrent的P2P网络。BitTorrent是互联网上著名的共享文件协议,应用在电影,游戏和音乐领域。比特币在全球层面上运作,可用于各类货币交易(虚

    彻底玩转比特币地址和私匙

    彻底玩转比特币地址和私匙

    比特币地址和私匙是所有比特币初学者面对的一大难题,再加上那一串超长的字符串,让人更是摸不到头脑。 现在编者以问答的形式,带你一步步的揭开比特币地址和私匙的面纱。 还不知道什么是比特币地址和私匙的同学请点这里 问题一、比特币钱包由什么组成? 答 我们知道,比特币地址和私匙组成了比特币钱包,而私匙则决定了比特币地址上比特币的归属。 地址和私匙 问题二、如果只记得私匙我们还能还原比特币地址么? 答

    用GO语言实现比特币算法

    用GO语言实现比特币算法

    本节的这个例子展示一点点高精度数学包math/big、一点点散列包hash、一点点加密包crypto,还有一点点测试包testing的知识。这里不介绍bitcoin协议和算法——尽管它们很有趣,而是试图指出,Go对多种操作系统的支持,是实现这种跨平台应用的理想语言。 位钱(bitcoin)是一种使用加密手段制作的分布式电子货币。它最初于1998年由Wei Dai提出,并由中本聪(Satoshi

    详解比特币的找零机制

    详解比特币的找零机制

    比特币的找零机制一直让人有些迷惑,明明只向一个地址发送了比特币为什么 blockchain 上面的显示的有时是1个地址对多个地址,有时是多个地址对1个地址,有时又显示多个地址对多个地址? 为什么比特币资深用户要提醒大家当比特币钱包交易100次以上时再次交易后要重新备份钱包,恢复以前的钱包备份有可能会遭遇损失? 是的,这一切都是因为比特币的找零(Change)机制。本文参考 Bitcoin的维

    玩转比特币客户端之一:C盘转移和加速下载

    玩转比特币客户端之一:C盘转移和加速下载

    C盘空间不足?交易数据下载速度太慢?别着急,乐享比特币教你轻松玩转比特币官方客户端。 所有新人开始接触比特币时做的第一件事情大多数是安装比特币的官方客户端。 安全起见大家最好直接访问官方发布渠道sourceforge的地址进行下载:http://sourceforge.net/projects/bitcoin/files/Bitcoin/ 该网页列出了各版本的官方比特币客户端,目前

    麦妖榜
    更新日期 2019-03-20
    排名用户贡献值
    1BitettFan23752
    2等待的宿命23696
    3六叶树20309
    4天下无双16192
    5区块大康15902
    6lizhen00214889
    7让时间淡忘14256
    8linjm122712265
    9冷风大q11188
    10momo11174
    返回顶部 ↑