Realtime Price(实时价格):

比特币支付协议常见问题解答

翻译:潇湘夜雨

发布时间:2013年9月27日

网络来源:比特人论坛

原文链接:https://bitcointalk.org/index.php?topic=300809.0

比特币第70号改进提案(BIP 70)也叫做支付协议,它打算让人们对比特币的使用产生巨变。关于支付协议人们反复问到了一些问题,因此这里整理了一份资料,尝试回答一些最常见的问题。

什么是支付协议?

许多比特币老资格应该还记得比特币第一个版本v0.1,这个版本允许你使用两种不同的方式付款。一种是输入比特币地址,另一种则是输入IP地址。你的电脑将连接到那个IP地址的节点,然后执行一种基本支付协议(该协议会要求收款的节点提供最新的公用密钥),最后直接将支付交易上传至服务器。

中本聪认为这种支付协议是大多数人使用比特币的原因。它具有一些优点,比如说保证付款地址能更新。他最初的想法是付款地址只有在收款方离线时才能使用。但是,他想错了——付款给比特币地址的方式逐渐占据统治性地位,几乎没有人使用付款给IP地址的功能。最终,付款给IP地址的方式被剔除。

为什么付款给IP的方式会失败?

这种方式不太安全是一个原因,任何知道用“中间人攻击”来攻击你的网络连接的人都能够偷走用这种方式发送的资金。另一个更现实的原因是,当时没有任何接受比特币付款的网络商店。事实上,当时比特币是一个只支持Windows系统的纯粹的GUI应用程序,不支持任何JSON-RPC应用程序接口,因此没有任何人能创建支持比特币付款的网络商店。这样,你就无法知道比特币收款方是否在线,这意味着将付款打给比特币地址更可靠。此外,付款给IP地址还有网络连接转换保护(NAT)、防火墙等麻烦因素。

但是,这种想法并不错,因此我们现在要重新采用,不过其设计会更加良好。我们希望,随着时间的推进,这种付款方式将在大多数应用上逐渐取代付款给比特币地址的方式。不必担心,比特币地址不会消亡,如果你需要,比特币地址仍然能够使用。

支付协议是如何运作的?

首先,协议将一小块包含付款指令(指示你如何付款给某人)的数据格式化,然后通过提交一条付款消息生成一种如何满足这些指令的正式规范。这种数据设计为能够在将来扩展,这样我们就能够增加许多有用的功能。

将来的可点击比特币链接形式就像下面这条链接:

bitcoin:1EZEqFBd8yuc9ir2761987q7k3VcALC8YQ?request=https://bitcoinstore.com/r/aBcdE

点击链接后,你的钱包应用程序将下载请求的URL,然后解析它收到的付款请求。请求的消息包含另一个URL(http://bitcoinstore.com/r/aBcdE),完成的交易将提交到那个URL(而不是广播到点对点网络)。

哪些应用会执行新支付协议?

预计在Bitcoin-Qt的下一个版本将包括新的支付协议,MultiBit/AndroidBitcoin Wallet、CoinBase和CoinPunk都会支持新的支付协议。BitPay也承诺执行新的支付协议,因此所有使用BitPay服务的商家都自动支持新协议。如果你的应用打算支持新协议,请告诉我,我会加到这里。

比特币地址有哪些弊病?

很多。它们会造成隐私泄漏;它们缺乏弹性,很难扩展新功能;它们不能验证;它们只能单向执行。

为什么比特币地址会造成隐私泄漏?

使用比特币的标准方式是每笔收款一个地址。这可能在下面的场合造成隐私泄漏。

假设说,你在一家接受比特币付款的小咖啡馆工作,再假设一杯咖啡的价格是0.01BTC。整整一个月,你们收到了很多这样的小额付款。月底的时候,你要发工资了,你给了老板一个新的比特币地址。他收集了许多小额的比特币咖啡款,然后付款给那个地址,产生了一个工资大小的巨额输出。

随后,你去酒吧,你的朋友说:“嘿,伙记,你上周和我打赌还欠我10美元呢。”于是,你给他发送了价值10美元的比特币。你的钱包必然会选择用你的薪水大小的输出来付款。你的朋友现在可以查看他收到的那笔交易,且知道这笔款来自一个巨额的薪水大小的输出。现在,你的朋友们知道你的收入是多少了。

有一种更好的收款方式:你给老板100个比特币地址,然后他将小额的咖啡款付给100个不同的地址。这样链接显示的金额会小很多,但实际上没有人会那么做。

新的支付协议如何解决这个问题?

请求的消息允许你请求的付款分散到多个输出(你不必使用支付到地址方式的输出,而且输出可以包含任何脚本,比如说多重签名脚本)。新协议也使得付款方能够将同一笔付款分割成多笔交易进行提交。当某个应用生成了一个付款请求(比如说给你发薪水),新协议就会知道请求的付款金额是多少,然后它将这笔款分摊到多个输出。付款方或许仍然可以生成一笔巨大的交易;但是,为了最大化隐私、最小化漏洞,付款方采用化整为零的付款方式更明智。

为什么发款方将交易直接提交给收款方?

通常,付款给某人时,你将交易广播到点对点网络,然后收款方等待这笔钱到账。这种机制能正常运作,但缺乏弹性。譬如,要是发款方不能够使用互联网怎么办?要是发款方/收款方的电脑装有讨厌的只允许web流量的防火墙怎么办?要是收款方正在经营矿机生意,根本不想广播交换该怎么办?

在新的支付协议中,请求包括如何提交付款的指令。通常,钱包会也收到一个HTTPSURL来提交数据,但另一种方法或许更简单。譬如,安卓钱包应用已经支持使用蓝牙技术将交易直接发送给收款方(双方都要使用安卓钱包)。当你正在旅游无法获得互联网连接时,这是一种很好的付款方式。付款协议将我们的付款行为标准化,而不用限定在某个特定的应用上。

新的支付协议增加了哪些新的特征?

在协议的v1版中:

退款。发款方在提交交易的同时可向收款方提交一些退款地址。如果卖家希望给买家快速退款,他们可以这样做。再也不会出现尝试去“猜测”用户地址的问题(有时因为共享钱包的问题,你会弄错用户的地址)。Bitcoin-QT客户端为每一笔采用这种方式的付款生成一个退款地址,但你只有确实收到了退款才会看到这个地址。

备注。可点击的链接可能已经包含了短字符串或是标签,但它们的长度受到浏览器和二维码的限制。新协议允许付款请求包括长度不限的备注,这种备注可用来注释你购买的物品。在验证付款请求时,这种功能超级好用。

验证是怎么一回事?

比特币在某种程度是一个棘手的项目,因为我们通常是在用于普通目的的电脑上转移资金,这种电脑容易被攻击或是感染病毒。维萨和万事卡公司敦促所有人使用芯片卡和专用读卡器这样具有特定目的又不能安装其他应用程序的硬件。我们的方法必须和他们有点差异,但仍会用到专用硬件。Trezor设备是一种仅用于比特币的迷你电脑,它通过USB接口插入到“真正”的电脑。Trezor有一个显示屏和几个按钮,它保管了你的私人密钥。当你希望付款时,付款明细会显示在屏幕上,如果数据无误,你就摁下“确认”按钮,交易就会获得签署认证。

这种设计对于今天的比特币来说有一个明显的漏洞。你在屏幕上看到的“付款明细”看起来会是这个样子:

Pay 0.5 BTC to 1EZEqFBd8yuc9ir2761987qk3VcALC8YQ?

那个收款地址来自哪呢?是的,来自你的电脑。而你的电脑有可能感染了病毒。病毒可能把网络商店发给你的地址换成了病毒作者的比特币地址,因为地址只是一串随机的数字,你根本不知道已经被替换了。尽管病毒不会立即清空你的钱包,可它还是能够在你付款时偷走你的付款,避免这种损失的关键就是使用特别的硬件!

新的付款协议允许收款方使用一种“身份”(identity)来签署他们的请求。“身份”只是一串随机字符串,由某些“认证授权机构”(certificateauthority,以下简称CA)签署。这种机构发放签署证书,它告诉你:“我Bob Smith确信比特币地址1EZEqFBd8yuc9ir2761987qk3VcALC8YQ属于Mike Hearn”。现在,如果你的Trezor设备碰巧信赖Bob Smith身份验证的可靠性,它就会显示:Pay 0.5 BTC to MikeHearn?

这种消息不能被任何病毒篡改。所以你知道这种认证机制安全了很多。

收款是如何运作的?

当付款请求签署时,签署的不只是地址,备注也会签署。通过保留签署的付款请求和你为满足付款要求创造的交易,你就获得了一份数学意义上的付款证明。因为付款的备注包含了说明,商家既无法和你争辩你的付款目的,也不能争辩说没有收到款项(当然,除非他们声称自己的私人密钥被窃)。

这种机制很棒,因为它补充了使用多重签名交易的低信任度第三方争议调解机制的缺失。现在,如果你试图调解交易纠纷,就会碰到这种问题:卖家说“卖家没发货!”,而商家却说“买家没给我付款!”,或者你会碰到更麻烦的问题:买家说“卖家寄来的不是我要买的东西”,卖家却说“我给他的确实是我们商量好的东西。”

因为新的收款机制,查明某笔交易的细节和赔偿占理的交易人突然变得很简单,

付款请求必须签名吗?

不。没有签名这些请求只是一个包含地址和备注的容器。

付款请求会存储在块环链中吗?

不。付款请求和付款反馈直接在买家和卖家之间传送。他们不会被外部环境记录。

协议还有哪些其他特征?譬如说小费。

付款请求和付款反馈消息使用一种叫做“协议缓冲”(protocolbuffer)的容易扩展的格式。我编辑了一份未来的协议特征列表:

http://bitcointalk.org/index.php?topic=270055.msg2890147#msg2890147

这些特征目前一个都不存在。不过,在创造这些特征之前,我们需要找到一个存放这些特征所需要的数据的地方。新的支付协议是一个极完美的地方。

“身份”是如何工作的?

协议能用多种方式扩展,但v1版协议只能在X.509数字证书结构下工作。这种结构也被SSL协议采用。

本质上,任何人都能获得证明某种身份的证书。身份往往只是一个Email地址或网站域名(例如,bitcointalk.org就有一个包含其域名的证书)。它也可以是一个合法名称,比如说“MichaelC Hearn”或“Mt Gox Ltd”。事实上,如果你有一个带芯片的(电子)护照,那么你已经有了一个包含你护照数据的证书,但这个证书没多少用,因为它和个人密钥没有丝毫关系。

有时证书需要付费,有时它们是免费的。CA永远不会去获取你的个人密钥。相反,你在本地生成一个个人密钥,然后要求CA去签署你的公用密钥。同时,你证明了自己的身份,如果你的身份是一个Email地址,那么你通常会收到一个可点击的链接。如果身份是你的名字,你也许得提交某种文书。

这种机制是否会削弱比特币的匿名性或私有性?

不会。人们总是知道他们准备付款给哪个身份。这种身份不一定要法律意义上的身份。它可以是论坛用户名或是假名,因此即使是在丝绸之路网站,这种机制也是适用的——你知道自己将要付款给“毒贩丹”。你基本上不会因为不知道付款的流向而发送到无效的地址。

你不会经常知道付款方的真实身份,但支付协议不会创建双向的身份。只有请求付款的实体具有签名的选择(当然,他们可以不签名)。

我能使用PGP信任网络吗?

不能,v1版的协议不支持PGP。不过任何人都可充当CA,事实上苹果公司就推出了一种运行在MacOS操作系统的GUI认证授权软件。但你必须说服其他人相信你,这才是困难之处。“信任网络”(webof trust)没有解决这个问题——为了签署密钥的目的,你必须说服他人相信你。

尽管如此,我们可以想像彼此互信的社区能创建自己的CA,发放身份认证。例如,Bitcointalk可以发放自己的证书,用论坛用户名作为身份。如果钱包创建者/硬钱包设计者决定相任Bitcointalk,你就可以看到论坛用户名显示在你的Trezor上面。

SSL是不是被人可怕地破解了?

不,并非如此。有些人说SSL被破解了,但目前没有更安全的系统。X.509公钥基础设备(PKI)是PKI多年演变和改良的结果。而且,PKI仍然在改进。因为它支持SSL协议,许多实力雄厚的企业希望它变得更完善,比如说Google公司就在聘请员工来完善PKI。

我们再具体一点。关于X.509公钥基础设施人们最关注的问题是该系统的CA太多了。数百个CA意味着每个CA都能发放所有用户都接受的证书。如何阻止一家CA发放伪造的证书给冒名顶替者呢?

目前发放证书的行为无迹可寻,因此这是一个现实的问题。Google正在开发一种叫做“证书透明度”的解决方案:http://www.certificate-transparency.org/

它是一种可公开查阅的、不可伪造的所有已发放证书的检查日志。事实上,它的工作机制有点像比特币的块环链。每份证书可以包括一个验证链接,链接到公开日志的某个条目。一旦某个CA开始使用这个系统,如果某个证书由该CA签署,但不包括验证链接,那么它就被视为无效,被拒绝。这意味着CA 不再能私下发放证书。通过查看检查日志,你就能查到一家CA是否以你的名字(或是与你相似的名字)发放了证书(这是一种反钓鱼诈骗的方法)……

这将对今后的比特币使用习惯产生革命性的改变,不管是比特币的普通用户还是比特币应用的开发者,都先看看这篇文章做好思想准备吧。
我觉得不至于革命性改变吧……现在的支付应用往往会根据请求生成一个地址给你专用,比如给同一所交易所充钱,每个人都给对应于自己账号的地址充钱,而网站的IP不可能不断生成新的,必须建立一个额外的验证机制才可能区分支付者,但这个额外的验证机制还能比比特币地址更方便吗?
  • nimei
  • 2013-9-27 12:46:41

引用: 胡翌霖 发表于 2013-9-27 12:37
我觉得不至于革命性改变吧……现在的支付应用往往会根据请求生成一个地址给你专用,比如给同一所交易所充钱 …

引用: 比特币地址有哪些弊病?

很多。它们会造成隐私泄漏;它们缺乏弹性,很难扩展新功能;它们不能验证;它们只能单向执行。

不明白,发送给ip地址最终不还是要生成公钥?只是原本由web应用访问ip地址申请生成公钥,现在变成由比特币程序本身向ip地址申请公钥,但支付者的区分还是需要在web应用中完成,所以绕一圈的意义何在?

相关文章:

比特币布道者

比特币的坚定信仰者!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注