1.Giriş
İnternetteki ticaret, elektronik ödemeleri işlemek için neredeyse yalnızca güvenilir üçüncü taraflar olarak hizmet veren finansal kurumlara güvenmeye başlamıştır. Sistem çoğu işlem için yeterince iyi çalışsa da, güven tabanlı modelin doğasında olan zayıflıklardan muzdariptir. Tamamen geri alınamaz işlemler gerçekten mümkün değildir, çünkü finansal kurumlar anlaşmazlıklara aracılık etmekten kaçınamaz. Arabuluculuğun maliyeti işlem maliyetlerini artırır, minimum pratik işlem boyutunu sınırlar ve küçük gündelik işlemler için olasılığı keser ve geri alınamaz hizmetler için geri alınamaz ödemeler yapma yeteneğinin kaybında daha geniş bir maliyet vardır. Geri alma olasılığıyla birlikte güven ihtiyacı yayılır. Satıcılar müşterilerine karşı temkinli olmalı ve onlardan gereksinim duyacaklarından daha fazla bilgi talep etmelidir. Belirli bir dolandırıcılık yüzdesi kaçınılmaz olarak kabul edilir. Bu maliyetler ve ödeme belirsizlikleri fiziksel para kullanarak yüz yüze önlenebilir, ancak güvenilir bir taraf olmadan bir iletişim kanalı üzerinden ödeme yapmak için hiçbir mekanizma yoktur.
Gereken şey, güven yerine kriptografik kanıta dayalı, her iki istekli tarafın güvenilir bir üçüncü tarafa ihtiyaç duymadan doğrudan birbirleriyle işlem yapmasına izin veren elektronik bir ödeme sistemidir. Hesaplama açısından geri alınması pratik olmayan işlemler satıcıları dolandırıcılıktan korur ve alıcıları korumak için rutin emanet mekanizmaları kolayca uygulanabilir. Bu makalede, işlemlerin kronolojik sırasının hesaplama kanıtını üretmek için eşler arası dağıtılmış bir zaman damgası sunucusu kullanarak çift harcama sorununa bir çözüm öneriyoruz. Sistem, dürüst düğümler toplu olarak herhangi bir işbirliği yapan saldırgan düğüm grubundan daha fazla CPU gücü kontrol ettiği sürece güvenlidir.
2.İşlemler
Elektronik bir parayı dijital imza zinciri olarak tanımlıyoruz. Her sahip, önceki işlemin hashini ve sonraki sahibin genel anahtarını dijital olarak imzalayarak ve bunları paranın sonuna ekleyerek parayı bir sonrakine aktarır. Alıcı, imzaları doğrulayarak sahiplik zincirini doğrulayabilir.
Sorun elbette alıcının sahiplerden birinin parayı çift harcamadığını doğrulayamamasıdır. Yaygın bir çözüm, her işlemi çift harcama için kontrol eden güvenilir bir merkezi otorite veya darphane tanıtmaktır. Her işlemden sonra, yeni bir para basmak için paranın darphaneye iade edilmesi gerekir ve yalnızca doğrudan darphaneden çıkarılan paraların çift harcanmadığına güvenilir. Bu çözümün sorunu, tüm para sisteminin kaderinin darphaneyi işleten şirkete bağlı olması ve her işlemin tıpkı bir banka gibi onlardan geçmek zorunda olmasıdır.
Alıcının önceki sahiplerin daha önceki işlemleri imzalamadığını bilmesi için bir yola ihtiyacımız var. Amaçlarımız için, en erken işlem önemli olanıdır, bu yüzden daha sonraki çift harcama girişimlerini umursamıyoruz. Bir işlemin yokluğunu doğrulamanın tek yolu tüm işlemlerin farkında olmaktır. Darphane tabanlı modelde, darphane tüm işlemlerin farkındaydı ve hangisinin önce geldiğine karar verdi. Güvenilir bir taraf olmadan bunu başarmak için, işlemler kamuya açıklanmalıdır [1] ve katılımcıların alındıkları sıranın tek bir geçmişi üzerinde anlaşması için bir sisteme ihtiyacımız var. Alıcı, her işlem sırasında düğümlerin çoğunluğunun bunun ilk alınan olduğunu kabul ettiğine dair kanıta ihtiyaç duyar.
3.Zaman Damgası Sunucusu
Önerdiğimiz çözüm bir zaman damgası sunucusuyla başlar. Bir zaman damgası sunucusu, zaman damgalanacak bir blok öğesinin hashini alarak ve hashini geniş çapta yayınlayarak çalışır, örneğin bir gazetede veya Usenet gönderisinde [2-5]. Zaman damgası, verilerin hashine girmek için o zamanda var olması gerektiğini açıkça kanıtlar. Her zaman damgası, hashinde önceki zaman damgasını içerir ve bir zincir oluşturur; her ek zaman damgası öncekileri güçlendirir.
4.İş Kanıtı
Eşler arası temelde dağıtılmış bir zaman damgası sunucusu uygulamak için, gazete veya Usenet gönderileri yerine Adam Back'in Hashcash'ine [6] benzer bir iş kanıtı sistemi kullanmamız gerekecek. İş kanıtı, SHA-256 gibi hash edildiğinde hashin bir dizi sıfır bit ile başladığı bir değeri aramayı içerir. Gerekli ortalama iş, gerekli sıfır bit sayısında üsteldir ve tek bir hash yürüterek doğrulanabilir.
Zaman damgası ağımız için, bloğun hashine gerekli sıfır bitleri veren bir değer bulunana kadar bloktaki bir nonce'u artırarak iş kanıtını uygularız. CPU çabası iş kanıtını karşılamak için harcandıktan sonra, işi yeniden yapmadan blok değiştirilemez. Daha sonraki bloklar ondan sonra zincirlendiğinden, bloğu değiştirme işi ondan sonraki tüm blokları yeniden yapmayı içerir.
İş kanıtı ayrıca çoğunluk kararında temsili belirleme sorununu çözer. Çoğunluk bir-IP-adresi-bir-oy temelinde olsaydı, birçok IP tahsis edebilen herkes tarafından alt edilebilirdi. İş kanıtı esasen bir-CPU-bir-oydur. Çoğunluk kararı, en büyük iş kanıtı çabasının yatırıldığı en uzun zincirle temsil edilir. CPU gücünün çoğunluğu dürüst düğümler tarafından kontrol ediliyorsa, dürüst zincir en hızlı büyür ve rakip zincirleri geride bırakır. Geçmiş bir bloğu değiştirmek için, bir saldırgan bloğun ve ondan sonraki tüm blokların iş kanıtını yeniden yapmak ve ardından dürüst düğümlerin işine yetişip onu aşmak zorunda kalır. Daha sonraki bloklar eklendikçe daha yavaş bir saldırganın yetişme olasılığının üstel olarak azaldığını daha sonra göstereceğiz.
Artan donanım hızını ve zaman içinde düğüm çalıştırmaya yönelik değişen ilgiyi telafi etmek için, iş kanıtı zorluğu saatte ortalama blok sayısını hedefleyen hareketli bir ortalama ile belirlenir. Çok hızlı üretilirlerse, zorluk artar.
5.Ağ
Ağı çalıştırma adımları şunlardır:
- Yeni işlemler tüm düğümlere yayınlanır.
- Her düğüm yeni işlemleri bir blokta toplar.
- Her düğüm bloğu için zor bir iş kanıtı bulmaya çalışır.
- Bir düğüm bir iş kanıtı bulduğunda, bloğu tüm düğümlere yayınlar.
- Düğümler bloğu yalnızca içindeki tüm işlemler geçerliyse ve zaten harcanmamışsa kabul eder.
- Düğümler, kabul edilen bloğun hashini önceki hash olarak kullanarak zincirdeki sonraki bloğu oluşturmak için çalışarak bloğu kabul ettiklerini ifade eder.
Düğümler her zaman en uzun zinciri doğru olan olarak kabul eder ve onu genişletmek için çalışmaya devam eder. İki düğüm aynı anda sonraki bloğun farklı sürümlerini yayınlarsa, bazı düğümler birini veya diğerini önce alabilir. Bu durumda, ilk aldıkları üzerinde çalışırlar, ancak diğer dalı daha uzun olması ihtimaline karşı kaydederler. Bir sonraki iş kanıtı bulunduğunda ve bir dal daha uzun olduğunda beraberlik bozulur; diğer dal üzerinde çalışan düğümler daha uzun olana geçer.
Yeni işlem yayınlarının tüm düğümlere ulaşması gerekmez. Birçok düğüme ulaştıkları sürece, kısa süre içinde bir bloğa girerler. Blok yayınları da düşen mesajlara toleranslıdır. Bir düğüm bir blok almazsa, sonraki bloğu aldığında ve birini kaçırdığını fark ettiğinde onu isteyecektir.
6.Teşvik
Geleneksel olarak, bir bloktaki ilk işlem, bloğun yaratıcısına ait yeni bir para başlatan özel bir işlemdir. Bu, düğümlerin ağı desteklemesi için bir teşvik ekler ve merkezi bir otorite olmadığı için başlangıçta paraları dolaşıma dağıtmanın bir yolunu sağlar. Sabit miktarda yeni para eklenmesi, altın madencilerinin dolaşıma altın eklemek için kaynak harcamasına benzer. Bizim durumumuzda, harcanan CPU zamanı ve elektriktir.
Teşvik ayrıca işlem ücretleriyle de finanse edilebilir. Bir işlemin çıktı değeri girdi değerinden azsa, fark, işlemi içeren bloğun teşvik değerine eklenen bir işlem ücretidir. Önceden belirlenmiş bir miktar para dolaşıma girdikten sonra, teşvik tamamen işlem ücretlerine geçebilir ve tamamen enflasyonsuz olabilir.
Teşvik, düğümleri dürüst kalmaya teşvik etmeye yardımcı olabilir. Açgözlü bir saldırgan tüm dürüst düğümlerden daha fazla CPU gücü toplayabilirse, bunu ödemelerini geri çalarak insanları dolandırmak için mi yoksa yeni paralar üretmek için mi kullanacağını seçmek zorunda kalır. Kurallara uymanın, kendi servetinin geçerliliğini ve sistemi baltalamaktan daha kârlı olduğunu görmelidir; bu kurallar ona diğer herkesin toplamından daha fazla yeni para sağlar.
7.Disk Alanını Geri Kazanma
Bir paradaki en son işlem yeterince blok altına gömüldüğünde, ondan önceki harcanmış işlemler disk alanı kazanmak için atılabilir. Bloğun hashini bozmadan bunu kolaylaştırmak için, işlemler bir Merkle Ağacında [7][2][5] hashlenir ve bloğun hashine yalnızca kök dahil edilir. Eski bloklar daha sonra ağacın dallarını keserek sıkıştırılabilir. İç hashlerin saklanması gerekmez.
İşlemsiz bir blok başlığı yaklaşık 80 bayt olur. Blokların her 10 dakikada bir üretildiğini varsayarsak, 80 bayt × 6 × 24 × 365 = yılda 4,2MB. 2008 itibarıyla bilgisayar sistemleri genellikle 2GB RAM ile satılıyor ve Moore Yasası yılda 1,2GB büyüme öngörüyor, blok başlıkları bellekte tutulmak zorunda olsa bile depolama bir sorun olmamalıdır.
8.Basitleştirilmiş Ödeme Doğrulaması
Tam bir ağ düğümü çalıştırmadan ödemeleri doğrulamak mümkündür. Bir kullanıcının yalnızca en uzun iş kanıtı zincirinin blok başlıklarının bir kopyasını tutması gerekir; bunu, en uzun zincire sahip olduğuna ikna olana kadar ağ düğümlerini sorgulayarak elde edebilir ve işlemi zaman damgalandığı bloğa bağlayan Merkle dalını alabilir. İşlemi kendisi kontrol edemez, ancak onu zincirdeki bir yere bağlayarak, bir ağ düğümünün onu kabul ettiğini görebilir ve ondan sonra eklenen bloklar ağın onu kabul ettiğini daha da doğrular.
Bu nedenle, dürüst düğümler ağı kontrol ettiği sürece doğrulama güvenilirdir, ancak ağ bir saldırgan tarafından güçsüz bırakılırsa daha savunmasızdır. Ağ düğümleri işlemleri kendileri doğrulayabilirken, basitleştirilmiş yöntem, saldırgan ağı güçsüz bırakmaya devam edebildiği sürece saldırganın uydurma işlemleriyle kandırılabilir. Buna karşı korunmak için bir strateji, ağ düğümleri geçersiz bir blok algıladığında uyarıları kabul etmek olabilir; bu, kullanıcının yazılımını tam bloğu ve uyarılan işlemleri indirerek tutarsızlığı doğrulamaya teşvik eder. Sık ödeme alan işletmeler, daha bağımsız güvenlik ve daha hızlı doğrulama için muhtemelen kendi düğümlerini çalıştırmak isteyecektir.
9.Değeri Birleştirme ve Bölme
Paraları ayrı ayrı ele almak mümkün olsa da, bir transferde her kuruş için ayrı bir işlem yapmak hantal olurdu. Değerin bölünmesine ve birleştirilmesine izin vermek için, işlemler birden çok girdi ve çıktı içerir. Normalde, daha büyük bir önceki işlemden tek bir girdi veya daha küçük tutarları birleştiren birden çok girdi ve en fazla iki çıktı olacaktır: biri ödeme için ve biri varsa değişimi gönderene geri döndüren.
Bir işlemin birkaç işleme bağlı olduğu ve bu işlemlerin daha fazlasına bağlı olduğu fan-out'un burada bir sorun olmadığı belirtilmelidir. Bir işlemin geçmişinin tamamen bağımsız bir kopyasını çıkarmaya asla gerek yoktur.
10.Gizlilik
Geleneksel bankacılık modeli, bilgiye erişimi ilgili taraflarla ve güvenilir üçüncü taraf ile sınırlayarak bir gizlilik düzeyi elde eder. Tüm işlemleri kamuya açıklama zorunluluğu bu yöntemi engeller, ancak gizlilik yine de bilgi akışını başka bir yerde keserek korunabilir: genel anahtarları anonim tutarak. Halk, birinin başka birine bir miktar gönderdiğini görebilir, ancak işlemi herhangi biriyle ilişkilendiren bilgi olmadan. Bu, borsalar tarafından yayınlanan bilgi düzeyine benzer; burada bireysel işlemlerin zamanı ve boyutu, "bant", kamuya açıklanır, ancak tarafların kim olduğu söylenmez.
Ek bir güvenlik duvarı olarak, her işlem için yeni bir anahtar çifti kullanılmalıdır; böylece ortak bir sahibe bağlanmaları önlenir. Çok girdili işlemlerle bazı bağlantılar hâlâ kaçınılmazdır; bu, girdilerinin aynı sahibe ait olduğunu zorunlu olarak ortaya çıkarır. Risk, bir anahtarın sahibi açığa çıkarsa, bağlantının aynı sahibe ait diğer işlemleri ortaya çıkarabilmesidir.
11.Hesaplamalar
Dürüst zincirden daha hızlı alternatif bir zincir üretmeye çalışan bir saldırgan senaryosunu ele alıyoruz. Bu başarılsa bile, sistemi keyfi değişikliklere açmaz, örneğin yoktan değer yaratmak veya saldırgana asla ait olmayan parayı almak gibi. Düğümler geçersiz bir işlemi ödeme olarak kabul etmeyecek ve dürüst düğümler onları içeren bir bloğu asla kabul etmeyecektir. Bir saldırgan yalnızca kendi işlemlerinden birini değiştirerek yakın zamanda harcadığı parayı geri almaya çalışabilir.
Dürüst zincir ile saldırgan zinciri arasındaki yarış, bir Binom Rastgele Yürüyüşü olarak karakterize edilebilir. Başarı olayı, dürüst zincirin bir blokla genişletilmesi ve liderliğini +1 artırmasıdır; başarısızlık olayı, saldırganın zincirinin bir blokla genişletilmesi ve farkı −1 azaltmasıdır.
Bir saldırganın belirli bir açıktan yetişme olasılığı, bir Kumar Bazının Batması sorununa benzer. Sınırsız kredisi olan bir kumarbazın bir açıkla başladığını ve başabaş noktasına ulaşmak için potansiyel olarak sonsuz sayıda deneme yaptığını varsayalım. Başabaş noktasına asla ulaşıp ulaşmadığını veya bir saldırganın dürüst zincire asla yetişip yetişmediğini şu şekilde hesaplayabiliriz [8]:
p = dürüst bir düğümün sonraki bloğu bulma olasılığı
q = saldırganın sonraki bloğu bulma olasılığı
qz = saldırganın z blok geriden asla yetişme olasılığı
⎧ 1 eğer p ≤ q
qz = ⎨
⎩ (q/p)^z eğer p > q
p > q varsayımımız göz önüne alındığında, saldırganın yetişmek zorunda olduğu blok sayısı arttıkça olasılık üstel olarak düşer. Olasılıklar ona karşıyken, erken bir şanslı atılım yapmazsa, daha da geride kaldıkça şansları yok denecek kadar azalır.
Şimdi, yeni bir işlemin alıcısının, gönderenin işlemi değiştiremeyeceğinden yeterince emin olmadan önce ne kadar beklemesi gerektiğini ele alıyoruz. Gönderenin, alıcıya bir süre ödeme yaptığına inandırmak isteyen ve sonra bir süre geçtikten sonra kendisine geri ödemek için değiştirmek isteyen bir saldırgan olduğunu varsayıyoruz. Alıcı bu olduğunda uyarılacaktır, ancak gönderen çok geç olacağını umar.
Alıcı yeni bir anahtar çifti üretir ve imzalamadan kısa bir süre önce genel anahtarı gönderene verir. Bu, gönderenin önceden bir blok zinciri hazırlamasını, yeterince ileri gitmek için sürekli üzerinde çalışarak ve o anda işlemi yürüterek engeller. İşlem gönderildikten sonra, dürüst olmayan gönderen, işleminin alternatif bir sürümünü içeren paralel bir zincir üzerinde gizlice çalışmaya başlar.
Alıcı, işlemin bir bloğa eklenmesini ve ardından z bloğun bağlanmasını bekler. Saldırganın ne kadar ilerleme kaydettiğini tam olarak bilmez, ancak dürüst blokların blok başına ortalama beklenen süreyi aldığını varsayarsak, saldırganın potansiyel ilerlemesi beklenen değerle bir Poisson dağılımı olacaktır:
λ = z (q/p)
Saldırganın şu anda hâlâ yetişme olasılığını elde etmek için, yapmış olabileceği her ilerleme miktarı için Poisson yoğunluğunu, o noktadan yetişme olasılığıyla çarparız:
∞
Σ (λ^k e^−λ / k!) · (q/p)^(z−k) if k ≤ z
k=0
C koduna dönüştürme...
#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;
}
Bazı sonuçları çalıştırdığımızda, olasılığın z ile üstel olarak düştüğünü görebiliriz.
q=0.1
z=0 P=1.0000000 z=5 P=0.0009137
z=1 P=0.2045873 z=6 P=0.0002428
z=2 P=0.0509779 z=7 P=0.0000647
z=3 P=0.0131722 z=8 P=0.0000173
z=4 P=0.0034552 z=9 P=0.0000046
z=10 P=0.0000012
q=0.3
z=0 P=1.0000000
z=5 P=0.1773523 z=30 P=0.0001522
z=10 P=0.0416605 z=35 P=0.0000379
z=15 P=0.0101008 z=40 P=0.0000095
z=20 P=0.0024804 z=45 P=0.0000024
z=25 P=0.0006132 z=50 P=0.0000006
P'nin %0.1'den küçük olması için çözüm...
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
12.Sonuç
Güvene dayanmayan elektronik işlemler için bir sistem önerdik. Dijital imzalardan yapılan olağan coin çerçevesiyle başladık; bu, sahiplik üzerinde güçlü kontrol sağlar, ancak çifte harcamayı önlemenin bir yolu olmadan eksiktir. Bunu çözmek için, işlemlerin herkese açık geçmişini kaydetmek için iş kanıtı kullanan eşler arası bir ağ önerdik; dürüst düğümler CPU gücünün çoğunluğunu kontrol ediyorsa, bir saldırganın bunu değiştirmesi hesaplama açısından hızla pratik olmaz hale gelir. Ağ, yapısız basitliğiyle sağlamdır. Düğümler az koordinasyonla aynı anda çalışır. Tanımlanmaları gerekmez, çünkü mesajlar belirli bir yere yönlendirilmez ve yalnızca en iyi çaba temelinde teslim edilmesi gerekir. Düğümler istedikleri zaman ağdan ayrılabilir ve yeniden katılabilir; yokken olanların kanıtı olarak iş kanıtı zincirini kabul ederler. CPU güçleriyle oy verirler, geçerli blokları genişleterek kabul ettiklerini ve geçersiz bloklar üzerinde çalışmayı reddederek reddettiklerini ifade ederler. Gerekli tüm kurallar ve teşvikler bu fikir birliği mekanizmasıyla uygulanabilir.
Referanslar
[1] W. Dai, "b-money," http://www.weidai.com/bmoney.txt, 1998.
[2] H. Massias, X.S. Avila, ve 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, sayfa 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, sayfa 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, sayfa 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, sayfa 122-133, April 1980.
[8] W. Feller, "An introduction to probability theory and its applications," 1957.
Orijinal PDF'i indir (bitcoin.org)