code

2017年6月29日 星期四

Bitcoin筆記 8 - Bitcoin機制細節

Account-based ledger帳目 (bitcoin並非採取此機制)

一個可能的block chain currency可以採用像流水帳式的交易紀錄(以下假設一個block只有一筆交易):
隨著時間流逝,網路中其他nodes要驗證Alice的餘額數目將會非常困難,因為要往前追溯每一筆跟Alice有關的交易。


Bitcoin的機制:transaction-based ledger

每個transaction有:id, inputs, outputs。

例如以下是一個new coin creation transaction (所以沒有需要任何簽名),id = 1,inputs是一個空集合,outputs是一個只有一筆資料記載"25個bitcoin流向Alice"的集合:

第二筆交易block產生了:
id = 2, input是id=1的第0筆(zero-based index)output,因為alice必須要記錄告訴大眾她手邊的25 coins來源,也就是"25個bitcoin流向Alice"這筆紀錄,注意inputs(1[0]) 中的所有錢幣會被消耗掉,而在outputs產生等值的紀錄。outputs包含了兩筆記錄,第一筆是將17個bitcoin給予Bob,第二筆則是把剩下的coins給予Alice自己(這行為稱為change address),因為要產生等值於消耗掉的錢幣。此外Alice必須要簽署這個transaction,證明自己願意進行此筆交易。

隨著時間過,整個block chain又變長了:

每一transaction的inputs其實就是一個hash pointer指向跟這筆交易有關的前一筆交易,例如在最後一筆由Alice簽署的交易,我們可以知道她要spend的錢幣的來源是從2[1]的outputs來的,也就是第二個transaction outputs中的"8.0 -> Alice"這一筆紀錄,這樣我們可以驗證第四筆交易是否valid。



當然也可以merge已有的兩筆transaction到一筆:


當然也可以兩個人同時在一筆交易中付款給同一個人,此時需要轉出錢幣的兩人的簽名:


Bitcoin low-level transaction data structure

以下這個data structure看似json,就是很接近真實的bitcoin transaction data structure,不過真實的transaction data是binary file,人類無法讀懂的:



第一部分是metadata,除了包含一些必要資訊外,可以看到"hash"這個key,這就是整個trasaction的hash value,也就是這個transaction的ID,可以讓其他transaction利用hash pointer指向過來的依據。另一個比較奇怪的是"lock_time" key,這個待會會解釋。


第二部分是inputs,這就是一個array記錄了這次要消耗的bitcoin來自其他那些交易,這些交易的ID一樣放在"hash" key裡面,"n" key則為那筆交易的第n個index,例如我們之前說1[0]就是第一筆交易,其"hash"可能為某256bit字串,而"n" = 0。



第三部分是outputs,也是一個array包含了此次交易的所有的紀錄,首先每個output紀錄有一個"value"紀載此筆紀錄的交易金額,另外一個"scriptPubKey"的key,其值為一個script! 待下回分解。




2017年6月28日 星期三

Bitcoin筆記 7 - incentive engineering

鼓勵誠實

之前說到,bitcoin並非用技術克服distributed consensus的難題,有一部分是因為虛擬貨幣應用情境,使得鼓勵動機(incentive) 能用來增進系統可行性。

之前假設多數nodes在bitcoin系統中是誠實的,是一個有問題的假設,bitcoin藉由給予nodes"鼓勵“來提高nodes當好人的動機,這個鼓勵就是“bitcoin”!

Incentive 1 - Block Reward (鼓勵創造block的人)

第一個使用的鼓勵就是讓propose block到long-term consensus block chain的node,能夠獲得一些給付(單位是50 bitcoin,但是每四年減半,目前已經減半一次到25 bitcoin),可以把此行為視為網路參與者的工本費,每一個被選上propose block的node都能在block中加入一筆“創造錢幣”的交易,當然會寫上自己的address。

這邊為何產生鼓勵性?因為如果此block不能進入long-term consensus chain的話,這筆工本費交易當然也無法進入!所以至少,proposed block裡面的交易要是cryptographically valid(誠實),以及其他node要願意認可此block內的交易(?不太清楚定義?),此block才能在幾個回合後變成orphan block。

這也是為什麼bitcoin流通總數只能維持在2100萬個原因:這是一個等比級數,所以會收斂到一個數字,21M。

事實上這也是新的bitcoin能夠被產生的唯一機制!!!!! 除非規則更改了。

Incentive 2 - Transaction fee (創造transaction的人自願性鼓勵block creator)

創造某個transaction的人可以挪一小部分錢幣當作交易費,如果某node propose的block備選中納入long-term chain,則那個block內的所有交易費最終會給此node!這不是強制性的交易費,但是當bitcoin數量達到上限後,要維持網路運作就得靠這個incentive2,目前已經有跡象顯示這個機制慢慢在運作。

Proof of Work

有了以上兩個incentives,是否能對付以下的問題?
1. 怎樣隨機挑選node?
2. 如何避免惡意者一人產生多個node,來搶block reward? (稱為Sybil attack)

第一個隨機挑選問題,由於bitcoin設計出來就是抱持decentralization的精神,所以隨機挑選也要能貫徹這個精神,也就是並非真的隨機性,而是依照node對某種資源的多寡比例來挑選,使得這種資源無法被獨佔,並且讓node競爭block creation的權利。Bitcoin選擇的是computing power。

原本一個block的資料結構包含前一個block的hash pointer,以及一些transactions:


現在bitcoin system提出一個hash puzzle:要求每個node去計算一個nonce值放入proposed block,使得整個block(包含nonce) 的hash值落入一個極小的區間內:


所以這變成運氣運氣,也就是綁定資源稀缺性的隨機性。系統可以利用這個target space來控制解謎的成功率,理論上要找到某個hash value,只能暴力去try,在2014年此課程發表之際,每個node 在提出block時需要在2^20個hash values中找到一個hash value,根本跟中樂透差不多。

這是一個bernoulli process,也就是每次trial成功的機率為p,不成功機率為q,一直到成功找到的機率為何?其continuous版本為poisson distribution,其pdf如下圖:


這也造就了所謂的挖礦,因為這個computation其實多數node都放棄去競爭了,少數人願意付出資本去快速找出這個hash puzzle,Bitcoin反而在這部分變成集中化了

另外,為了避免nodes投入更多計算資源而造成block產生速度過快,系統會將block產生的速率訂在平均10分鐘一個(稱為block latency),約兩個禮拜會動態調整hash puzzle的target space一次。所以系統中越多miners,產生block的平均速度越快,則每兩個禮拜就會被調整一次,對miners來說,越多人加入,你要花更多成本才有辦法挖到之前數量的錢幣了。

可以說 P(產出下一個block) ~= computing power / total players' computing power

在這個控制下,某個礦工的個人的block latency可以用下式表示:

如果此礦工掌控了0.1% hash power,則他挖到下一個錢幣的時間平均來說約 10mins / 0.01 ~= 10000分鐘 ~= 7天。

當然最後,找出來的nonce要能被其他所有nodes verify,這又是一個decentralization的運作。

2017年6月27日 星期二

Bitcoin筆記 6 - Bitcoin consensus algorithm

單一identity的好處

在管理上單一身分制有好處,至少security issue會比較好處理吧。那為何bitcoin採取多identity(每個人都可以任意創造身分)的近似匿名制(pseudonymity)呢? 因為這是他設計的理念,達成近似匿名性

演算法討論假設: bitcoin有辦法隨機選中一個node

在這個假設前提下,討論bitcoin的consensus algorithm,之後再來證明這個隨機選擇如何達成的。

在consensus block chain形成的過程中,每加入一個block,都來自此隨機選中的node的提議,但是其他所有的nodes如何對此提議出的block達成共識呢? 任何一個贊成此提議的node,會在他們的block chain後面加上這個block,並且之後從此延長block chain。反對者則忽視這個block,之後延伸block chain也不會出現這個提議。

簡化過的演算法:
1. 某node進行交易時,會對所有的nodes廣播此交易
2. 每一個node都在監聽網路,除了擁有一份consensus block chain,並且擁有一份目前尚未加入consensus block chain的transaction list (block)
3. 當某個被隨機選中的node,他可以廣播給其他的node,提出他目前的transaction list形成的block,當作所有nodes的consensus block chain的下一個block
4. 其餘所有的nodes聽到廣播後,根據檢驗此block內所有的transactions的"有效性"(e.g. 數位簽名, 惡意散播,. ...)
5. 所有nodes根據4. 的結果在他們自己的consensus block chain copy中決定是否加入此block

Bitcoin演算法如何避免惡意侵犯

舉例來說,如果某個時候所有nodes看到的consensus block chain如下:
每個block擁有一個hash pointer指向前一個block,一直到最起始的genisis block(創世紀!!!)。

steal coin: 如果此時惡意Alice被隨機選中來提出下一個block candidate,她能侵吞某人的bitcoin嗎? 答案是不行! 因為每個transaction都有digital signature和hash pointer等密碼學機制保護,由於無法偽造digital signature,所以侵吞偷竊bitcoin是達不到的。

denial of service: 如果Alice想要惡意攻擊另一名使用者Bob,就由denial of transaction,意即不把所有跟Bob相關的transaction放入proposed block candidate中呢? 由於惡意者與大多數其他nodes的誠實政策牴觸(假設多數是誠實的話),本次Alice的提議將會被多數否決,而Bob只要等待之後被選中的(絕大機率為誠實nodes)的node propose一個合法合理的block,將能讓關於Bob的transaction放入consensus block chain中。

double spending attack: 最後就是之前提到的double spending attack,Alice可以把bitcoin送給Bob,而這個交易被廣播之後,在下一輪中被選中的誠實node把這個觀察到的交易放入propose block,形成一個新的consensus block chain:

複習一下,這個transaction是一個data structure,包含alice的簽名,以及一個hash pointer指向這個coin前一筆的交易紀錄,見上圖。所以每個block有hash pointer指向前一個隨機選中的node提出的block,形成consensus block chain,而且每個block中的transaction,也有hash pointer指向前一筆關於此coin的transaction。

如果此時Bob看到consensus block chain是上圖的結果,他可能認為Alice給他的錢幣已經完成交易並且被公認了,所以就安心把貨品或是服務提供給Alice,但! Alice有可能可以逆轉此block chain型態,如果下一次隨機被選中的node是Alice能掌控的惡意node的話! 此惡意node除了能denial前一筆alice給bob的交易之外,甚至能把這個原本要給Bob的coin給了另一個人A',不過當然此筆惡意交易也必須遵守transaction chain的規則,包含一個hash pointer指向前一筆交易紀錄。


怎麼辦?

Longest-valid chain rule

每個誠實的node都遵循一個規則來決定目前被proposed的block是否該被加入long-term consensus block chain,此規則即為: 永遠延長最長的有效(valid)鍊分支。

不過valid除了密碼學上的有效驗證外,不能區分上圖double spending attack中Alice的惡意block與正確交易block的"有效性",而且因為兩個分支的長度都一樣,所以有可能下兩回合的honest nodes都追隨惡意block那個branch,使得原本正確的block變成一個orphan block,此時這次的double spending attack成功了:



但也不全然沒救,如果Alice是付bitcoin給Bob換取其他東西,則由於Bob知道Bitcoin network要達成consensus是必須在幾個回合之後才能確定的話,Bob可以觀察是否幾個回合後,這個正確的交易block被network nodes納入了long-term consensus block,如果有的話,再把服務或是貨品遞送給Alice,通常會等待k=6 confirmations: (數學上惡意的branch加入long term consensus 的機率會隨著k的增加而指數性的下降)



這邊有個關鍵點是,所有nodes在兩個branch一樣長度時候的投票要怎麼favor honest transactions? 看來是不行,因為nodes只能驗證簽名有效性,但不能驗證honesty,所以此時是隨機投票嗎? 那如果是這樣,double spending attack似乎有P(successful attack | malicious node is chosen) = 50%以上的conditional probability,不過由於malicious node被選中的機率極低(假設一個bitcoin network多數是honest node),似乎應該是安全的? 有待以後課程補充。


2017年6月26日 星期一

Bitcoin筆記 5 - Decentralization

Centralization vs Decentralization

多數系統是混合式的,只是兩者占比多寡。以web email為例,雖然protocol是decentralized,但是現在商業世界中已經演變成幾家寡佔的局面,這事實上變成了一個centralized scheme。

Bitcoin在 “decentralization <-> centralization 光譜”的設計:
1. Peer to peer - 這很明顯是pure decentralization,因為任何人都可以加入bitcoin的系統(成為一個bitcoin node,之後應該會說明這是什麼),而不用經過其他人的允許。

2. 採礦(mining) - 在技術上是pue decentralization,但是就跟創業一樣,人人可以當老闆,但是很多行業有資本進入障礙。bitcoin採礦需要大量的資本,少數擁有大量資本的採礦者佔有了多數的bitcoin,以此觀點來看,採礦權是somewhat centralized。

3. 系統更新與開發 - bitcoin是一個分散式軟體系統,但還是得有少數核心開發者來維護和更新整個系統,目前是採取信任制度,所以這是絕對centralized。

Distributed Consensus

分散式系統的管理一直是一個大問題,例如facebook擁有大量的分散式節點(servers),每次有人按讚,記錄這個讚的所有節點必須要嘛都正確儲存,要嘛就都全部都不儲存(如果某些節點發生問題的話),必須達成共識(consensus)。Bitcoin的設計也面臨相同的問題,事實上bitcoin或多或少解決了這個問題,他本質上是一個distributed key-value store,用bitcoin的架構除了能生出其他類似bitcoin的虛擬貨幣,也能將這個distributed consensus架構應用在不同的領域。

定義distributed consensus如下。在一個擁有固定數量n節點的系統中,每個節點都會對系統產生input,並且遵守consensus protocol,而此protocol必須:

  • (1) 能結束,且結束時所有正確運行的節點要對input value達成共識 
  • (2) 此共識值必須是某個節點的input

從Bitcoin的角度來說,首先它是一個peer to peer system。當Alice要送coin給Bob,她會對所以其他peer to peer連接的nodes形成的網路進行broadcast,broadcast此次的交易,資料結構就是一個block chain:

所以Bob要收到coin的前提就是他也在這個bitcoin 網路中,監聽任何廣播出來的交易,看有沒有自己的名字在內,不過就算Bob沒連上網路來收coin,這個交易也註明了Bob的產權。

可以想見這個bitcoin網路一直有交易在廣播,每個節點必須對這些交易達成共識,考量效率因素,多筆交易會被放入同一個block中,實務上每個節點的共識最小單位會是一個block ,在任何時間點,每個網路中的節點都有一堆達成共識的blocks (of transactions),彼此透過block chain結構串連起來。例如下圖這一系列的3個blocks可以是所有節點目前都有共識的blocks:

當然受制於廣播機制的限制,任意時間點上的每個節點上達成共識的block chain可能有些許不同,例如以下三個人可能同時廣播某個包含幾筆交易的block,其中一個block會被系統選為先達成共識的block:


沒在這時間點被選中的blocks,將會在之後的時間點加入共識block chain:

以上是傳統的distributed consensus運作方式,但是Bitcoin不太一樣!

Consensus is hard

因為要在一個有延遲的網路達到所有節點的consensus是一件困難的事! 有延遲代表無法對某些事物在時間順序性上達到共識,這對設計consensus protocol來說很困難。此外peer to peer network本身就有很多管理上的問題,每個節點可能會crash,會是惡意的,並非都連結再一起,都對這個系統產生共識增加困難度。

Bitcoin並沒有特別解決distributive consensus的問題,針對節點惡意性來說,bitcoin利用人們願意使用貨幣系統的動機,來增加每個節點的誠實度(?),這在貨幣系統的使用情境下才會成立(有待之後解釋)。

針對時間共識性來說,bitcoin採取擁抱機率的approach,某個block加進去consensus block chain的機率,隨著時間拉長而指數性成長,實務上通常約一小時左右,所以他不用保證每個節點達成consensus的時間,而每個節點對某事物的共識則可以有信心地隨著時間拉長而建立。


2017年6月25日 星期日

Bitcoin 筆記 4 - A simple Cryptocurrency

一個最簡單的cryptocurrency

  • 至少要有製作coin的能力,此coin跟真實鈔票一樣要有編號
  • 要能驗證真的是某人製作出來的coin,透過digital signature scheme
  • 要能交易,每個交易statement都要使用digital signature scheme
  • 所有錢幣都是immutable! 一但被創造就不能更動任何資訊,只能被消耗毀滅
以下圖來說,首先Goofy(其identity為其某一組public key) 製作了一個coin,且有唯一獨特的編號,旁人可以透過Goofy的identity來驗證此錢幣的數位簽章的真偽。

Goofy可以把coin送給Alice,這個交易也需要Goofy的數位簽章,並且使用hash pointer指向前一個交易block(亦即Goofy創造錢幣這件事),需要hash pointer的原因在於證明此coin在交易鍊中最後的擁有者是誰,可以想做是真實世界中所有的產權交易紀錄。

此時Alice變成是這個錢幣的擁有者(藉由觀察之前的交易紀錄),當然她也可以交易賣給Bob。Alice簽署了交易的文件,並且也新增一個交易block,利用hash pointer指向前一個交易。




設計難題1: Double-spending attack

如果alice一幣兩賣呢? 以上面這種簡單的規範,是可以發生的,會變成下面的交易紀錄chain:


這是一個cryptocurrency要解決的難題!

一個解決辦法就是對整個交易紀錄的block chain做簽名,並且公佈出來,有了交易歷史資料,Alice就不可能一幣兩賣。



交易種類

1. 製作新錢幣
每個public id都可以製作自己的錢幣,在同一個製作錢幣的交易紀錄中,可以一次製作多個錢幣,每個錢幣有(編號, 面值, 擁有者)三個屬性,例如下面這個73號交易製作了三個錢幣,編號分別是73(0) 73(1) 73(2):

2. 給付
一個給付交易中,由於錢幣是immutable的,所以可能會消耗掉幾個創造出來的錢幣,然後同時又創造出幾個新的錢幣。例如以下#73交易:有三個尚未被消耗掉的有效錢幣68(1), 42(0), 72(3),在本次交易中將被消耗掉,而這三個錢幣的擁有者必須都簽署(每一個錢幣都要簽署一次,即便擁有者是同一人)此交易記錄,證明他們的確授權錢幣被消耗。這三枚錢幣的幣值總和假設是n,則本次#73交易必須創造出總和等值n的錢幣給予新的擁有者,才算是合法的交易。


設計難題2: Decentralization

上面改良過的錢幣系統,只依賴錢幣發行者,如果他不誠實,或是不玩了,整個系統就掛點,也就是說這是一個centralized system。而已經實做出來的Bitcoin是一個decentralized system,所以我們還得要加上些什麼機制,才能擺脫centralized authority。待下回分曉。


2017年6月24日 星期六

Bitcoin 筆記 3 - Digital signatures and Applications

理想簽名的特性

一個有用的簽名,日常生活中代表了某人的身分。所以理想上,沒有任何人可以模仿出其他人的簽名,以及無法透過任何方式把偷取真的簽名來冒用在任何文件上,旁人只能驗證這個簽名的真偽。

Digital signatures built on cryptographic hash functions

數位簽章可以用hash function來達成。我們需要以下兩個component來達成理想簽章的數位版:

  • secret signing key (sk): 每次簽名我們只能用個key
  • public verification key (pk): 讓旁人驗證你的簽名真偽的key
所以我們會有一個產生此兩個key的api:

然後利用產生的sk可以簽署在任何message上(意即製作hash value),此時會產生一個signature:

以上兩個api需要極佳的randomness,否則sk有可能洩漏!!!!!

旁人可能透過某些途徑獲得了宣稱是你簽章過的message,他們可以用public verification key和此宣稱為真的message以及message上面的簽章,透過以下api驗證真偽:


數位簽章無法冒簽,即便旁人擁有public key以及某個message的真實signature,也無法偽造出另一個不同的message的signature,這受惠於cryptographic hash function的三個特性。

ECDSA

bitcoin使用的digital signature standard是國家標準的演算法: Elliptic Curve Digital Signature Algorithm,這依賴極佳的randomness,數學相當複雜,有興趣自己去研究 XD

Decentralized Identity Scheme

public key其實就相當於某個人的身分認證了,因為public key一定伴隨一個private key,這樣驗證簽名才會通過,所以某個public key可以代表某個private key 的公眾身分,而private key則是此個人身分真實的內涵。此外,當一個人想要在此數位簽章的世界中擁有另一個公眾身分,只要產生另一組private/public key pair就可以了。

擁有隨意創造新身分的能力,這是一個decentralized identity management,沒有一個政府或中心組織來核發身分證! 在bitcoin的世界中,一個自己創造的identity 有一個專有名詞,就是住址(address),事實上就是指隨意創造出來的public key。

此address無法辨識出此人在世界中的真實身分,但是當然可以做inference,如果用同一個address進行一連串的行為或是交易,則有可能被連結到某人在真實世界中的行為,進而洩漏身分。


Bitcoin 筆記 2 - Hash pointers and Block chain data structures

Hash pointer

基本上就是一個指向某個被hash function保護的 data structure的pointer,沒什麼特別的,但是他除了pointer功能外,由於儲存了hash value,所以同時也能驗證data是否更改了(故名hash pointer)。


Block chain data structure

被has function保護的data blocks可以透過hash pointer形成一個data structure,稱為block chain。
block chain只要是acyclic(沒有形成迴圈的指向),可以是例如linked-list或是binary tree.,例如以下的linked list implementation:

這個linked-list就是一般的linked list,特別的是每個element指向previous element的pointer是一個hash pointer。

舉例來說block chain的scenario: 可以用來做tamper-evident log。也就是每個block儲存某個時段的log,但是當某人更改了previous block中使用到的data,hash pointer就能發現資料變動了的證據(稱為tamper evident)。

假設有一個人想要更改下圖中最左邊block的data:

則中間block的hash pointer就會verification fail,因為左邊block的hash value該改了,所以此人是必得要把chain上的所有block data都修改,並且竄改相對應的hash pointer才能不被發覺:


另一個可能的data structure是binary tree (又稱為Merkle tree,以發明人命名):

底層的leaf node是真正data的block,non-leaf nodes的blocks是含有兩個children的hash pointer,所以要更改某個leaf block data的話,至少要改動所有相關路徑上的blocks直到root block,對手需要竄改的數量相較於linked-list implemenation較少,asypmtotically O(log n),但相對的要驗證(membership)某個data是屬於這個block chain也只要O(logn) hash,這比起linked-list是一種tradeoff。



上述的Merkel tree能夠O(logn)驗證membership,但是不能O(logn)驗證non-membership,因為必須窮盡所有paths才能知道一個data block不是這個chain的成員。但是如果leaves data依照某些規則sorted之後,可以O(logn)複雜度來驗證non-membership。

Bitcoin 筆記 1 - Cryptographic Hash Function

Cryptographic hash function H(x)
首先,需要一個高效率的cryptographic hash function,能夠將string x map到一個固定長度(e.g. 256 bits) 的output,且擁有以下的特點:

  • collision free - 沒有人能找出hash collision的可能: collision一定會存在,因為沒有完美的hash function,但這邊需要的特性是"不能讓人用任何computation找到collision keys"。在這個特性的前提下,每當H(x) 的值等同於 H(y),我們可以放心地認為string x = y 。
  • Hiding - 無法從hash value逆推回去key: 要不然還得了! 這邊的問題在於,如果key set很小,則任何人都可以一一比對每個key的hash value,來檢查目前看到的hash value是哪一個key,所以一個方法是擴大key set,利用把key concatenate 某個出現機率極小的string(e.g. random產生的256-bit string,則每個string出現的機率為1/2^256,相當的小),這樣相當於key set被擴大了,對手只能暴力去比對,但以目前電腦能力是無法解決的。
  • puzzle-friendly - 無法產生某個特定的hash value: 這應該是跟hiding property有異曲同工之妙的性質,因為有能力產生某個特定的value,意即你找出了hash function定義是啥,根據collision-free的特性,這key可以說是唯一,而這個key/value pair就被破解了,違反hiding property。


Commitment

cryptographic hash function其中一個應用為"commitment",他的意思是把某個訊息密封(稱為commit to a message)在某個信封內,此時雖然每個人都可以看到這個密封的信封(稱為commitment),但是裡面的訊息對每個人來說都是秘密。之後要有辦法打開這個密封的信封(利用密封時產生的key),讀取這個訊息,但是不破壞這個密封。

應用上通常是拿來verify某個 3-tuple (key, commitment, message)是否為同一組commit過程的產物:

整個過程的implementation用到了hash function,首先定義 commit(msg) 這個function回傳以下2-tuple:


key就用到hiding property中提到的256-bit random string,用來和msg concatenate來擴大key set

而verify的implementation如下:



其實就是簡單比對hash value。這邊用到了hash function的collision-free property,否則我們無法透過比對兩個hash value來驗證兩個key相等


SHA-256

bitcoin使用SHA-256當作其cryptographic hash function。

運作流程如下: 首先把message分成512-bit blocks,如果最後一個block不足512 bit則做padding補足。寫在spec的某個256-bit初始值 IV 加上第一個512 bit block的bits,總共湊成768 bits先投入compression function c (就是hash function),output出256 bits,接著再加上block 2的512 bits湊成第二次的768 bits 去做hash,這樣一直做直到所有的的message bits都被hash完,最後hash出來的256 bits就是SHA-256的結果。

記住SHA-256是符合cryptographic hash function特性的hash function,所以沒有人能找到collision,即便collision一定存在。