發表文章

目前顯示的是 7月, 2019的文章

Monero.門羅幣 隱匿交易的基礎介紹

圖片
今天要來簡單介紹一下,門羅幣是怎麼達到匿名交易的。本篇文章會牽涉到橢圓曲線的原理,如果不懂,可以先參考「 加密技术核心算法之安全快捷的ECC算法 」。簡單來說就是要知道這樣的關係:  p = k*G ,      p :公鑰         k :私鑰     G :曲線上的基準點 門羅隱匿交易包含了三個技術: Ring Signature(環簽章) ,  Ring Confidential Transactions (RingCT, 環保密交易) 跟 Stealth Address(隱匿位址) 。在 Digital Asset Research 的文章 中這張圖解釋了各個技術所使用的地方,本篇文章,就是要介紹這三個技術。 source:  https://medium.com/digitalassetresearch/monero-becomes-bulletproof-f98c6408babf 在介紹之前,先了解門羅鏈有些基本概念。在門羅中有兩把key(其實是4把,因為各有私鑰跟公鑰),一把是 view key 另一把是 spend key 。顧名思義,一把是拿來看的自己餘額的(在鏈上找 隱匿位址 ),一把是拿來花的(做 環簽章 )。由spend key可以產生 key image ( 金鑰映像 ),用來做預防雙花的證明,有點像zcash的nullifier。 Ring Signature (環簽章) 環簽章有點像混幣,就是把好幾筆交易混在一起,不過還是有差異,可以參考「 What are the technical advantages of Ring Signatures (CryptoNote) compared to CoinJoin? 」 那實際上怎麼做呢?! 假設一個初始值v,跟一串隨機數$(y_1, y_2, ..., y_n)$,然後把v跟隨機數經由$E_k$做加密,再把加密過的值跟下一個隨機數做運算(xor)再加密,如:$E_k(y_{n-1} {\oplus} E_k(y_n{\oplus}v))$,所以函數如下 $$C_{k,v}(y_1, y_2, ..., y_n) = E_k(y_1 \oplus E_k(y_2 \oplus ... E_k(y_n \

Data Availability on Ethereum 2.0 Light Node

圖片
本來是要展開一個叫做「與大神(C.C. Liang)共筆系列」,無奈C.C.太忙,最終還是只能自幹,不過依舊感謝 C.C. Liang 提供素材跟觀念釐清 data availability(資料可取得性) 跟 fraud proof (詐欺證明)對於區塊鏈交易量擴展,是很重要的兩項因素。當交易量大意味著資料量就變大(無論是分片或是加大區塊大小),而資料量越大,能夠運行全節點的人就會越少(因為硬體跟維護成本越高)。舉例來說,Ethereum 2.0 有1024 條鏈,不可能每個人都把1024條的資料都下載下來,更何況,這樣也失去分片的意義,但若某節點做分片A的validator,此時,需要跟分片B有所互動,不太可能把分片B的所有區塊都下載下來,太耗時也太佔空間,而且若如此設計,最終也會把全部的鏈都下載下來....。但是,若沒有全部的區塊那要怎麼驗證交易呢?!這就是「資料可取得性」的重要性。 資料可取得性簡單來說就是拿不拿得到資料,但不代表拿到的資料的有效的/正確的。那在討論資料可取得性問題之前,先來認識詐欺證明。 在區塊鏈世界中,驗證資料方式可以分為有效證明(validity proof) 跟詐欺證明兩種。有效證明就是現在區塊鏈的運作方式-「驗證資料是正確的,才能上鏈」,也就是當你需要轉帳時,礦工需要先驗證你的餘額是否足夠,確認你餘額是夠的(驗證資料是正確的)才會打包。而詐欺證明則是相反,驗證者收到交易之後,經過一段時間若沒有人提出異議/挑戰,那就代表你送出的交易是沒問題的,這種方式驗證成本相對較低,也因此大部分L2方案選擇使用詐欺證明作為資料驗證的方式。 而輕節點只下載部分的資料(通常是block header),要如何能在運作上幾乎跟全節點一樣可靠呢('幾乎' 是因為輕節點需要額外的一些假設)?就必須借助資料可取得性跟詐欺證明的的合作。 Fishermen 漁夫(fishermen)機制是一種很直覺的設計方式,就是漁夫們觀察著網路上的無效資料,發現後送出詐欺證明以得到獎勵。 基本的獎懲機制如下, 1. 若有人提出無效的詐欺證明,則沒收押金, 2. 若有人提出有效的詐欺證明,送出無效資料的人會被沒收押金,而押金部份當作挑戰者(提出詐欺證明的人)的獎勵。 但是,這種機制在這個情境會有問題。我們來