📜 [專欄新文章] Ethereum Plasma Prime
✍️ Kimi Wu
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
“We finally hit the peak of the mountain!”
這是Ethereum Foundation researcher, Karl在Devcon 4 所說的。用這句話作為開場,代表著Plasma Prime離最終目標已經不遠了。
Plasma Prime是什麼呢?? 其實在Ethereum Research上找不到這個主題,Plasma Prime是Plasma Cash延伸的提案。Plasma Cash有一個很大的問題就是交易的歷史紀錄過於龐大(每個coin每年大約有1–3GB的歷史紀錄),如果沒有這些歷史紀錄,就沒辦法驗證作challenge 的動作。而Plasma Prime就是利用質數跟因式分解的特性,解決歷史紀錄過於龐大的問題。
Plasma Prime利用RSA accumulator來取代原本的驗證需要整個Merkle tree branch的方式。這邊用的概念很簡單,直接看範例不看數學式,假設有3, 5, 11這三個質數,可以得到 A = g ⁽ ³* ⁵* ¹ ¹ ⁾,若要證明3是A的一部分(比較精確的說法應該是 g³ 是A的一部分),只要可以在 (g³) ⁿ 中求得整數n,就代表3 是A的一部分,以這個例子來說,可以得到整數 n=55,因此 3 是A的一部分。但是實際應用上 n 可能會很大(因為coin數很多),所以會需要更有效率的確認方式,這部分牽涉到的數學比較多,就不在這裡討論,有興趣可以參考Wesolowski的論文跟Benedikt Bünz的演講。
回過頭來解釋這個範例,g 是generator(代表了初始的accumulator),A是accumulator,然後每產出一個block,accumulator就會累加上一個block的accumulator,也就是一開始accumulator A = g ⁿ,下一個block就accumulator A’ = A ⁱ,以此類推,一直累加上去。所以每個block就不需要帶著整個交易的Merkle tree,只需要多一個accumulator就可證明是否有交易過。
接下來,證明沒有交易過,代表要證明某數 v 不是A的一部分,很直覺會覺得無法因數分解即可,不過沒這麼單純(這邊我也不確定為何,可能要請數學好一點的人幫忙解答一下)。以上面的例子繼續解釋,7 不是165(3*5*11)的因數,只需要證明 0 < i < 7 可以得到 A * g ⁱ 即可,也就是 (g⁷)ⁿ 找不到整數解 n,但可以找到 A * g³ = g¹ ⁶ ⁸,然後 i = 3(滿足 0 < i < 7),可以得到因數24跟(g⁷) ² ⁴ = A * g³ = g ¹ ⁶ ⁸。
統整一下,Plasma Prime是利用上面講的RSA Accumulator減少了交易的歷史資料,那說好的質數在哪裡?! 在Plasma Prime每個coin的id都會是一個質數,而不是Plasma Cash中只是一個亂數id。再來,看看實際應用的的狀況,若有你所屬的coin在block n … n+k都沒有做過交易,只需要拿block n(的input state)的當作generator,然後n+k(的output state) 當作accumulator,根據上面的例子,只需要簡單的驗證就可以證明你的coin沒做過交易,相當簡潔。整個數據量會從GB等級減到MB等級。
以上是介紹減少數據量的方法,但是Plasma Cash還有一個詬病的問題就是進來Plasma chain的coin/token是無法分割的,也就是你存進1 ETH進Plasma chain,沒辦法只轉0.5 ETH給別人。在Ethresear.ch 中有一系列關於這個的文章(Plasma Cash Defragmentation / Take 2 / Take 3),簡單來說,就是交易原本是從一個coin轉到使用者,變成從一個區間的coin轉給使用者,如下圖,A轉了33 ETH給B,就轉token 0–32這個區間的token給B
當然,這種方式也不是沒問題,交易次數多了之後,就會造成fragment,跟硬碟使用久了,會造成空間碎裂不連續一樣,每個人持有token的就無法是一個連續的區間,在Plasma Cash Defragmentation Take 3有解決的提案,概念上還滿簡單的,因為不是本篇重點,有興趣的可以自己去看(不過看Take 3之前還是需要看前兩篇,才能比較了解在幹嘛 XD)
以上是我所知道的Plasma Prime,利用RSA Accumulator減少資料量跟轉帳是轉一個區間的coin。
今天分享就到這邊,如果有錯誤或是缺漏的,歡迎指教!
other references :RSA Accumulators for Plasma Cash history reductionLog(coins)-sized proofs of inclusion and exclusion for RSA accumulators
同場加映:Elph 發表了Plasma側鏈OmiesGO 發表了Plasma Dog
Originally published at kimiwublog.blogspot.com.
Ethereum Plasma Prime was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
「rsa範例」的推薦目錄:
- 關於rsa範例 在 Taipei Ethereum Meetup Facebook 的最佳貼文
- 關於rsa範例 在 [問題] RSA加密結果與Java不同- 看板C_Sharp - 批踢踢實業坊 的評價
- 關於rsa範例 在 RSA公開金鑰的加密與解密方法 - YouTube 的評價
- 關於rsa範例 在 Base64 是編碼不是加密& 用Node.js 實作簡易RSA 非對稱式 ... 的評價
- 關於rsa範例 在 3.1 RSA.md - EasonWang01/Introduction-to-cryptography 的評價
- 關於rsa範例 在 網路上關於rsa加密線上-在PTT/MOBILE01/Dcard上的升學考試 ... 的評價
- 關於rsa範例 在 網路上關於rsa加密線上-在PTT/MOBILE01/Dcard上的升學考試 ... 的評價
- 關於rsa範例 在 網路上關於rsa加密線上-在PTT/MOBILE01/Dcard上的升學考試 ... 的評價
- 關於rsa範例 在 rsa加密範例的評價費用和推薦,YOUTUBE、EDU.TW、DCARD 的評價
- 關於rsa範例 在 rsa加密範例的評價費用和推薦,YOUTUBE、EDU.TW、DCARD 的評價
rsa範例 在 RSA公開金鑰的加密與解密方法 - YouTube 的推薦與評價
RSA 公開金鑰的加密與解密方法不過實際上這次只是解釋方法與代入加解密的例子,用試算表來計算。 ... <看更多>
rsa範例 在 Base64 是編碼不是加密& 用Node.js 實作簡易RSA 非對稱式 ... 的推薦與評價
所以為了雪恥,決定稍微研究一下RSA 非對稱式加密,以及整理一下Base64 只是 ... 由於看同事們那個時候再弄的範例有公鑰(public Key) 、私鑰(private Key) ... ... <看更多>
rsa範例 在 [問題] RSA加密結果與Java不同- 看板C_Sharp - 批踢踢實業坊 的推薦與評價
有一個案例是為了與客戶的API對接
對方有提供範例檔,不過是使用java寫的
在RSA加密的部分程式碼像這樣:
public byte[] rsaPrivateCipher(int opmode, byte[] PrivateKey, byte[] text,
String padding) {
byte[] bResult = null;
Cipher cipher = null;
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(PrivateKey);
KeyFactory keyFactory;
try {
keyFactory = KeyFactory.getInstance("RSA");
Key aKey = keyFactory.generatePrivate(keySpec);
cipher = Cipher.getInstance(padding);
cipher.init(opmode, aKey);
bResult = cipher.doFinal(text);
} catch (NoSuchAlgorithmException | InvalidKeySpecException |
NoSuchPaddingException | InvalidKeyException
| IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
}
return bResult;
}
同樣的內容,每次加密出來的密文都會一樣
但是使用C#的RSACryptoServiceProvider,呼叫Encrypt方法出來的密文卻是隨機的
金鑰是同一把,使用CspParameters從金鑰容器中取出再傳入RSACryptoServiceProvider
但若是使用SignData的話又可以算出同樣的RSA簽章
由於回傳隨機密文對方沒辦法驗證
只好裝IKVM的套件來還原對方的範例,讓密文是一致的
想請問為何同樣都是RSA加密,輸出的結果卻是兩種不一樣的結果?
有沒有辦法能讓C#的密文也是每次都一樣呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.180.56 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1628672318.A.553.html
※ 編輯: cercloud (118.163.180.56 臺灣), 08/11/2021 17:00:43
我用
Encrypt("", RSAEncryptionPadding.Pkcs1)
結果是隨機密文
※ 編輯: cercloud (118.163.180.56 臺灣), 08/12/2021 12:13:32
... <看更多>