बिटकॉइन: एक पीयर-टू-पीयर इलेक्ट्रॉनिक कैश सिस्टम

作者 Satoshi Nakamoto · 2008

Abstract

一种完全的点对点电子现金系统将允许在线支付从一方直接发送到另一方,而无需通过金融机构。数字签名提供了部分解决方案,但如果仍然需要一个可信赖的第三方来防止双重支付,那么其主要优势就会丧失。我们提出一种使用点对点网络来解决双重支付问题的方案。该网络通过将交易 hash 到一条基于 hash 的 proof-of-work 的持续增长的链中来为交易打上时间戳,形成一份不重做 proof-of-work 就无法更改的记录。最长的链不仅作为所见证事件序列的证明,而且证明它来自最大的 CPU 算力池。只要大多数 CPU 算力由不合谋攻击网络的节点控制,它们就会生成最长的链并超过攻击者。该网络本身只需要最小化的结构。消息以尽最大努力的方式广播,节点可以随时离开和重新加入网络,并接受最长的 proof-of-work 链作为其离开期间所发生事件的证明。

Abstract

इलेक्ट्रॉनिक कैश का एक पूर्णतः peer-to-peer संस्करण ऑनलाइन भुगतानों को किसी वित्तीय संस्थान से गुज़रे बिना सीधे एक पक्ष से दूसरे पक्ष को भेजने की अनुमति देगा। Digital signatures समाधान का एक हिस्सा प्रदान करती हैं, लेकिन यदि double-spending को रोकने के लिए अभी भी एक विश्वसनीय तृतीय पक्ष की आवश्यकता है, तो मुख्य लाभ खो जाते हैं। हम एक peer-to-peer network का उपयोग करके double-spending समस्या का समाधान प्रस्तावित करते हैं। यह network लेनदेन को hash-based proof-of-work की एक सतत श्रृंखला में hash करके उन्हें timestamp करता है, जिससे एक ऐसा रिकॉर्ड बनता है जिसे proof-of-work को दोबारा किए बिना बदला नहीं जा सकता। सबसे लंबी chain न केवल देखी गई घटनाओं के अनुक्रम के प्रमाण के रूप में कार्य करती है, बल्कि इस बात के प्रमाण के रूप में भी कि यह CPU शक्ति के सबसे बड़े पूल से आई है। जब तक CPU शक्ति का बहुमत उन nodes द्वारा नियंत्रित है जो network पर हमला करने के लिए सहयोग नहीं कर रहे हैं, वे सबसे लंबी chain उत्पन्न करेंगे और हमलावरों से आगे रहेंगे। network को स्वयं न्यूनतम संरचना की आवश्यकता है। संदेश best effort के आधार पर broadcast किए जाते हैं, और nodes अपनी इच्छा से network छोड़ सकते हैं और पुनः जुड़ सकते हैं, सबसे लंबी proof-of-work chain को उनकी अनुपस्थिति के दौरान जो हुआ उसके प्रमाण के रूप में स्वीकार करते हुए।

Introduction

互联网上的商业活动已经几乎完全依赖金融机构作为可信赖的第三方来处理电子支付。虽然该系统对于大多数交易运行得足够好,但它仍然受制于基于信任模型的固有弱点。完全不可逆的交易实际上是不可能的,因为金融机构无法避免调解纠纷。调解成本增加了交易成本,限制了最小实际交易规模,并切断了小额临时交易的可能性,而且在无法为不可逆服务进行不可逆支付方面存在更广泛的成本。由于存在逆转的可能性,对信任的需求就会蔓延。商家必须对客户保持警惕,向他们索要比其他情况下更多的信息。一定比例的欺诈被认为是不可避免的。这些成本和支付的不确定性可以通过使用实物货币进行面对面交易来避免,但不存在一种无需可信赖方就能通过通信渠道进行支付的机制。

所需要的是一种基于密码学证明而非信任的电子支付系统,允许任何两个有意愿的当事方直接进行交易,而无需可信赖的第三方。在计算上不可行的逆转交易将保护卖家免受欺诈,而常规的托管机制可以很容易地实施以保护买家。在本文中,我们提出一种使用点对点分布式时间戳服务器来生成交易时间顺序的计算证明的双重支付问题解决方案。只要诚实节点共同控制的 CPU 算力超过任何合谋的攻击者节点群组,该系统就是安全的。

Introduction

इंटरनेट पर वाणिज्य इलेक्ट्रॉनिक भुगतानों को संसाधित करने के लिए विश्वसनीय तृतीय पक्ष के रूप में कार्य करने वाली वित्तीय संस्थाओं पर लगभग पूरी तरह से निर्भर हो गया है। हालांकि यह प्रणाली अधिकांश लेनदेन के लिए पर्याप्त रूप से काम करती है, फिर भी यह विश्वास-आधारित मॉडल की अंतर्निहित कमज़ोरियों से ग्रस्त है। पूर्णतः अपरिवर्तनीय लेनदेन वास्तव में संभव नहीं हैं, क्योंकि वित्तीय संस्थान विवादों में मध्यस्थता करने से बच नहीं सकतीं। मध्यस्थता की लागत लेनदेन की लागत बढ़ाती है, न्यूनतम व्यावहारिक लेनदेन आकार को सीमित करती है और छोटे सामान्य लेनदेन की संभावना को समाप्त करती है, और अपरिवर्तनीय सेवाओं के लिए अपरिवर्तनीय भुगतान करने की क्षमता के नुकसान में एक व्यापक लागत है। उलटने की संभावना के साथ, विश्वास की आवश्यकता फैलती है। व्यापारियों को अपने ग्राहकों से सतर्क रहना होगा, उनसे अन्यथा आवश्यक से अधिक जानकारी की मांग करनी होगी। धोखाधड़ी का एक निश्चित प्रतिशत अपरिहार्य के रूप में स्वीकार किया जाता है। इन लागतों और भुगतान अनिश्चितताओं को भौतिक मुद्रा का उपयोग करके व्यक्तिगत रूप से टाला जा सकता है, लेकिन किसी विश्वसनीय पक्ष के बिना संचार चैनल पर भुगतान करने का कोई तंत्र मौजूद नहीं है।

जो चाहिए वह एक इलेक्ट्रॉनिक भुगतान प्रणाली है जो विश्वास के बजाय cryptographic proof पर आधारित हो, जो किन्हीं भी दो इच्छुक पक्षों को किसी विश्वसनीय तृतीय पक्ष की आवश्यकता के बिना सीधे एक-दूसरे के साथ लेनदेन करने की अनुमति दे। जिन लेनदेन को उलटना कम्प्यूटेशनल रूप से अव्यावहारिक हो, वे विक्रेताओं को धोखाधड़ी से सुरक्षित करेंगे, और खरीदारों की सुरक्षा के लिए नियमित escrow तंत्र आसानी से लागू किए जा सकते हैं। इस पत्र में, हम लेनदेन के कालानुक्रमिक क्रम का कम्प्यूटेशनल प्रमाण उत्पन्न करने के लिए peer-to-peer distributed timestamp server का उपयोग करके double-spending समस्या का समाधान प्रस्तावित करते हैं। यह प्रणाली तब तक सुरक्षित है जब तक ईमानदार nodes सामूहिक रूप से किसी भी सहयोगी हमलावर nodes के समूह से अधिक CPU शक्ति को नियंत्रित करते हैं।

Transactions

我们将一枚电子货币定义为一条数字签名链。每个所有者通过对前一笔交易的 hash 和下一个所有者的公钥进行数字签名,并将这些附加到该货币的末尾,从而将货币转移给下一个所有者。收款人可以验证签名以验证所有权链。

Bitcoin transaction chain showing the signature-linked ownership transfer model

当然,问题在于收款人无法验证某个所有者是否对该货币进行了双重支付。一个常见的解决方案是引入一个可信赖的中央权威机构,即铸币厂,来检查每笔交易是否存在双重支付。每次交易后,该货币必须返回铸币厂以发行新的货币,并且只有直接从铸币厂发行的货币才被信任未被双重支付。这个方案的问题是,整个货币系统的命运取决于运营铸币厂的公司,每笔交易都必须经过他们,就像银行一样。

我们需要一种方式让收款人知道前任所有者没有签署任何更早的交易。就我们的目的而言,最早的交易是算数的那个,所以我们不关心后来的双重支付尝试。确认一笔交易不存在的唯一方法是了解所有交易。在基于铸币厂的模型中,铸币厂了解所有交易并决定哪个先到达。为了在没有可信赖方的情况下实现这一点,交易必须被公开宣布 [^1],并且我们需要一个系统让参与者就它们被接收的顺序的单一历史达成一致。收款人需要证明在每笔交易发生时,大多数节点都同意它是第一个被接收的。

Transactions

हम एक इलेक्ट्रॉनिक coin को digital signatures की एक श्रृंखला के रूप में परिभाषित करते हैं। प्रत्येक स्वामी पिछले लेनदेन के hash और अगले स्वामी की public key को digitally sign करके और इन्हें coin के अंत में जोड़कर coin को अगले व्यक्ति को हस्तांतरित करता है। एक प्राप्तकर्ता स्वामित्व की श्रृंखला को सत्यापित करने के लिए signatures को सत्यापित कर सकता है।

Bitcoin transaction chain showing the signature-linked ownership transfer model

समस्या यह है कि प्राप्तकर्ता यह सत्यापित नहीं कर सकता कि किसी एक स्वामी ने coin को double-spend नहीं किया। एक सामान्य समाधान एक विश्वसनीय केंद्रीय प्राधिकरण, या mint, की शुरुआत करना है, जो प्रत्येक लेनदेन में double spending की जांच करे। प्रत्येक लेनदेन के बाद, coin को एक नया coin जारी करने के लिए mint को वापस किया जाना चाहिए, और केवल सीधे mint से जारी किए गए coins पर double-spend न होने का भरोसा किया जाता है। इस समाधान की समस्या यह है कि संपूर्ण मौद्रिक प्रणाली का भाग्य mint चलाने वाली कंपनी पर निर्भर करता है, जिसमें प्रत्येक लेनदेन को उनके माध्यम से गुज़रना होता है, ठीक एक बैंक की तरह।

हमें प्राप्तकर्ता के लिए यह जानने का एक तरीका चाहिए कि पिछले स्वामियों ने कोई पूर्व लेनदेन sign नहीं किया। हमारे उद्देश्यों के लिए, सबसे पहला लेनदेन वह है जो मायने रखता है, इसलिए हमें बाद के double-spend प्रयासों की चिंता नहीं है। किसी लेनदेन की अनुपस्थिति की पुष्टि करने का एकमात्र तरीका सभी लेनदेन के बारे में जागरूक होना है। mint-आधारित मॉडल में, mint सभी लेनदेन के बारे में जागरूक था और तय करता था कि कौन सा पहले आया। किसी विश्वसनीय पक्ष के बिना इसे पूरा करने के लिए, लेनदेन को सार्वजनिक रूप से घोषित किया जाना चाहिए [^1], और हमें प्रतिभागियों के लिए उस क्रम के एकल इतिहास पर सहमत होने की एक प्रणाली की आवश्यकता है जिसमें उन्हें प्राप्त किया गया था। प्राप्तकर्ता को इस बात का प्रमाण चाहिए कि प्रत्येक लेनदेन के समय, अधिकांश nodes ने सहमति व्यक्त की कि यह पहले प्राप्त हुआ था।

Timestamp Server

我们提出的解决方案从一个时间戳服务器开始。时间戳服务器通过对要加时间戳的一个数据区块进行 hash 并广泛发布该 hash 来工作,例如在报纸或 Usenet 帖子中 [^2] [^3] [^4] [^5]。时间戳证明了数据在当时必然已经存在,显然,这是为了能够进入该 hash。每个时间戳在其 hash 中包含前一个时间戳,形成一条链,每个额外的时间戳都加强了之前的时间戳。

Bitcoin timestamp server hash-chain diagram linking blocks and items

Timestamp Server

हमारा प्रस्तावित समाधान एक timestamp server से शुरू होता है। एक timestamp server उन items के एक block का hash लेकर और उस hash को व्यापक रूप से प्रकाशित करके काम करता है, जैसे कि किसी समाचार पत्र या Usenet पोस्ट में [^2] [^3] [^4] [^5]। timestamp यह साबित करता है कि hash में शामिल होने के लिए डेटा उस समय अवश्य मौजूद रहा होगा। प्रत्येक timestamp अपने hash में पिछले timestamp को शामिल करता है, जिससे एक श्रृंखला बनती है, जिसमें प्रत्येक अतिरिक्त timestamp पहले वालों को मज़बूत करता है।

Bitcoin timestamp server hash-chain diagram linking blocks and items

Proof-of-Work

为了在点对点的基础上实现分布式时间戳服务器,我们需要使用类似于 Adam Back 的 Hashcash [^6] 的 proof-of-work 系统,而不是报纸或 Usenet 帖子。proof-of-work 涉及扫描一个值,使得对该值进行 hash(例如使用 SHA-256)时,hash 以一定数量的零位开头。所需的平均工作量随所需零位数呈指数增长,并且可以通过执行一次 hash 来验证。

对于我们的时间戳网络,我们通过在区块中递增一个 nonce 来实现 proof-of-work,直到找到一个使区块的 hash 满足所需零位数的值。一旦 CPU 花费了足够的努力使其满足 proof-of-work,该区块就无法在不重做工作的情况下被更改。随着后续区块被链接在其后,更改该区块的工作将包括重做其后所有区块的工作。

Bitcoin proof-of-work block chain diagram with previous hash transaction set and nonce

proof-of-work 还解决了在多数决定中确定代表性的问题。如果多数决定是基于一个 IP 地址一票,那么任何能够分配大量 IP 的人都可以颠覆它。proof-of-work 本质上是一个 CPU 一票。多数决定由最长的链代表,因为它投入了最大的 proof-of-work 努力。如果大多数 CPU 算力由诚实节点控制,诚实链将增长最快并超过任何竞争链。要修改一个过去的区块,攻击者必须重做该区块及其后所有区块的 proof-of-work,然后追上并超过诚实节点的工作。我们将在后面展示,一个较慢的攻击者追上的概率随着后续区块的增加呈指数下降。

为了补偿不断提高的硬件速度和随时间变化的运行节点兴趣,proof-of-work 难度由一个移动平均值确定,目标是每小时平均产出一定数量的区块。如果它们生成得太快,难度就会增加。

Proof-of-Work

peer-to-peer आधार पर एक distributed timestamp server को लागू करने के लिए, हमें समाचार पत्र या Usenet पोस्ट के बजाय Adam Back के Hashcash [^6] के समान एक proof-of-work प्रणाली का उपयोग करना होगा। proof-of-work में एक ऐसे मान की खोज शामिल है जिसे hash किए जाने पर, जैसे SHA-256 के साथ, hash एक निश्चित संख्या में zero bits से शुरू होता है। आवश्यक औसत कार्य आवश्यक zero bits की संख्या में exponential होता है और इसे एक single hash निष्पादित करके सत्यापित किया जा सकता है।

हमारे timestamp network के लिए, हम block में एक nonce को बढ़ाकर proof-of-work को लागू करते हैं जब तक कि एक ऐसा मान नहीं मिल जाता जो block के hash को आवश्यक zero bits देता है। एक बार CPU प्रयास proof-of-work को संतुष्ट करने के लिए खर्च किया जा चुका है, तो block को कार्य को दोबारा किए बिना बदला नहीं जा सकता। चूँकि बाद के blocks इसके बाद chain किए जाते हैं, block को बदलने के कार्य में इसके बाद के सभी blocks को दोबारा करना शामिल होगा।

Bitcoin proof-of-work block chain diagram with previous hash transaction set and nonce

proof-of-work बहुमत निर्णय लेने में प्रतिनिधित्व निर्धारित करने की समस्या को भी हल करता है। यदि बहुमत one-IP-address-one-vote पर आधारित होता, तो इसे कोई भी व्यक्ति जो कई IPs आवंटित करने में सक्षम है, विकृत कर सकता था। proof-of-work अनिवार्य रूप से one-CPU-one-vote है। बहुमत निर्णय सबसे लंबी chain द्वारा दर्शाया जाता है, जिसमें सबसे अधिक proof-of-work प्रयास निवेश किया गया है। यदि CPU शक्ति का बहुमत honest nodes द्वारा नियंत्रित है, तो honest chain सबसे तेज़ बढ़ेगी और किसी भी प्रतिस्पर्धी chains से आगे निकल जाएगी। किसी पिछले block को संशोधित करने के लिए, एक हमलावर को उस block और उसके बाद के सभी blocks के proof-of-work को दोबारा करना होगा और फिर honest nodes के कार्य को पकड़ना और पार करना होगा। हम बाद में दिखाएंगे कि एक धीमे हमलावर के पकड़ने की संभावना बाद के blocks जोड़े जाने के साथ exponentially घटती है।

बढ़ती hardware गति और समय के साथ nodes चलाने में बदलती रुचि की भरपाई के लिए, proof-of-work कठिनाई एक moving average द्वारा निर्धारित की जाती है जो प्रति घंटे blocks की औसत संख्या को लक्षित करती है। यदि वे बहुत तेज़ी से उत्पन्न होते हैं, तो कठिनाई बढ़ जाती है।

Network

运行该网络的步骤如下:

  1. 新交易被广播到所有节点。
  2. 每个节点将新交易收集到一个区块中。
  3. 每个节点为其区块寻找一个困难的 proof-of-work
  4. 当一个节点找到一个 proof-of-work 时,它将该区块广播到所有节点。
  5. 节点只有在区块中所有交易都是有效的且未被花费过的情况下才接受该区块。
  6. 节点通过在链中创建下一个区块来表示对该区块的接受,使用被接受区块的 hash 作为前一个 hash。

节点始终将最长的链视为正确的链,并将继续在其上扩展。如果两个节点同时广播了下一个区块的不同版本,一些节点可能先接收到其中一个或另一个。在这种情况下,它们在先接收到的版本上工作,但保留另一个分支以防它变得更长。当下一个 proof-of-work 被找到且其中一个分支变得更长时,平局将被打破;在另一个分支上工作的节点将切换到更长的那个。

新交易广播不一定需要到达所有节点。只要它们到达足够多的节点,它们不久就会进入一个区块。区块广播也容忍丢失的消息。如果一个节点没有收到一个区块,它会在收到下一个区块并意识到它遗漏了一个时请求该区块。

Network

network चलाने के चरण इस प्रकार हैं:

  1. नए transactions सभी nodes को broadcast किए जाते हैं।
  2. प्रत्येक node नए transactions को एक block में एकत्र करता है।
  3. प्रत्येक node अपने block के लिए एक कठिन proof-of-work खोजने पर काम करता है।
  4. जब एक node proof-of-work पाता है, तो वह block को सभी nodes को broadcast करता है।
  5. nodes block को तभी स्वीकार करते हैं जब उसमें सभी transactions वैध हों और पहले से खर्च न किए गए हों।
  6. nodes स्वीकृत block के hash को previous hash के रूप में उपयोग करते हुए, chain में अगला block बनाने पर काम करके block की अपनी स्वीकृति व्यक्त करते हैं।

nodes हमेशा सबसे लंबी chain को सही मानते हैं और उसे बढ़ाने पर काम करते रहते हैं। यदि दो nodes एक साथ अगले block के अलग-अलग संस्करण broadcast करते हैं, तो कुछ nodes को पहले एक या दूसरा प्राप्त हो सकता है। उस स्थिति में, वे पहले प्राप्त हुए पर काम करते हैं, लेकिन दूसरी branch को सहेज कर रखते हैं यदि वह लंबी हो जाए। जब अगला proof-of-work पाया जाता है और एक branch लंबी हो जाती है तो बराबरी टूट जाएगी; जो nodes दूसरी branch पर काम कर रहे थे वे फिर लंबी वाली पर स्विच कर लेंगे।

नए transaction broadcasts को सभी nodes तक पहुँचना आवश्यक नहीं है। जब तक वे कई nodes तक पहुँचते हैं, वे शीघ्र ही एक block में शामिल हो जाएंगे। block broadcasts भी छूटे हुए संदेशों के प्रति सहनशील हैं। यदि एक node को कोई block प्राप्त नहीं होता, तो जब उसे अगला block प्राप्त होता है और उसे पता चलता है कि उसने एक छोड़ दिया, तो वह उसका अनुरोध करेगा।

Incentive

按照惯例,区块中的第一笔交易是一笔特殊交易,它创建一枚由区块创建者拥有的新货币。这为节点支持网络增加了激励,并提供了一种将货币最初分配到流通中的方式,因为没有中央权威机构来发行它们。稳定地增加固定数量的新货币类似于金矿矿工消耗资源将黄金加入流通。在我们的案例中,消耗的是 CPU 时间和电力。

激励也可以通过交易费来资助。如果一笔交易的输出值小于其输入值,差额就是交易费,它被加到包含该交易的区块的激励值中。一旦预定数量的货币进入流通,激励就可以完全过渡到交易费,并且完全没有通货膨胀。

激励可能有助于鼓励节点保持诚实。如果一个贪婪的攻击者能够集结比所有诚实节点更多的 CPU 算力,他将不得不在使用它来通过偷回自己的付款来欺骗人们,或使用它来生成新货币之间做出选择。他应该发现按照规则行事更有利可图,因为这些规则使他获得比所有其他人加起来还多的新货币,而不是破坏系统和他自身财富的有效性。

Incentive

परंपरा के अनुसार, एक block में पहला transaction एक विशेष transaction होता है जो block के निर्माता के स्वामित्व में एक नया coin शुरू करता है। यह nodes को network का समर्थन करने के लिए एक प्रोत्साहन जोड़ता है, और coins को प्रचलन में वितरित करने का एक तरीका प्रदान करता है, क्योंकि उन्हें जारी करने के लिए कोई केंद्रीय प्राधिकरण नहीं है। नए coins की एक निरंतर मात्रा का स्थिर जोड़ना सोने के खनिकों द्वारा सोने को प्रचलन में जोड़ने के लिए संसाधन खर्च करने के समान है। हमारे मामले में, यह CPU समय और बिजली है जो खर्च की जाती है।

प्रोत्साहन को transaction fees से भी वित्तपोषित किया जा सकता है। यदि किसी transaction का output मूल्य उसके input मूल्य से कम है, तो अंतर एक transaction fee है जो उस block के प्रोत्साहन मूल्य में जोड़ी जाती है जिसमें वह transaction शामिल है। एक बार पूर्वनिर्धारित संख्या में coins प्रचलन में आ जाने के बाद, प्रोत्साहन पूरी तरह से transaction fees में परिवर्तित हो सकता है और पूरी तरह से inflation मुक्त हो सकता है।

प्रोत्साहन nodes को ईमानदार बने रहने के लिए प्रोत्साहित करने में मदद कर सकता है। यदि एक लालची हमलावर सभी honest nodes से अधिक CPU शक्ति एकत्र करने में सक्षम है, तो उसे अपने भुगतानों को वापस चुराकर लोगों को धोखा देने के लिए इसका उपयोग करने, या नए coins उत्पन्न करने के लिए इसका उपयोग करने के बीच चुनना होगा। उसे नियमों के अनुसार खेलना अधिक लाभदायक लगना चाहिए, ऐसे नियम जो उसे बाकी सभी की तुलना में अधिक नए coins से अनुग्रहीत करते हैं, बजाय इसके कि वह प्रणाली और अपनी स्वयं की संपत्ति की वैधता को कमज़ोर करे।

Reclaiming Disk Space

一旦一枚货币中的最新交易被埋在足够多的区块之下,之前已花费的交易就可以被丢弃以节省磁盘空间。为了在不破坏区块 hash 的情况下实现这一点,交易被 hash 到一棵 Merkle Tree [^7] [^2] [^5] 中,只有根节点包含在区块的 hash 中。旧区块随后可以通过裁剪树的分支来压缩。内部 hash 不需要被存储。

Bitcoin Merkle Tree diagram showing transaction hashing and block pruning by stubbing off branches

一个没有交易的区块头大约是 80 字节。如果我们假设区块每 10 分钟生成一次,80 字节 * 6 * 24 * 365 = 每年 4.2MB。截至 2008 年,计算机系统通常配备 2GB 的 RAM,而摩尔定律预测当前每年增长 1.2GB,即使区块头必须保存在内存中,存储也不应该成为问题。

Reclaiming Disk Space

एक बार किसी coin में नवीनतम transaction पर्याप्त blocks के नीचे दब जाता है, तो disk space बचाने के लिए इससे पहले के खर्च किए गए transactions को हटाया जा सकता है। block के hash को तोड़े बिना इसे सुगम बनाने के लिए, transactions को एक Merkle Tree [^7] [^2] [^5] में hash किया जाता है, जिसमें केवल root को block के hash में शामिल किया जाता है। पुराने blocks को फिर tree की branches को काटकर संकुचित किया जा सकता है। आंतरिक hashes को संग्रहीत करने की आवश्यकता नहीं है।

Bitcoin Merkle Tree diagram showing transaction hashing and block pruning by stubbing off branches

बिना transactions वाला एक block header लगभग 80 bytes का होगा। यदि हम मानें कि blocks हर 10 मिनट में उत्पन्न होते हैं, तो 80 bytes * 6 * 24 * 365 = प्रति वर्ष 4.2MB। 2008 तक कंप्यूटर सिस्टम आमतौर पर 2GB RAM के साथ बिकते हैं, और Moore's Law 1.2GB प्रति वर्ष की वर्तमान वृद्धि की भविष्यवाणी करता है, तो भंडारण कोई समस्या नहीं होनी चाहिए भले ही block headers को मेमोरी में रखना आवश्यक हो।

Simplified Payment Verification

在不运行完整网络节点的情况下验证支付是可能的。用户只需要保留一份最长 proof-of-work 链的区块头副本,他可以通过查询网络节点直到确信自己拥有最长的链来获取它,并获取将交易链接到其被打上时间戳的区块的 Merkle 分支。他无法自己检查交易,但通过将其链接到链中的某个位置,他可以看到网络节点已经接受了它,而在其后添加的区块进一步确认了网络已经接受了它。

Bitcoin simplified payment verification showing the longest proof-of-work chain with Merkle branch linking to a transaction

因此,只要诚实节点控制着网络,验证就是可靠的,但如果网络被攻击者制服则更加脆弱。虽然网络节点可以自己验证交易,但只要攻击者能够继续制服网络,简化方法就可能被攻击者伪造的交易所欺骗。一种防御策略是接受来自网络节点的警报,当它们检测到无效区块时,提示用户的软件下载完整区块和被警报的交易以确认不一致性。频繁接收支付的企业可能仍然希望运行自己的节点以获得更独立的安全性和更快的验证。

Simplified Payment Verification

पूर्ण network node चलाए बिना भुगतानों को सत्यापित करना संभव है। एक उपयोगकर्ता को केवल सबसे लंबी proof-of-work chain के block headers की एक प्रति रखने की आवश्यकता है, जो वह network nodes से तब तक क्वेरी करके प्राप्त कर सकता है जब तक वह आश्वस्त न हो जाए कि उसके पास सबसे लंबी chain है, और transaction को उस block से जोड़ने वाली Merkle branch प्राप्त करनी होगी जिसमें उसे timestamp किया गया है। वह स्वयं transaction की जाँच नहीं कर सकता, लेकिन इसे chain में एक स्थान से जोड़कर, वह देख सकता है कि एक network node ने इसे स्वीकार किया है, और इसके बाद जोड़े गए blocks आगे पुष्टि करते हैं कि network ने इसे स्वीकार किया है।

Bitcoin simplified payment verification showing the longest proof-of-work chain with Merkle branch linking to a transaction

इस प्रकार, सत्यापन तब तक विश्वसनीय है जब तक honest nodes network को नियंत्रित करते हैं, लेकिन यदि network पर एक हमलावर का वर्चस्व हो जाए तो यह अधिक कमज़ोर है। जबकि network nodes स्वयं transactions को सत्यापित कर सकते हैं, सरलीकृत विधि को एक हमलावर के fabricated transactions द्वारा तब तक धोखा दिया जा सकता है जब तक हमलावर network पर हावी रह सकता है। इससे बचाव के लिए एक रणनीति यह होगी कि network nodes जब एक अमान्य block का पता लगाएं तो alerts स्वीकार किए जाएं, जो उपयोगकर्ता के software को पूर्ण block और सतर्क किए गए transactions को डाउनलोड करने के लिए प्रेरित करे ताकि असंगति की पुष्टि हो सके। जो व्यवसाय बार-बार भुगतान प्राप्त करते हैं वे संभवतः अधिक स्वतंत्र सुरक्षा और तेज़ सत्यापन के लिए अपने स्वयं के nodes चलाना चाहेंगे।

Combining and Splitting Value

虽然可以单独处理每枚货币,但为转账中的每一分钱都创建一笔单独的交易将是笨拙的。为了允许价值的拆分和合并,交易包含多个输入和输出。通常要么有一个来自较大前序交易的单一输入,要么有多个合并较小金额的输入,最多有两个输出:一个用于支付,另一个将找零(如果有的话)返回给发送者。

Bitcoin transaction combining and splitting value with multiple inputs and outputs

应该注意的是,扇出(即一笔交易依赖于多笔交易,而那些交易又依赖于更多的交易)在这里不是问题。从来不需要提取一笔交易的完整独立历史副本。

Combining and Splitting Value

हालांकि coins को व्यक्तिगत रूप से संभालना संभव होगा, एक हस्तांतरण में प्रत्येक cent के लिए एक अलग transaction बनाना अव्यावहारिक होगा। मूल्य को विभाजित और संयोजित करने की अनुमति देने के लिए, transactions में कई inputs और outputs होते हैं। सामान्यतः या तो एक बड़े पिछले transaction से एक single input होगा या छोटी राशियों को मिलाने वाले कई inputs होंगे, और अधिकतम दो outputs होंगे: एक भुगतान के लिए, और एक शेष राशि लौटाने के लिए, यदि कोई हो, प्रेषक को वापस।

Bitcoin transaction combining and splitting value with multiple inputs and outputs

यह ध्यान देने योग्य है कि fan-out, जहाँ एक transaction कई transactions पर निर्भर करता है, और वे transactions कई अन्य पर निर्भर करते हैं, यहाँ कोई समस्या नहीं है। किसी transaction के इतिहास की पूर्ण स्वतंत्र प्रति निकालने की कभी आवश्यकता नहीं होती।

Privacy

传统的银行模型通过限制相关方和可信赖第三方对信息的访问来实现一定程度的隐私。公开宣布所有交易的必要性排除了这种方法,但隐私仍然可以通过在另一个地方打断信息流来维持:保持公钥匿名。公众可以看到某人正在向其他人发送一笔金额,但没有将交易与任何人关联的信息。这类似于证券交易所发布的信息级别,个别交易的时间和规模,即"行情",是公开的,但不会透露当事方是谁。

Bitcoin privacy model comparison showing traditional model with trusted third party versus new model with anonymous public keys

作为额外的防火墙,每笔交易应使用一对新的密钥,以防止它们被关联到一个共同的所有者。对于多输入交易,某些关联仍然是不可避免的,因为它们必然揭示其输入属于同一所有者。风险在于,如果密钥的所有者被揭露,关联可能会揭示属于同一所有者的其他交易。

Privacy

पारंपरिक बैंकिंग मॉडल सम्बंधित पक्षों और विश्वसनीय तृतीय पक्ष तक सूचना की पहुँच को सीमित करके गोपनीयता का एक स्तर प्राप्त करता है। सभी transactions को सार्वजनिक रूप से घोषित करने की आवश्यकता इस विधि को बाहर करती है, लेकिन सूचना के प्रवाह को किसी अन्य स्थान पर तोड़कर गोपनीयता बनाए रखी जा सकती है: public keys को anonymous रखकर। जनता देख सकती है कि कोई व्यक्ति किसी अन्य को एक राशि भेज रहा है, लेकिन transaction को किसी से जोड़ने वाली जानकारी के बिना। यह stock exchanges द्वारा जारी की गई सूचना के स्तर के समान है, जहाँ व्यक्तिगत trades का समय और आकार, "tape", सार्वजनिक किया जाता है, लेकिन यह बताए बिना कि पक्ष कौन थे।

Bitcoin privacy model comparison showing traditional model with trusted third party versus new model with anonymous public keys

एक अतिरिक्त firewall के रूप में, प्रत्येक transaction के लिए एक नई key pair का उपयोग किया जाना चाहिए ताकि उन्हें एक common owner से जोड़ने से रोका जा सके। कुछ linking multi-input transactions के साथ अभी भी अपरिहार्य है, जो आवश्यक रूप से प्रकट करते हैं कि उनके inputs एक ही owner के स्वामित्व में थे। जोखिम यह है कि यदि किसी key का owner प्रकट हो जाता है, तो linking उसी owner से संबंधित अन्य transactions को प्रकट कर सकती है।

Calculations

我们考虑一个攻击者试图比诚实链更快地生成替代链的场景。即使这一目标达成,也不会使系统面临任意更改的风险,例如凭空创造价值或夺取从不属于攻击者的资金。节点不会接受无效交易作为支付,诚实节点永远不会接受包含无效交易的区块。攻击者只能尝试更改自己的一笔交易,以收回他最近花费的资金。

诚实链与攻击者链之间的竞赛可以被描述为一个二项随机游走。成功事件是诚实链被延长一个区块,使其领先优势增加 +1,失败事件是攻击者的链被延长一个区块,使差距缩小 -1。

攻击者从给定落后距离追上的概率类似于赌徒破产问题。假设一个拥有无限信用的赌徒从亏损开始,进行潜在的无限次尝试以达到盈亏平衡。我们可以计算他最终达到盈亏平衡的概率,即攻击者追上诚实链的概率,如下 [^8]:

p = probability an honest node finds the next block
q = probability the attacker finds the next block
q = probability the attacker will ever catch up from z blocks behind
``````

\[
qz =
\begin{cases}
1 & \text{if } p \leq q \\
\left(\frac{q}{p}\right) z & \text{if } p > q
\end{cases}
\]

假设 p  q,概率随着攻击者需要追赶的区块数量的增加而呈指数下降。如果他没有在早期幸运地向前冲刺,随着他进一步落后,他的机会变得微乎其微。

我们现在考虑新交易的接收者需要等待多长时间才能充分确定发送者无法更改交易。我们假设发送者是一个攻击者,他想让接收者相信他已经付款了一段时间,然后在一段时间后将其改为支付给自己。接收者在那时会收到警报,但发送者希望那时已经太晚了。

接收者生成一对新密钥,并在签名前不久将公钥提供给发送者。这防止了发送者通过持续在其上工作来提前准备一条区块链,直到他足够幸运地取得足够的领先,然后在那个时刻执行交易。一旦交易发送,不诚实的发送者开始秘密地在一条包含其交易替代版本的并行链上工作。

接收者等待交易被添加到一个区块中,并且在其后链接了 z 个区块。他不知道攻击者已经取得的确切进展,但假设诚实区块按照每个区块的平均预期时间产出,攻击者的潜在进展将是一个期望值为以下值的泊松分布:

\[
\lambda = z\frac{q}{p}
\]

为了获得攻击者现在仍然能够追上的概率,我们将他可能取得的每个进展量的泊松密度乘以他从该点追上的概率:

\[
\sum_{k=0}^{\infty} \frac{\lambda^k e^{-\lambda}}{k!} \cdot \left\{
\begin{array}{cl}
\left(\frac{q}{p}\right)^{(z-k)} & \text{if } k \leq z \\
1 & \text{if } k > z
\end{array}
\right.
\]

重新整理以避免对分布的无穷尾部求和......

\[
1 - \sum_{k=0}^{z} \frac{\lambda^k e^{-\lambda}}{k!} \left(1-\left(\frac{q}{p}\right)^{(z-k)}\right)
\]

转换为 C 代码......

```c
#include math.h

double AttackerSuccessProbability(double q, int z)
{
    double p = 1.0 - q;
    double lambda = z * (q / p);
    double sum = 1.0;
    int i, k;
    for (k = 0; k = z; k++)
    {
        double poisson = exp(-lambda);
        for (i = 1; i = k; i++)
            poisson *= lambda / i;
        sum -= poisson * (1 - pow(q / p, z - k));
    }
    return sum;
}

运行一些结果,我们可以看到概率随 z 呈指数下降。

q=0.1
z=0 P=1.0000000
z=1 P=0.2045873
z=2 P=0.0509779
z=3 P=0.0131722
z=4 P=0.0034552
z=5 P=0.0009137
z=6 P=0.0002428
z=7 P=0.0000647
z=8 P=0.0000173
z=9 P=0.0000046
z=10 P=0.0000012

q=0.3
z=0 P=1.0000000
z=5 P=0.1773523
z=10 P=0.0416605
z=15 P=0.0101008
z=20 P=0.0024804
z=25 P=0.0006132
z=30 P=0.0001522
z=35 P=0.0000379
z=40 P=0.0000095
z=45 P=0.0000024
z=50 P=0.0000006

求解 P 小于 0.1%......

P  0.001
q=0.10 z=5
q=0.15 z=8
q=0.20 z=11
q=0.25 z=15
q=0.30 z=24
q=0.35 z=41
q=0.40 z=89
q=0.45 z=340

Calculations

हम उस परिदृश्य पर विचार करते हैं जिसमें एक हमलावर honest chain से तेज़ एक वैकल्पिक chain उत्पन्न करने का प्रयास कर रहा है। भले ही यह पूरा हो जाए, यह प्रणाली को मनमाने परिवर्तनों के लिए खुला नहीं करता, जैसे शून्य से मूल्य बनाना या ऐसा धन लेना जो कभी हमलावर का नहीं था। nodes एक अमान्य transaction को भुगतान के रूप में स्वीकार नहीं करेंगे, और honest nodes कभी भी उन्हें शामिल करने वाले block को स्वीकार नहीं करेंगे। एक हमलावर केवल अपने स्वयं के transactions में से एक को बदलने का प्रयास कर सकता है ताकि उसने हाल ही में खर्च किया गया धन वापस ले सके।

honest chain और हमलावर chain के बीच की दौड़ को एक Binomial Random Walk के रूप में वर्णित किया जा सकता है। सफलता की घटना honest chain का एक block से विस्तार है, जो इसकी बढ़त को +1 बढ़ाता है, और विफलता की घटना हमलावर की chain का एक block से विस्तार है, जो अंतर को -1 कम करता है।

किसी दिए गए घाटे से हमलावर के पकड़ने की संभावना Gambler's Ruin समस्या के समान है। मान लीजिए असीमित credit वाला एक जुआरी घाटे से शुरू करता है और breakeven तक पहुँचने के लिए संभावित रूप से अनंत trials खेलता है। हम उसके कभी breakeven पहुँचने, या हमलावर के कभी honest chain तक पकड़ने की संभावना की गणना इस प्रकार कर सकते हैं [^8]:

p = probability an honest node finds the next block
q = probability the attacker finds the next block
q = probability the attacker will ever catch up from z blocks behind
``````

\[
qz =
\begin{cases}
1 & \text{if } p \leq q \\
\left(\frac{q}{p}\right) z & \text{if } p > q
\end{cases}
\]

हमारी इस धारणा को देखते हुए कि p  q, जैसे-जैसे हमलावर को पकड़ने के लिए blocks की संख्या बढ़ती है, संभावना exponentially गिरती है। यदि वह शुरू में भाग्यशाली छलांग नहीं लगाता, तो जैसे-जैसे वह पीछे रहता जाता है उसकी संभावनाएँ अत्यंत कम हो जाती हैं।

अब हम विचार करते हैं कि एक नए transaction के प्राप्तकर्ता को पर्याप्त रूप से निश्चित होने से पहले कितनी देर प्रतीक्षा करनी होगी कि प्रेषक transaction को बदल नहीं सकता। हम मानते हैं कि प्रेषक एक हमलावर है जो प्राप्तकर्ता को कुछ समय तक विश्वास दिलाना चाहता है कि उसने उसे भुगतान किया, फिर कुछ समय बीतने के बाद इसे अपने आप को वापस भुगतान करने के लिए बदल देता है। जब ऐसा होगा तो प्राप्तकर्ता को सतर्क किया जाएगा, लेकिन प्रेषक आशा करता है कि तब तक बहुत देर हो चुकी होगी।

प्राप्तकर्ता एक नई key pair उत्पन्न करता है और signing से कुछ समय पहले public key प्रेषक को देता है। यह प्रेषक को समय से पहले blocks की एक chain तैयार करने से रोकता है जिस पर वह लगातार काम करता रहे जब तक कि वह पर्याप्त आगे निकलने के लिए भाग्यशाली न हो जाए, फिर उस क्षण transaction निष्पादित करे। एक बार transaction भेज दिया जाता है, बेईमान प्रेषक अपने transaction के एक वैकल्पिक संस्करण वाली एक समानांतर chain पर गुप्त रूप से काम करना शुरू करता है।

प्राप्तकर्ता तब तक प्रतीक्षा करता है जब तक transaction एक block में जोड़ दिया जाता है और z blocks इसके बाद जोड़ दिए जाते हैं। उसे हमलावर द्वारा की गई प्रगति की सटीक मात्रा नहीं पता, लेकिन यह मानते हुए कि honest blocks ने प्रति block अपेक्षित औसत समय लिया, हमलावर की संभावित प्रगति अपेक्षित मूल्य वाला एक Poisson distribution होगी:

\[
\lambda = z\frac{q}{p}
\]

हमलावर के अभी भी पकड़ सकने की संभावना प्राप्त करने के लिए, हम उसकी प्रगति की प्रत्येक संभावित मात्रा के लिए Poisson density को उस बिंदु से पकड़ सकने की संभावना से गुणा करते हैं:

\[
\sum_{k=0}^{\infty} \frac{\lambda^k e^{-\lambda}}{k!} \cdot \left\{
\begin{array}{cl}
\left(\frac{q}{p}\right)^{(z-k)} & \text{if } k \leq z \\
1 & \text{if } k > z
\end{array}
\right.
\]

distribution की अनंत पूँछ के योग से बचने के लिए पुनर्व्यवस्थित करने पर...

\[
1 - \sum_{k=0}^{z} \frac{\lambda^k e^{-\lambda}}{k!} \left(1-\left(\frac{q}{p}\right)^{(z-k)}\right)
\]

C code में परिवर्तित करने पर...

```c
#include math.h

double AttackerSuccessProbability(double q, int z)
{
    double p = 1.0 - q;
    double lambda = z * (q / p);
    double sum = 1.0;
    int i, k;
    for (k = 0; k = z; k++)
    {
        double poisson = exp(-lambda);
        for (i = 1; i = k; i++)
            poisson *= lambda / i;
        sum -= poisson * (1 - pow(q / p, z - k));
    }
    return sum;
}

कुछ परिणाम चलाने पर, हम देख सकते हैं कि z के साथ संभावना exponentially गिरती है।

q=0.1
z=0 P=1.0000000
z=1 P=0.2045873
z=2 P=0.0509779
z=3 P=0.0131722
z=4 P=0.0034552
z=5 P=0.0009137
z=6 P=0.0002428
z=7 P=0.0000647
z=8 P=0.0000173
z=9 P=0.0000046
z=10 P=0.0000012

q=0.3
z=0 P=1.0000000
z=5 P=0.1773523
z=10 P=0.0416605
z=15 P=0.0101008
z=20 P=0.0024804
z=25 P=0.0006132
z=30 P=0.0001522
z=35 P=0.0000379
z=40 P=0.0000095
z=45 P=0.0000024
z=50 P=0.0000006

P को 0.1% से कम के लिए हल करने पर...

P  0.001
q=0.10 z=5
q=0.15 z=8
q=0.20 z=11
q=0.25 z=15
q=0.30 z=24
q=0.35 z=41
q=0.40 z=89
q=0.45 z=340

Conclusion

我们提出了一种不依赖信任的电子交易系统。我们从由数字签名构成的货币的通常框架开始,这提供了对所有权的强有力控制,但如果没有防止双重支付的方法则是不完整的。为了解决这个问题,我们提出了一种使用 proof-of-work 的点对点网络来记录交易的公共历史,如果诚实节点控制了大多数 CPU 算力,对攻击者来说更改记录在计算上很快就变得不可行。该网络在其非结构化的简单性中是健壮的。节点同时工作,几乎不需要协调。它们不需要被识别,因为消息不会被路由到任何特定的地方,只需要以尽最大努力的方式传递。节点可以随时离开和重新加入网络,接受 proof-of-work 链作为其离开期间所发生事件的证明。它们用自己的 CPU 算力投票,通过在有效区块上扩展来表示接受,通过拒绝在无效区块上工作来表示拒绝。任何需要的规则和激励都可以通过这种共识机制来执行。

Conclusion

हमने विश्वास पर निर्भर किए बिना इलेक्ट्रॉनिक transactions के लिए एक प्रणाली प्रस्तावित की है। हमने digital signatures से बने coins के सामान्य ढाँचे से शुरुआत की, जो स्वामित्व का मज़बूत नियंत्रण प्रदान करता है, लेकिन double-spending को रोकने के तरीके के बिना अपूर्ण है। इसे हल करने के लिए, हमने transactions के सार्वजनिक इतिहास को रिकॉर्ड करने के लिए proof-of-work का उपयोग करने वाला एक peer-to-peer network प्रस्तावित किया जो तेज़ी से किसी हमलावर के लिए बदलना कम्प्यूटेशनल रूप से अव्यावहारिक हो जाता है यदि honest nodes CPU शक्ति के बहुमत को नियंत्रित करते हैं। network अपनी असंरचित सरलता में मज़बूत है। nodes सभी एक साथ न्यूनतम समन्वय के साथ काम करते हैं। उन्हें पहचाने जाने की आवश्यकता नहीं है, क्योंकि संदेश किसी विशेष स्थान पर रूट नहीं किए जाते और केवल best effort के आधार पर वितरित किए जाने की आवश्यकता है। nodes अपनी इच्छा से network छोड़ सकते हैं और पुनः जुड़ सकते हैं, proof-of-work chain को उनकी अनुपस्थिति के दौरान जो हुआ उसके प्रमाण के रूप में स्वीकार करते हुए। वे अपनी CPU शक्ति से मतदान करते हैं, वैध blocks पर काम करके उन्हें बढ़ाकर अपनी स्वीकृति व्यक्त करते हैं और अमान्य blocks पर काम करने से इनकार करके उन्हें अस्वीकार करते हैं। कोई भी आवश्यक नियम और प्रोत्साहन इस consensus mechanism के साथ लागू किए जा सकते हैं।

References


  1. W. Dai, "b-money," http://www.weidai.com/bmoney.txt, 1998.

  2. H. Massias, X.S. Avila, and J.-J. Quisquater, "Design of a secure timestamping service with minimal trust requirements," In 20th Symposium on Information Theory in the Benelux, May 1999.

  3. S. Haber, W.S. Stornetta, "How to time-stamp a digital document," In Journal of Cryptology, vol 3, no 2, pages 99-111, 1991.

  4. D. Bayer, S. Haber, W.S. Stornetta, "Improving the efficiency and reliability of digital time-stamping," In Sequences II: Methods in Communication, Security and Computer Science, pages 329-334, 1993.

  5. S. Haber, W.S. Stornetta, "Secure names for bit-strings," In Proceedings of the 4th ACM Conference on Computer and Communications Security, pages 28-35, April 1997.

  6. A. Back, "Hashcash - a denial of service counter-measure," http://www.hashcash.org/papers/hashcash.pdf, 2002.

  7. R.C. Merkle, "Protocols for public key cryptosystems," In Proc. 1980 Symposium on Security and Privacy, IEEE Computer Society, pages 122-133, April 1980.

  8. W. Feller, "An introduction to probability theory and its applications," 1957.

References


  1. W. Dai, "b-money," http://www.weidai.com/bmoney.txt, 1998.

  2. H. Massias, X.S. Avila, and J.-J. Quisquater, "Design of a secure timestamping service with minimal trust requirements," In 20th Symposium on Information Theory in the Benelux, May 1999.

  3. S. Haber, W.S. Stornetta, "How to time-stamp a digital document," In Journal of Cryptology, vol 3, no 2, pages 99-111, 1991.

  4. D. Bayer, S. Haber, W.S. Stornetta, "Improving the efficiency and reliability of digital time-stamping," In Sequences II: Methods in Communication, Security and Computer Science, pages 329-334, 1993.

  5. S. Haber, W.S. Stornetta, "Secure names for bit-strings," In Proceedings of the 4th ACM Conference on Computer and Communications Security, pages 28-35, April 1997.

  6. A. Back, "Hashcash - a denial of service counter-measure," http://www.hashcash.org/papers/hashcash.pdf, 2002.

  7. R.C. Merkle, "Protocols for public key cryptosystems," In Proc. 1980 Symposium on Security and Privacy, IEEE Computer Society, pages 122-133, April 1980.

  8. W. Feller, "An introduction to probability theory and its applications," 1957.