Nagtataka ba kayo kung bakit hindi posible na manghula ng private key mula sa bitcoin address? Paano naitatago ng private key ang iyong pondo ng ligtas? Paano nabubuo ang signatures gamit ang private key pero maaaring maverify gamit lamang ang public key? Ang sagot sa mga kataanungan na ito ay ang Elliptic Curve Cryptography (ECC). Kahit na ang ECC ay hindi na kakaiba sa Bitcoin at ito ay naipakilala na ng mabuti bago pa ang Bitcoin pero ito ay ang pinaka importanteng kailangan sa Bitcoin. Sa loob lamang ng ilang linya ng code, ang ECC ay sinisiguradong ang pondo sa address ay mananatiling ligtas at ang tao lamang na may hawak ng private key ang may karapatan sa pondo.
Ok! Ngayon ay tumungo tayo sa mas malalim na parte ng paksa. Hindi ko ipapaliwanag ang basic sa Elliptic Curve Cryptography dito sa thread. Ngunit bibigyan pansin ko ang mahalagang kasangkapan ng ECC kung saan ginagamit sa Bitcoin at ipapaliwanag lamang ang mga bagay patungkol sa Bitcoin upang madaling maintindihan ang mga bagay tungkol sa Bitcoin.
Ang Bitcoin ay gumagamit ng ispesipikong elliptic curve na mas kilala sa secp256k1. Ang SECG ay natutukoy ang eksaktong halaga ng iba-ibang parameters na ginagamit sa kalkulasyon para sa secp256k1 curve. Mayroong kabuuang 6 na parameters ngunit 3 lamang ang kailangan natin para sa kalkulasyon. Tignan muna natin ang tatlong parameters muna:
P = 2256 - 232 - 29 - 28 - 27 - 26 - 24 - 1
G = 04 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8
n = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141
Ang mga halagang ito ay nakakalito pa sa ngayon pero sabay-sabay nating unawain sila. Ang P ay ang pinakamalaking prime number na ginagamit para ma-calculate ang mod sa formula.
G ay ang generator point. Ito ay may 3 parte:
(i) ang 04 ay nagpapakita ng ang punto ay nasa uncompressed form.
(ii) ang sunod na 64 na karakter ay hexadecimal representation ng X-axis ng generator point kung saan kapag ito ay nai-convert sa integer ay magiging ganito: 55066263022277343669578718895168534326250603453777594175500187360389116729240
(iii) ang sunod na 64 na karakter ay hexadecimal representation ng Y-axis ng generator point kung saan kapag ito ay nai-convert sa integer ay magiging ganito: 32670510020758816978083085130507043184471273380659243275938904335757337482424
Nag-aral naman kayo ng mathematics kung saan ang punto na (2,4) ay nangangahulugan ang punto ng 2 ay nasa X-axis at ang 4 ay nasa Y-axis. Parang ganito:
Kaparehas sa G point kung saan walang anuman maliban sap unto sa graph na may malaking coordinates katulad nito:
At ang huli, ang n ay nagrerepresenta ng pinakamataas na halagang integer sa private key. Anumang numero sa pagitan ng 0 at n ay valid na private key. ang “n” kapag ipapalit sa integer ay ganitong numero: 115792089237316195423570985008687907852837564279074904382605163141518161494337.
Mayroong tatlong formula na binubuo ang Elliptic Curve Cryptography na nagngangalang, ECAddition, ECDouble at ECMultiplication. Kahit pa ginagamit natin ang mga termino tulad ng adisyon, pag-doble at multiplikasyon ngunit ang mga kalkulasyon na nandito ay hindi katulad sa kinasanayang adisyon o multiplikasyon. Ito ay mas komplikado. Sabi ko nga sa una, ang thread na ito ay hindi tungkol sa Elliptic Curve Cryptography pero kung paano ito ginagamit sa Bitcoin kung kaya`t hindi ko na ipapaliwanag ang mga formula na ito at kung paano ito nakukuha. Panatilihin natin na ang thread na ito ay simple at nauunawaan.
Ngayon dumako na tayo sa mas importante at interesadong parte. Paano nagagamit ang ECC sa Bitcoin!
Ang sistemang ito ay aplikasyon ng ECC sa private key upang makompyut ang public key:
1. I-convert ang hex ng private key patungo sa Binary representation.
2. Tiyakin ang bilang ng karakter na mayroon sa Binary representation.
3. Sabihin na nating, ang Binary representation ay may 256 na karakter kaya kailangan natin i-apply ang ECMultiply formula sa loob ng 256 na beses. Kasama sa ECMultiply ang pag-apply ngi ECDouble sa G point at kungang binary character ay 1, i-apply ang ECAdd formula sa magiging halaga ng resulta. At kung ang binary character naman ay 0, wag ng gumamit ng ECAdd at tumungo sa susunod na karakter.
4. Tandaan: Hindi natin kailangan i-apply ang ECAdd formula sa unang karakter kahit na ito ay 1.
5. Ulit-ulitin lamang ang proseso at kapag dumako na sa huling punto ay makukuha ang public key pagkatapos ng 256 rounds.
Nakakalito? Unawain ito gamit ang sumusunod na halimbawa: Dahil ang private key ay anumang numero sa pagitan ng 0 at n, ipalagay nating 145 ang ating private. Ang hex representation ng ating private key ay magiging: 0xa8.
Ngayon ayon sa hakbang 1, we have to convert our private key into binary which is: 10010001
Ngayon ayon sa hakbang 2, we have to ascertain the length of our binary which is: 8.
Ngayon ayon sa hakbang 3, we have to do ECMultiply 8 times. Let's do it:
(Gagamitin ko ang maiksing D() para sa ECDouble at A() para sa ECAdd)
Round | Panimulang halaga | Binary Character | ECDouble | ECAdd | Ang halaga sa susunod na round |
Ikauna | G | 1 | Yes | No (read step 4) | D(G) |
Ikalawa | D(G) | 0 | Yes | No (0) | D(D(G)) |
Ikatlo | D(D(G)) | 0 | Yes | No (0) | D(D(D(G))) |
Ikaapat | D(D(D(G))) | 1 | Yes | Yes (1) | A(D(D(D(D(G)))),G) |
Ikalima | A(D(D(D(D(G)))),G) | 0 | Yes | No (0) | D(A(D(D(D(D(G)))),G)) |
Ikaanim | D(A(D(D(D(D(G)))),G)) | 0 | Yes | No (0) | D(D(A(D(D(D(D(G)))),G))) |
Ikapito | D(D(A(D(D(D(D(G)))),G))) | 0 | Yes | No (0) | D(D(D(A(D(D(D(D(G)))),G)))) |
Ikawalo | D(D(D(A(D(D(D(D(G)))),G)))) | 1 | Yes | Yes (1) | A(D(D(D(D(A(D(D(D(D(G)))),G))))),G) |
Kaya ang halagang ito: A(D(D(D(D(A(D(D(D(D(G)))),G))))),G) ay magiging punto sa graph na may dalawang coordinates na (X,Y). Ang puntong ito ang magigi nating public key kung saan maaaring mai-convert sa Bitcoin Address. Ang D() ay nangangahulugang ina-apply natin ang ECDouble formula sa halagang nasa loob ng brackets habang ang A() ay nangangahulugang ina-apply natin ang ECAddition formula sa loob ng brackets. Tandaan na ang ECAddition ay kailangan ng dalawang punto para sa kalkulasyon kung kaya ang unang punto ay ang ating resultang halaga habang ang ikalawang punto naman ay ang G point.
Gusto mong makita ang code na ito ng mas malalim pa? Tignan moa ng isa pang thread na ginawa ni Webtricks kung saan gumawa sya ng Bitcoin Address mula sa private key mula sa scratch: https://bitcointalksearch.org/topic/how-bitcoin-addresses-are-generated-understand-the-math-behind-bitcoin-5223167 . Ibinigay ko ang kumpletong ECAdd, ECDouble at ECMultiply formula jan sa thread bilang Javascript functions. Maaari kang matuto ng mas malalim tungkol sa mga pormulang ito mula sa iba`t-ibang online resources at suriin kung ito ay gumagana sa aking mga code.
So, natapos na natin ang matinding kalkulasyon sa ikatlong hakbang. Ngubit ano nga ang dahilan bakit hindi maaaring baliktarin ang kalkulasyon na ito? Bakit hindi maaaring makompyut ang private key mula sa public key sa pamamagitan ng pag-apply ng ECDouble at ECAdd sa pabaliktad na pasunod-sunod (pagkatapos ginagamit natin ang G bilang input na ang halaga ay alam naman na ng lahat)? Ang dahilan kung bakit invincible ang ECC ay dahil sa gamit ng modulus at modulus inverse sa ECDouble at ECAddition formulas. Ano nga ba ang modulus (o mod) at modulus inverse (o mod inverse)?
Ang Mod ay ang anumang numero sabihin na nating, mod(14,6) ay ang remainder na nakukuha pagkatapos ma-divide ang unang numero sa ikalawa. Halimbawa, kapag ang 14 ay hinati sa 6 magkakaroon ng remainder na 2. Kung kaya ang mod ng 14 at 6 ay 2. Kung saan ang mod inverse naman ay ang numero na kapag minultiply sa unang numero at hinati sa ikalawang numero na magiiwan ng remainder na 1. Halimbawa, ang mod inverse ng 3 at 11 ay 4 dahil kapag ang 3 ay minultiply sa 4, ito ay magbibigay ng resultang 12 kung saan kapag hinati naman ito sa 11 ay mag-iiwan ng remainder na 1.
Ang ECC ay gumagamit ng dalawang parehas na ECDouble at ECAdd. Kaya pagkatapos ng bawat round ng ECMultiply, tayo ay maglalagay ng remainder sa susunod na round. Pabayaan na natin ang anumang sagot (quotient) na nakuha sa kalkulasyon, kung saan ginagawa ang pabaliktad na kalkulasyon na imposible. Halimbawa, kahit na alam nyo na ang remainder ay 2 at ang numero kung saan hinati ang unang numero ay 6, hindi mo maaaring masabi na ang unang numero ay 14 dahil maaaring ito ay 8 o 14 o 20 o anu pa man. Sa ECC, ginagamit ang mod ng maraming beses at higit pa dito, tayo ay gumagamit ng malalaking numero (alalahanin ang P mula sa seksyon 1? Ang P ay ginagamit sa pagkuha ng mod sa ECDouble at ECAdd functions). Kung kaya ito ay imposibleng makuha gamit lamang ang pagbabaliktad ng kalkulasyon.
Sana naman ay nakatulong ang thread na ito ay nagbigay sa inyo ng kaunting kaalaman tungkol sa bitcoin at kung bakit ito ang pinaka magandang inobasyon sa 21st century. Kung may sapat na kayong kaalaman sa ECC at iniisip nyo na may mga dapat pang paunlarin sa thread na ito, maaari nyong idulog kay webtricks, gagawin nya ang mga kinakailangang pagbabago.
Kung may mali o error o maling pagkakasalin o ideya, maaaring magreply lamang sa ibaba. Nawa ay nakatulong ako kahit sa pagsasalin lamang nito. Gusto ko din buhayin ang thread na ito sapagkat natabunan na sya ng ibang thread sa beginners and help.