比特幣使用了 secp256k1 標準所定義的一條特殊的橢圓曲線和一系列數學常數。該標準由美國國家標準與技術研究院(NIST)設立。secp256k1 曲線由下述函數定義,該函數可產生一條橢圓曲線:
y2 = (x3 + 7)} over (Fp)或 y2 mod p = (x3 + 7) mod p
上述 mod p(素數 p 取模)表明該曲線是在素數階 p 的有限域內,也寫作 Fp, 其中 p = 2256 – 232 – 29– 28 – 27 – 26 – 24 – 1,這是一個非常大的素數。
因為這條曲線被定義在一個素數階的有限域內,而不是定義在實數范圍,它的函數圖像看起來像分散在兩個維度上的散點圖,因此很難畫圖表示。不過,其中 的數學原理與實數范圍的橢圓曲線相似。作為一個例子,下圖顯示了在一個小了很多的素數階 17 的有限域內的橢圓曲線,其形式為網格上的一系列散點。而 secp256k1 的比特幣橢圓曲線可以被想象成一個極大的網格上一系列更為復雜的散點。
下面舉一個例子,這是 secp256k1 曲線上的點 P,其坐標為(x,y)。可以使用
Python 對其檢驗:
P =
(55066263022277343669578718895168534326250603453777594175 500187360389116729240,32670510020758816978083085130507043
184471273380659243275938904335757337482424)
Python 3.4.0 (default, Mar 30 2014, 19:23:13)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> p = 115792089237316195423570985008687907853269984665640564039
457584007908834671663
>>> x = 550662630222773436695787188951685343262506034537775941755
00187360389116729240
>>> y = 326705100207588169780830851305070431844712733806592432759
38904335757337482424
>>> (x ** 3 + 7 - y**2) % p 0
在橢圓曲線的數學原理中,有一個點被稱為"無窮遠點",這大致對應于 0在加法中的作用。計算機中,它有時表示為 X = Y = 0(雖然這不滿足橢圓曲線方程,但可作為特殊情況進行檢驗)。 還有一個 + 運算符,被稱為"加法",就像小學數學中的實數相加。給定橢圓曲線上的兩個點 P1 和 P2,則橢圓曲線上必定有第三點 P3 = P1 + P2。
幾何圖形中,該第三點 P3 可以在 P1 和 P2 之間畫一條線來確定。這條直線恰好與橢圓曲線上的一點相交。此點記為 P3'=(x,y)。然后,在 x 軸做映射獲得P3=(x,-y)。
下面是幾個可以解釋"無窮遠點"之存在需要的特殊情況。 若 P1 和 P2 是同一點,P1 和 P2 間的連線則為點 P1 的切線。曲線上有且只有一個新的點與該切線相交。該切線的斜率可用微分求得。即使限制曲線點為兩個整數坐標也可求得斜率!
在某些情況下(即,如果 P1 和 P2 具有相同的 x 值,但不同的 y 值),則切線會完全垂直,在這種情況下,P3 = "無窮遠點"。
若 P1 就是"無窮遠點",那么其和 P1 + P2= P2。類似地,當 P2 是無窮遠點,則 P1+ P2 = P1。這就是把無窮遠點類似于 0 的作用。
事實證明,在這里 + 運算符遵守結合律,這意味著(A+B)C = A(B+C)。這就是說我們可以直接不加括號書寫 A + B + C,而不至于混淆。
至此,我們已經定義了橢圓加法,為擴展加法下面我們對乘法進行標準定義。給定橢圓曲線上的點 P,如果 k 是整數,則 kP = P + P + P + …+ P(k 次)。注意,k 被有時被混淆而稱為"指數"。








