Bitcoin: Sistem Uang Elektronik Peer-to-Peer

Bitcoin: A Peer-to-Peer Electronic Cash System

By Satoshi Nakamoto · 2008

Abstract

A purely peer-to-peer version of electronic cash would allow online payments to be sent directly from one party to another without going through a financial institution. Digital signatures provide part of the solution, but the main benefits are lost if a trusted third party is still required to prevent double-spending. We propose a solution to the double-spending problem using a peer-to-peer network. The network timestamps transactions by hashing them into an ongoing chain of hash-based proof-of-work, forming a record that cannot be changed without redoing the proof-of-work. The longest chain not only serves as proof of the sequence of events witnessed, but proof that it came from the largest pool of CPU power. As long as a majority of CPU power is controlled by nodes that are not cooperating to attack the network, they'll generate the longest chain and outpace attackers. The network itself requires minimal structure. Messages are broadcast on a best effort basis, and nodes can leave and rejoin the network at will, accepting the longest proof-of-work chain as proof of what happened while they were gone.

Abstract

Sebuah versi murni peer-to-peer dari uang elektronik akan memungkinkan pembayaran online dikirim langsung dari satu pihak ke pihak lain tanpa melalui lembaga keuangan. Tanda tangan digital menyediakan sebagian dari solusi, tetapi manfaat utama akan hilang jika pihak ketiga yang tepercaya masih diperlukan untuk mencegah double-spending. Kami mengusulkan solusi untuk masalah double-spending menggunakan jaringan peer-to-peer. Jaringan memberi cap waktu pada transaksi dengan melakukan hash ke dalam rantai proof-of-work berbasis hash yang berkelanjutan, membentuk catatan yang tidak dapat diubah tanpa mengulang proof-of-work. Rantai terpanjang tidak hanya berfungsi sebagai bukti urutan peristiwa yang disaksikan, tetapi juga bukti bahwa rantai tersebut berasal dari kumpulan daya CPU terbesar. Selama mayoritas daya CPU dikendalikan oleh node yang tidak bekerja sama untuk menyerang jaringan, mereka akan menghasilkan rantai terpanjang dan mengungguli penyerang. Jaringan itu sendiri memerlukan struktur minimal. Pesan disiarkan berdasarkan upaya terbaik, dan node dapat meninggalkan dan bergabung kembali dengan jaringan sesuka hati, menerima rantai proof-of-work terpanjang sebagai bukti atas apa yang terjadi saat mereka pergi.

Introduction

Commerce on the Internet has come to rely almost exclusively on financial institutions serving as trusted third parties to process electronic payments. While the system works well enough for most transactions, it still suffers from the inherent weaknesses of the trust based model. Completely non-reversible transactions are not really possible, since financial institutions cannot avoid mediating disputes. The cost of mediation increases transaction costs, limiting the minimum practical transaction size and cutting off the possibility for small casual transactions, and there is a broader cost in the loss of ability to make non-reversible payments for non-reversible services. With the possibility of reversal, the need for trust spreads. Merchants must be wary of their customers, hassling them for more information than they would otherwise need. A certain percentage of fraud is accepted as unavoidable. These costs and payment uncertainties can be avoided in person by using physical currency, but no mechanism exists to make payments over a communications channel without a trusted party.

What is needed is an electronic payment system based on cryptographic proof instead of trust, allowing any two willing parties to transact directly with each other without the need for a trusted third party. Transactions that are computationally impractical to reverse would protect sellers from fraud, and routine escrow mechanisms could easily be implemented to protect buyers. In this paper, we propose a solution to the double-spending problem using a peer-to-peer distributed timestamp server to generate computational proof of the chronological order of transactions. The system is secure as long as honest nodes collectively control more CPU power than any cooperating group of attacker nodes.

Introduction

Perdagangan di Internet telah bergantung hampir sepenuhnya pada lembaga keuangan yang bertindak sebagai pihak ketiga tepercaya untuk memproses pembayaran elektronik. Meskipun sistem ini berfungsi cukup baik untuk sebagian besar transaksi, sistem ini masih mengalami kelemahan bawaan dari model berbasis kepercayaan. Transaksi yang benar-benar tidak dapat dibatalkan sebenarnya tidak mungkin dilakukan, karena lembaga keuangan tidak dapat menghindari mediasi sengketa. Biaya mediasi meningkatkan biaya transaksi, membatasi ukuran transaksi minimum yang praktis dan menghilangkan kemungkinan transaksi kecil kasual, dan ada biaya yang lebih luas dalam hilangnya kemampuan untuk melakukan pembayaran yang tidak dapat dibatalkan untuk layanan yang tidak dapat dibatalkan. Dengan kemungkinan pembatalan, kebutuhan akan kepercayaan menyebar. Pedagang harus waspada terhadap pelanggan mereka, mengganggu mereka untuk mendapatkan lebih banyak informasi daripada yang seharusnya mereka butuhkan. Persentase tertentu dari penipuan diterima sebagai hal yang tidak dapat dihindari. Biaya-biaya dan ketidakpastian pembayaran ini dapat dihindari secara langsung dengan menggunakan mata uang fisik, tetapi tidak ada mekanisme yang ada untuk melakukan pembayaran melalui saluran komunikasi tanpa pihak yang tepercaya.

Yang dibutuhkan adalah sistem pembayaran elektronik berdasarkan bukti kriptografi alih-alih kepercayaan, yang memungkinkan dua pihak yang bersedia untuk bertransaksi langsung satu sama lain tanpa memerlukan pihak ketiga yang tepercaya. Transaksi yang secara komputasional tidak praktis untuk dibatalkan akan melindungi penjual dari penipuan, dan mekanisme escrow rutin dapat dengan mudah diimplementasikan untuk melindungi pembeli. Dalam makalah ini, kami mengusulkan solusi untuk masalah double-spending menggunakan server cap waktu terdistribusi peer-to-peer untuk menghasilkan bukti komputasional dari urutan kronologis transaksi. Sistem ini aman selama node jujur secara kolektif mengendalikan lebih banyak daya CPU daripada kelompok node penyerang mana pun yang bekerja sama.

Transactions

We define an electronic coin as a chain of digital signatures. Each owner transfers the coin to the next by digitally signing a hash of the previous transaction and the public key of the next owner and adding these to the end of the coin. A payee can verify the signatures to verify the chain of ownership.

Bitcoin transaction chain showing the signature-linked ownership transfer model

The problem of course is the payee can't verify that one of the owners did not double-spend the coin. A common solution is to introduce a trusted central authority, or mint, that checks every transaction for double spending. After each transaction, the coin must be returned to the mint to issue a new coin, and only coins issued directly from the mint are trusted not to be double-spent. The problem with this solution is that the fate of the entire money system depends on the company running the mint, with every transaction having to go through them, just like a bank.

We need a way for the payee to know that the previous owners did not sign any earlier transactions. For our purposes, the earliest transaction is the one that counts, so we don't care about later attempts to double-spend. The only way to confirm the absence of a transaction is to be aware of all transactions. In the mint based model, the mint was aware of all transactions and decided which arrived first. To accomplish this without a trusted party, transactions must be publicly announced [^1], and we need a system for participants to agree on a single history of the order in which they were received. The payee needs proof that at the time of each transaction, the majority of nodes agreed it was the first received.

Transactions

Kami mendefinisikan koin elektronik sebagai rantai tanda tangan digital. Setiap pemilik mentransfer koin ke pemilik berikutnya dengan menandatangani secara digital hash dari transaksi sebelumnya dan kunci publik (public key) pemilik berikutnya, lalu menambahkannya ke ujung koin. Penerima pembayaran dapat memverifikasi tanda tangan untuk memverifikasi rantai kepemilikan.

Bitcoin transaction chain showing the signature-linked ownership transfer model

Masalahnya tentu saja adalah penerima tidak dapat memverifikasi bahwa salah satu pemilik tidak melakukan double-spending terhadap koin tersebut. Solusi umum adalah memperkenalkan otoritas pusat tepercaya, atau percetakan uang, yang memeriksa setiap transaksi untuk double-spending. Setelah setiap transaksi, koin harus dikembalikan ke percetakan uang untuk menerbitkan koin baru, dan hanya koin yang diterbitkan langsung dari percetakan uang yang dipercaya tidak di-double-spend. Masalah dengan solusi ini adalah nasib seluruh sistem uang bergantung pada perusahaan yang menjalankan percetakan uang, dengan setiap transaksi harus melewati mereka, sama seperti bank.

Kita membutuhkan cara bagi penerima untuk mengetahui bahwa pemilik sebelumnya tidak menandatangani transaksi yang lebih awal. Untuk tujuan kita, transaksi paling awal adalah yang dihitung, jadi kita tidak peduli tentang upaya double-spending selanjutnya. Satu-satunya cara untuk mengonfirmasi ketiadaan suatu transaksi adalah mengetahui semua transaksi. Dalam model berbasis percetakan uang, percetakan uang mengetahui semua transaksi dan memutuskan mana yang tiba lebih dulu. Untuk mencapai ini tanpa pihak tepercaya, transaksi harus diumumkan secara publik [^1], dan kita membutuhkan sistem bagi peserta untuk menyepakati satu riwayat urutan penerimaan. Penerima membutuhkan bukti bahwa pada saat setiap transaksi, mayoritas node menyetujui bahwa transaksi tersebut adalah yang pertama diterima.

Timestamp Server

The solution we propose begins with a timestamp server. A timestamp server works by taking a hash of a block of items to be timestamped and widely publishing the hash, such as in a newspaper or Usenet post [^2] [^3] [^4] [^5]. The timestamp proves that the data must have existed at the time, obviously, in order to get into the hash. Each timestamp includes the previous timestamp in its hash, forming a chain, with each additional timestamp reinforcing the ones before it.

Bitcoin timestamp server hash-chain diagram linking blocks and items

Timestamp Server

Solusi yang kami usulkan dimulai dengan server cap waktu. Server cap waktu bekerja dengan mengambil hash dari blok item yang akan diberi cap waktu dan mempublikasikan hash tersebut secara luas, seperti di surat kabar atau posting Usenet [^2] [^3] [^4] [^5]. Cap waktu membuktikan bahwa data pasti sudah ada pada saat itu, tentunya, agar dapat masuk ke dalam hash. Setiap cap waktu menyertakan cap waktu sebelumnya dalam hash-nya, membentuk rantai, dengan setiap cap waktu tambahan memperkuat yang sebelumnya.

Bitcoin timestamp server hash-chain diagram linking blocks and items

Proof-of-Work

To implement a distributed timestamp server on a peer-to-peer basis, we will need to use a proof-of-work system similar to Adam Back's Hashcash [^6], rather than newspaper or Usenet posts. The proof-of-work involves scanning for a value that when hashed, such as with SHA-256, the hash begins with a number of zero bits. The average work required is exponential in the number of zero bits required and can be verified by executing a single hash.

For our timestamp network, we implement the proof-of-work by incrementing a nonce in the block until a value is found that gives the block's hash the required zero bits. Once the CPU effort has been expended to make it satisfy the proof-of-work, the block cannot be changed without redoing the work. As later blocks are chained after it, the work to change the block would include redoing all the blocks after it.

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

The proof-of-work also solves the problem of determining representation in majority decision making. If the majority were based on one-IP-address-one-vote, it could be subverted by anyone able to allocate many IPs. Proof-of-work is essentially one-CPU-one-vote. The majority decision is represented by the longest chain, which has the greatest proof-of-work effort invested in it. If a majority of CPU power is controlled by honest nodes, the honest chain will grow the fastest and outpace any competing chains. To modify a past block, an attacker would have to redo the proof-of-work of the block and all blocks after it and then catch up with and surpass the work of the honest nodes. We will show later that the probability of a slower attacker catching up diminishes exponentially as subsequent blocks are added.

To compensate for increasing hardware speed and varying interest in running nodes over time, the proof-of-work difficulty is determined by a moving average targeting an average number of blocks per hour. If they're generated too fast, the difficulty increases.

Proof-of-Work

Untuk mengimplementasikan server cap waktu terdistribusi secara peer-to-peer, kita perlu menggunakan sistem proof-of-work yang mirip dengan Hashcash milik Adam Back [^6], alih-alih surat kabar atau posting Usenet. Proof-of-work melibatkan pemindaian nilai yang ketika di-hash, seperti dengan SHA-256, hash-nya dimulai dengan sejumlah bit nol. Rata-rata kerja yang diperlukan bersifat eksponensial terhadap jumlah bit nol yang diperlukan dan dapat diverifikasi dengan mengeksekusi satu hash.

Untuk jaringan cap waktu kami, kami mengimplementasikan proof-of-work dengan menambah nonce di blok sampai ditemukan nilai yang memberikan hash blok jumlah bit nol yang diperlukan. Setelah upaya CPU dikeluarkan untuk memenuhi proof-of-work, blok tidak dapat diubah tanpa mengulangi pekerjaan. Karena blok-blok selanjutnya dirangkai setelahnya, pekerjaan untuk mengubah blok akan mencakup pengulangan semua blok setelahnya.

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

Proof-of-work juga memecahkan masalah penentuan representasi dalam pengambilan keputusan mayoritas. Jika mayoritas didasarkan pada satu-alamat-IP-satu-suara, itu bisa disubversi oleh siapa saja yang mampu mengalokasikan banyak IP. Proof-of-work pada dasarnya adalah satu-CPU-satu-suara. Keputusan mayoritas diwakili oleh rantai terpanjang, yang memiliki upaya proof-of-work terbesar yang diinvestasikan di dalamnya. Jika mayoritas daya CPU dikontrol oleh node jujur, rantai jujur akan tumbuh paling cepat dan mengungguli rantai pesaing manapun. Untuk memodifikasi blok masa lalu, penyerang harus mengulangi proof-of-work blok tersebut dan semua blok setelahnya, lalu mengejar dan melampaui pekerjaan node jujur. Kami akan menunjukkan nanti bahwa probabilitas penyerang yang lebih lambat mengejar berkurang secara eksponensial saat blok-blok berikutnya ditambahkan.

Untuk mengkompensasi peningkatan kecepatan perangkat keras dan variasi minat dalam menjalankan node dari waktu ke waktu, kesulitan proof-of-work ditentukan oleh rata-rata bergerak yang menargetkan rata-rata jumlah blok per jam. Jika dihasilkan terlalu cepat, kesulitannya meningkat.

Network

The steps to run the network are as follows:

  1. New transactions are broadcast to all nodes.
  2. Each node collects new transactions into a block.
  3. Each node works on finding a difficult proof-of-work for its block.
  4. When a node finds a proof-of-work, it broadcasts the block to all nodes.
  5. Nodes accept the block only if all transactions in it are valid and not already spent.
  6. Nodes express their acceptance of the block by working on creating the next block in the chain, using the hash of the accepted block as the previous hash.

Nodes always consider the longest chain to be the correct one and will keep working on extending it. If two nodes broadcast different versions of the next block simultaneously, some nodes may receive one or the other first. In that case, they work on the first one they received, but save the other branch in case it becomes longer. The tie will be broken when the next proof-of-work is found and one branch becomes longer; the nodes that were working on the other branch will then switch to the longer one.

New transaction broadcasts do not necessarily need to reach all nodes. As long as they reach many nodes, they will get into a block before long. Block broadcasts are also tolerant of dropped messages. If a node does not receive a block, it will request it when it receives the next block and realizes it missed one.

Network

Langkah-langkah untuk menjalankan jaringan adalah sebagai berikut:

  1. Transaksi baru disiarkan ke semua node.
  2. Setiap node mengumpulkan transaksi baru ke dalam sebuah blok.
  3. Setiap node bekerja untuk menemukan proof-of-work yang sulit untuk bloknya.
  4. Ketika sebuah node menemukan proof-of-work, node tersebut menyiarkan blok ke semua node.
  5. Node menerima blok hanya jika semua transaksi di dalamnya valid dan belum dibelanjakan.
  6. Node mengekspresikan penerimaan mereka terhadap blok dengan bekerja membuat blok berikutnya dalam rantai, menggunakan hash dari blok yang diterima sebagai hash sebelumnya.

Node selalu menganggap rantai terpanjang sebagai yang benar dan akan terus bekerja untuk memperpanjangnya. Jika dua node menyiarkan versi berbeda dari blok berikutnya secara bersamaan, beberapa node mungkin menerima satu atau yang lainnya terlebih dahulu. Dalam kasus itu, mereka bekerja pada yang pertama diterima, tetapi menyimpan cabang lainnya untuk berjaga-jaga jika menjadi lebih panjang. Seri akan diputuskan ketika proof-of-work berikutnya ditemukan dan satu cabang menjadi lebih panjang; node yang bekerja pada cabang lain kemudian akan beralih ke yang lebih panjang.

Siaran transaksi baru tidak harus mencapai semua node. Selama mereka mencapai banyak node, mereka akan masuk ke blok dalam waktu singkat. Siaran blok juga toleran terhadap pesan yang hilang. Jika sebuah node tidak menerima blok, node tersebut akan memintanya ketika menerima blok berikutnya dan menyadari bahwa ada yang terlewat.

Incentive

By convention, the first transaction in a block is a special transaction that starts a new coin owned by the creator of the block. This adds an incentive for nodes to support the network, and provides a way to initially distribute coins into circulation, since there is no central authority to issue them. The steady addition of a constant of amount of new coins is analogous to gold miners expending resources to add gold to circulation. In our case, it is CPU time and electricity that is expended.

The incentive can also be funded with transaction fees. If the output value of a transaction is less than its input value, the difference is a transaction fee that is added to the incentive value of the block containing the transaction. Once a predetermined number of coins have entered circulation, the incentive can transition entirely to transaction fees and be completely inflation free.

The incentive may help encourage nodes to stay honest. If a greedy attacker is able to assemble more CPU power than all the honest nodes, he would have to choose between using it to defraud people by stealing back his payments, or using it to generate new coins. He ought to find it more profitable to play by the rules, such rules that favour him with more new coins than everyone else combined, than to undermine the system and the validity of his own wealth.

Incentive

Secara konvensi, transaksi pertama dalam sebuah blok adalah transaksi khusus yang memulai koin baru yang dimiliki oleh pembuat blok. Ini menambahkan insentif bagi node untuk mendukung jaringan, dan menyediakan cara untuk mendistribusikan koin ke dalam peredaran pada awalnya, karena tidak ada otoritas pusat untuk menerbitkannya. Penambahan tetap sejumlah koin baru secara stabil dianalogikan dengan penambang emas yang mengeluarkan sumber daya untuk menambahkan emas ke peredaran. Dalam kasus kita, yang dikeluarkan adalah waktu CPU dan listrik.

Insentif juga dapat didanai dengan biaya transaksi. Jika nilai output suatu transaksi kurang dari nilai inputnya, selisihnya adalah biaya transaksi yang ditambahkan ke nilai insentif blok yang berisi transaksi tersebut. Setelah sejumlah koin yang telah ditentukan masuk ke peredaran, insentif dapat beralih sepenuhnya ke biaya transaksi dan sepenuhnya bebas inflasi.

Insentif dapat membantu mendorong node untuk tetap jujur. Jika penyerang serakah mampu mengumpulkan lebih banyak daya CPU daripada semua node jujur, ia harus memilih antara menggunakannya untuk menipu orang dengan mencuri kembali pembayarannya, atau menggunakannya untuk menghasilkan koin baru. Ia seharusnya menemukan bahwa bermain sesuai aturan lebih menguntungkan, aturan yang memberinya lebih banyak koin baru daripada semua orang lain digabungkan, daripada merusak sistem dan validitas kekayaannya sendiri.

Reclaiming Disk Space

Once the latest transaction in a coin is buried under enough blocks, the spent transactions before it can be discarded to save disk space. To facilitate this without breaking the block's hash, transactions are hashed in a Merkle Tree [^7] [^2] [^5], with only the root included in the block's hash. Old blocks can then be compacted by stubbing off branches of the tree. The interior hashes do not need to be stored.

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

A block header with no transactions would be about 80 bytes. If we suppose blocks are generated every 10 minutes, 80 bytes * 6 * 24 * 365 = 4.2MB per year. With computer systems typically selling with 2GB of RAM as of 2008, and Moore's Law predicting current growth of 1.2GB per year, storage should not be a problem even if the block headers must be kept in memory.

Reclaiming Disk Space

Setelah transaksi terbaru dalam sebuah koin terkubur di bawah cukup banyak blok, transaksi yang sudah dibelanjakan sebelumnya dapat dibuang untuk menghemat ruang disk. Untuk memfasilitasi ini tanpa merusak hash blok, transaksi di-hash dalam Merkle Tree [^7] [^2] [^5], dengan hanya root yang disertakan dalam hash blok. Blok-blok lama kemudian dapat dipadatkan dengan memangkas cabang-cabang pohon. Hash interior tidak perlu disimpan.

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

Header blok tanpa transaksi akan berukuran sekitar 80 byte. Jika kita mengasumsikan blok dihasilkan setiap 10 menit, 80 byte * 6 * 24 * 365 = 4,2MB per tahun. Dengan sistem komputer yang biasanya dijual dengan RAM 2GB pada tahun 2008, dan Hukum Moore memprediksi pertumbuhan saat ini sebesar 1,2GB per tahun, penyimpanan seharusnya tidak menjadi masalah meskipun header blok harus disimpan di memori.

Simplified Payment Verification

It is possible to verify payments without running a full network node. A user only needs to keep a copy of the block headers of the longest proof-of-work chain, which he can get by querying network nodes until he's convinced he has the longest chain, and obtain the Merkle branch linking the transaction to the block it's timestamped in. He can't check the transaction for himself, but by linking it to a place in the chain, he can see that a network node has accepted it, and blocks added after it further confirm the network has accepted it.

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

As such, the verification is reliable as long as honest nodes control the network, but is more vulnerable if the network is overpowered by an attacker. While network nodes can verify transactions for themselves, the simplified method can be fooled by an attacker's fabricated transactions for as long as the attacker can continue to overpower the network. One strategy to protect against this would be to accept alerts from network nodes when they detect an invalid block, prompting the user's software to download the full block and alerted transactions to confirm the inconsistency. Businesses that receive frequent payments will probably still want to run their own nodes for more independent security and quicker verification.

Simplified Payment Verification

Dimungkinkan untuk memverifikasi pembayaran tanpa menjalankan node jaringan penuh. Pengguna hanya perlu menyimpan salinan header blok dari rantai proof-of-work terpanjang, yang bisa didapatkan dengan menanyakan node jaringan sampai yakin memiliki rantai terpanjang, dan mendapatkan cabang Merkle yang menghubungkan transaksi ke blok tempat transaksi tersebut diberi cap waktu. Pengguna tidak dapat memeriksa transaksi sendiri, tetapi dengan menghubungkannya ke tempat di rantai, pengguna dapat melihat bahwa node jaringan telah menerimanya, dan blok yang ditambahkan setelahnya semakin mengonfirmasi bahwa jaringan telah menerimanya.

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

Dengan demikian, verifikasi dapat diandalkan selama node jujur mengendalikan jaringan, tetapi lebih rentan jika jaringan dikuasai oleh penyerang. Sementara node jaringan dapat memverifikasi transaksi sendiri, metode yang disederhanakan dapat ditipu oleh transaksi palsu penyerang selama penyerang dapat terus menguasai jaringan. Satu strategi untuk melindungi terhadap ini adalah menerima peringatan dari node jaringan ketika mereka mendeteksi blok yang tidak valid, mendorong perangkat lunak pengguna untuk mengunduh blok penuh dan transaksi yang diperingatkan untuk mengonfirmasi inkonsistensi. Bisnis yang menerima pembayaran sering mungkin masih ingin menjalankan node mereka sendiri untuk keamanan yang lebih independen dan verifikasi yang lebih cepat.

Combining and Splitting Value

Although it would be possible to handle coins individually, it would be unwieldy to make a separate transaction for every cent in a transfer. To allow value to be split and combined, transactions contain multiple inputs and outputs. Normally there will be either a single input from a larger previous transaction or multiple inputs combining smaller amounts, and at most two outputs: one for the payment, and one returning the change, if any, back to the sender.

Bitcoin transaction combining and splitting value with multiple inputs and outputs

It should be noted that fan-out, where a transaction depends on several transactions, and those transactions depend on many more, is not a problem here. There is never the need to extract a complete standalone copy of a transaction's history.

Combining and Splitting Value

Meskipun dimungkinkan untuk menangani koin secara individual, akan sangat merepotkan untuk membuat transaksi terpisah untuk setiap sen dalam transfer. Untuk memungkinkan nilai dipecah dan digabungkan, transaksi berisi banyak input dan output. Biasanya akan ada satu input dari transaksi sebelumnya yang lebih besar atau beberapa input yang menggabungkan jumlah lebih kecil, dan paling banyak dua output: satu untuk pembayaran, dan satu mengembalikan kembalian, jika ada, ke pengirim.

Bitcoin transaction combining and splitting value with multiple inputs and outputs

Perlu dicatat bahwa fan-out, di mana suatu transaksi bergantung pada beberapa transaksi, dan transaksi-transaksi tersebut bergantung pada lebih banyak lagi, bukanlah masalah di sini. Tidak pernah ada kebutuhan untuk mengekstrak salinan mandiri lengkap dari riwayat transaksi.

Privacy

The traditional banking model achieves a level of privacy by limiting access to information to the parties involved and the trusted third party. The necessity to announce all transactions publicly precludes this method, but privacy can still be maintained by breaking the flow of information in another place: by keeping public keys anonymous. The public can see that someone is sending an amount to someone else, but without information linking the transaction to anyone. This is similar to the level of information released by stock exchanges, where the time and size of individual trades, the "tape", is made public, but without telling who the parties were.

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

As an additional firewall, a new key pair should be used for each transaction to keep them from being linked to a common owner. Some linking is still unavoidable with multi-input transactions, which necessarily reveal that their inputs were owned by the same owner. The risk is that if the owner of a key is revealed, linking could reveal other transactions that belonged to the same owner.

Privacy

Model perbankan tradisional mencapai tingkat privasi dengan membatasi akses informasi kepada pihak-pihak yang terlibat dan pihak ketiga tepercaya. Keharusan mengumumkan semua transaksi secara publik menghalangi metode ini, tetapi privasi masih dapat dipertahankan dengan memutus aliran informasi di tempat lain: dengan menjaga kunci publik tetap anonim. Publik dapat melihat bahwa seseorang mengirim sejumlah uang kepada orang lain, tetapi tanpa informasi yang menghubungkan transaksi kepada siapa pun. Ini mirip dengan tingkat informasi yang dirilis oleh bursa saham, di mana waktu dan ukuran perdagangan individual, yaitu "tape," dipublikasikan, tetapi tanpa memberi tahu siapa pihak-pihaknya.

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

Sebagai firewall tambahan, pasangan kunci baru harus digunakan untuk setiap transaksi agar tidak terhubung ke pemilik yang sama. Beberapa penautan masih tidak terhindarkan dengan transaksi multi-input, yang secara niscaya mengungkapkan bahwa input-inputnya dimiliki oleh pemilik yang sama. Risikonya adalah jika pemilik suatu kunci terungkap, penautan dapat mengungkapkan transaksi lain yang milik pemilik yang sama.

Calculations

We consider the scenario of an attacker trying to generate an alternate chain faster than the honest chain. Even if this is accomplished, it does not throw the system open to arbitrary changes, such as creating value out of thin air or taking money that never belonged to the attacker. Nodes are not going to accept an invalid transaction as payment, and honest nodes will never accept a block containing them. An attacker can only try to change one of his own transactions to take back money he recently spent.

The race between the honest chain and an attacker chain can be characterized as a Binomial Random Walk. The success event is the honest chain being extended by one block, increasing its lead by +1, and the failure event is the attacker's chain being extended by one block, reducing the gap by -1.

The probability of an attacker catching up from a given deficit is analogous to a Gambler's Ruin problem. Suppose a gambler with unlimited credit starts at a deficit and plays potentially an infinite number of trials to try to reach breakeven. We can calculate the probability he ever reaches breakeven, or that an attacker ever catches up with the honest chain, as follows [^8]:

p = probability an honest node finds the next block
q = probability the attacker finds the next block
qz = 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} \]

Given our assumption that p q, the probability drops exponentially as the number of blocks the attacker has to catch up with increases. With the odds against him, if he doesn't make a lucky lunge forward early on, his chances become vanishingly small as he falls further behind.

We now consider how long the recipient of a new transaction needs to wait before being sufficiently certain the sender can't change the transaction. We assume the sender is an attacker who wants to make the recipient believe he paid him for a while, then switch it to pay back to himself after some time has passed. The receiver will be alerted when that happens, but the sender hopes it will be too late.

The receiver generates a new key pair and gives the public key to the sender shortly before signing. This prevents the sender from preparing a chain of blocks ahead of time by working on it continuously until he is lucky enough to get far enough ahead, then executing the transaction at that moment. Once the transaction is sent, the dishonest sender starts working in secret on a parallel chain containing an alternate version of his transaction.

The recipient waits until the transaction has been added to a block and z blocks have been linked after it. He doesn't know the exact amount of progress the attacker has made, but assuming the honest blocks took the average expected time per block, the attacker's potential progress will be a Poisson distribution with expected value:

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

To get the probability the attacker could still catch up now, we multiply the Poisson density for each amount of progress he could have made by the probability he could catch up from that point:

\[ \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. \]

Rearranging to avoid summing the infinite tail of the distribution...

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

Converting to C code...

#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;
}

Running some results, we can see the probability drop off exponentially with 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

Solving for P less than 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

Kita mempertimbangkan skenario penyerang yang mencoba menghasilkan rantai alternatif lebih cepat dari rantai jujur. Bahkan jika ini tercapai, sistem tidak terbuka untuk perubahan sewenang-wenang, seperti menciptakan nilai dari udara kosong atau mengambil uang yang tidak pernah milik penyerang. Node tidak akan menerima transaksi tidak valid sebagai pembayaran, dan node jujur tidak akan pernah menerima blok yang berisi transaksi tersebut. Penyerang hanya dapat mencoba mengubah salah satu transaksinya sendiri untuk mengambil kembali uang yang baru saja dibelanjakannya.

Perlombaan antara rantai jujur dan rantai penyerang dapat dikarakterisasi sebagai Jalan Acak Binomial. Peristiwa sukses adalah rantai jujur diperpanjang satu blok, meningkatkan keunggulannya sebesar +1, dan peristiwa gagal adalah rantai penyerang diperpanjang satu blok, mengurangi jarak sebesar -1.

Probabilitas penyerang mengejar dari defisit tertentu analog dengan masalah Kebangkrutan Penjudi. Misalkan seorang penjudi dengan kredit tak terbatas mulai dari defisit dan memainkan jumlah percobaan yang berpotensi tak terbatas untuk mencoba mencapai titik impas. Kita dapat menghitung probabilitas ia pernah mencapai titik impas, atau bahwa penyerang pernah mengejar rantai jujur, sebagai berikut [^8]:

p = probabilitas node jujur menemukan blok berikutnya
q = probabilitas penyerang menemukan blok berikutnya
q = probabilitas penyerang akan pernah mengejar dari z blok di belakang
``````

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

Mengingat asumsi kita bahwa p  q, probabilitas turun secara eksponensial seiring bertambahnya jumlah blok yang harus dikejar penyerang. Dengan peluang melawannya, jika ia tidak membuat lompatan beruntung ke depan di awal, peluangnya menjadi sangat kecil saat ia semakin tertinggal.

Sekarang kita mempertimbangkan berapa lama penerima transaksi baru perlu menunggu sebelum cukup yakin bahwa pengirim tidak dapat mengubah transaksi. Kita mengasumsikan pengirim adalah penyerang yang ingin membuat penerima percaya bahwa ia telah membayarnya untuk sementara waktu, kemudian mengalihkan pembayaran kembali ke dirinya sendiri setelah beberapa waktu berlalu. Penerima akan diperingatkan ketika itu terjadi, tetapi pengirim berharap sudah terlambat.

Penerima menghasilkan pasangan kunci baru dan memberikan kunci publik kepada pengirim sesaat sebelum menandatangani. Ini mencegah pengirim menyiapkan rantai blok lebih awal dengan terus bekerja sampai cukup beruntung untuk cukup jauh di depan, lalu mengeksekusi transaksi pada saat itu. Setelah transaksi dikirim, pengirim yang tidak jujur mulai bekerja secara rahasia pada rantai paralel yang berisi versi alternatif transaksinya.

Penerima menunggu sampai transaksi ditambahkan ke blok dan z blok telah ditautkan setelahnya. Ia tidak mengetahui jumlah pasti kemajuan yang telah dibuat penyerang, tetapi dengan mengasumsikan blok jujur mengambil rata-rata waktu yang diharapkan per blok, potensi kemajuan penyerang akan berupa distribusi Poisson dengan nilai harapan:

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

Untuk mendapatkan probabilitas penyerang masih bisa mengejar sekarang, kita mengalikan densitas Poisson untuk setiap jumlah kemajuan yang mungkin telah dibuatnya dengan probabilitas ia bisa mengejar dari titik tersebut:

\[
\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.
\]

Menyusun ulang untuk menghindari penjumlahan ekor tak terbatas dari distribusi...

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

Mengonversi ke kode 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;
}

Menjalankan beberapa hasil, kita dapat melihat probabilitas turun secara eksponensial dengan 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

Menyelesaikan untuk P kurang dari 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

We have proposed a system for electronic transactions without relying on trust. We started with the usual framework of coins made from digital signatures, which provides strong control of ownership, but is incomplete without a way to prevent double-spending. To solve this, we proposed a peer-to-peer network using proof-of-work to record a public history of transactions that quickly becomes computationally impractical for an attacker to change if honest nodes control a majority of CPU power. The network is robust in its unstructured simplicity. Nodes work all at once with little coordination. They do not need to be identified, since messages are not routed to any particular place and only need to be delivered on a best effort basis. Nodes can leave and rejoin the network at will, accepting the proof-of-work chain as proof of what happened while they were gone. They vote with their CPU power, expressing their acceptance of valid blocks by working on extending them and rejecting invalid blocks by refusing to work on them. Any needed rules and incentives can be enforced with this consensus mechanism.

Conclusion

Kami telah mengusulkan sistem untuk transaksi elektronik tanpa bergantung pada kepercayaan. Kami memulai dengan kerangka biasa koin yang dibuat dari tanda tangan digital, yang memberikan kontrol kuat atas kepemilikan, tetapi tidak lengkap tanpa cara untuk mencegah double-spending. Untuk mengatasi ini, kami mengusulkan jaringan peer-to-peer yang menggunakan proof-of-work untuk mencatat riwayat publik transaksi yang dengan cepat menjadi tidak praktis secara komputasi bagi penyerang untuk diubah jika node jujur mengendalikan mayoritas daya CPU. Jaringan ini kuat dalam kesederhanaan tidak terstrukturnya. Node bekerja sekaligus dengan sedikit koordinasi. Mereka tidak perlu diidentifikasi, karena pesan tidak dirutekan ke tempat tertentu manapun dan hanya perlu dikirimkan berdasarkan upaya terbaik. Node dapat meninggalkan dan bergabung kembali dengan jaringan sesuka hati, menerima rantai proof-of-work sebagai bukti atas apa yang terjadi saat mereka pergi. Mereka memilih dengan daya CPU mereka, mengekspresikan penerimaan blok valid dengan bekerja memperpanjangnya dan menolak blok tidak valid dengan menolak bekerja pada blok tersebut. Setiap aturan dan insentif yang diperlukan dapat ditegakkan dengan mekanisme konsensus ini.

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.