iT邦幫忙

2023 iThome 鐵人賽

DAY 10
2
Web 3

淺談ZK Rollup系列 第 10

Day 10 - 零知識證明EP06:非交互式零知識證明

  • 分享至 

  • xImage
  •  

前幾天講述了交互式零知識證明有兩個缺陷要做出修改,如果忘記了,可以回去看這篇複習一下,那麼今天我來帶大家看看怎麼樣才能解決這兩個問題吧!

集結問題

有什麼方式可以直接解決需要互相交流的過程呢?其實有一個挺直覺的解決方式,我們既然要做多次檢查,那為什麼不要直接做一次檢查,在該次檢查過程中,就包含驗證多次這件事情呢?就依據原本證明身分認證的問題來舉例,原本的證明流程需要驗證者不斷的去找出隨機的訊息讓證明者進行簽章,那不如直接把要給證明者簽章的所有隨機訊息都找起來,然後一次送給證明者,證明者一次就對大量的訊息進行簽章,並且將所有簽章交還給驗證者,這樣只需要一次溝通,便可以做到原本零知識證明流程可以做到的事情,都給做到了,這便是當時 非交互式零知識證明 剛開始所提出的概念,然而,我們可以發現這種證明方式提出的證明大小變得非常肥大,會是原本證明的很多倍,而且這樣卻沒有解決到可以讓多人驗證的問題,意思是沒有辦法阻擋惡意驗證者的產生,那該怎麼呢?既然不知道該怎麼辦,那麼就先從要怎麼樣讓多人驗證這個問題先開始下手。

多人驗證

我們要怎麼樣才能達到多人驗證呢?我們先來想一下,如果一次證明過程可以讓多個人同時間使用交互式零知識證明驗證會產生什麼問題?首先,這個證明者必須先找到很多很多位驗證者,然後必須確保著全部的驗證者同時上線,且網路通訊暢通,接著就開始進行證明過程,想到這裡就不禁讓我頭皮發麻了,我要進行一個零知識證明,還得找到多個在線的人,他們同時要網路保持暢通,這條件極為嚴苛,所以多人驗證必定是跟交互式互相衝突的,代表著只要能做到多人同時驗證的方式,這個方式高機率不會是交互的方式,所以理解這點後,便可以發現讓多人驗證這是一件非常重要的問題,一旦解決了,交互式零知識證明的第一個缺點便會迎刃而解,那麼...又回到最初的問題了,要怎麼樣才能達成多人驗證呢?
https://images.freeimages.com/365/images/istock/previews/8175/81750419-document-verification-icon.jpg
我們先想一個問題,在驗證過程中,題目可以公開嗎?當然可以,在身分認證中,題目便是證明者所要簽名的訊息,題目公開並不會讓這次證明過程有什麼隱私方面的洩漏,那這樣基本上就可以解決讓多人驗證的問題,想像有一個公佈欄,所有驗證者都丟一個亂數上去,當上面的亂數很多的時候,就可以開始零知識證明了,證明的過程很簡單,證明者只要將公布欄上所有亂數都用自己的私鑰簽章之後,一次性的將所有簽章丟上公布欄,因為這些都是公開的,所以所有人都可以對這些簽章做驗證,那就達成了可以讓多人驗證的這個問題了,不僅如此,證明的過程有只有證明者簽章然後公布,並沒有不斷交互的這種動作!
但是我們剛剛前面有討論過了,這會產生一個問題,一旦驗證者的數量很多時,證明者產生證明的時間也會增加,同時證明的大小也會非常可觀,那這該如何解決呢?不如我們把所有題目合成一個題目吧!既然公佈欄上面的亂數真的有夠亂,不如我們就把所有亂數合成一個大亂數,接著證明者只要對那個大亂數簽名就好,這可行嗎?顯然不行,因為他有可以被攻擊的可能,假設今天我是個惡意的證明者,我手上沒有該把私鑰,但卻有該把私鑰產生的簽章,也知道該簽章對應到的訊息內容,這時後我可以看現在公佈欄長什麼樣子,用湊的方式讓公佈欄上面的亂數變成該訊息內容的樣子,因為沒有人可以防範我成為其中一位驗證者,此時趕緊趁熱進行零知識證明,我馬上拿出我所擁有的簽章,我便可以通過這次零知識證明,因此不能讓題目就這麼暴露的公布在公佈欄上,因為這樣會讓惡意的證明者有機可趁,所以我們必須得對公佈欄上的題目加密才行。
怎麼加密呢?這就得用到我前一篇在探討的同態隱藏了喔!為什麼要用同態隱藏呢?因為他隱藏的特性可以讓公佈欄上的題目不被真正公開,而也因為他同態的特性,可以讓驗證者可以去新增他的亂數,怎麼做呢?假設現在的亂數是https://chart.googleapis.com/chart?cht=tx&chl=%24a%24,當然公佈欄上公開的會是他經過同態隱藏特性的函數https://chart.googleapis.com/chart?cht=tx&chl=%24f(x)%24得出的https://chart.googleapis.com/chart?cht=tx&chl=%24f(a)%24,如果你今天想當驗證者,那麼你也可以提供一個亂數上去,且讓他們合在一起,具體來說,便是你找一個亂數https://chart.googleapis.com/chart?cht=tx&chl=%24b%24,並將他帶入相同的同態隱藏特性函數https://chart.googleapis.com/chart?cht=tx&chl=%24f(x)%24得出https://chart.googleapis.com/chart?cht=tx&chl=%24f(b)%24,接著把公佈欄上面的數值改成https://chart.googleapis.com/chart?cht=tx&chl=%24f(a)%2Bf(b)%24,因為同態的特性,因此https://chart.googleapis.com/chart?cht=tx&chl=%24f(a)%2Bf(b)%3Df(a%2Bb)%24,你提供的亂數便成功融入進去了,且外人完全不知道裡面的亂數是什麼,而提出證明的人,只要對https://chart.googleapis.com/chart?cht=tx&chl=%24a%2Bb%24進行簽章,將他當作證明丟上來,當有人驗證過該簽章,便可以完成零知識證明,這樣便可以達成非交互式零知識證明的效果了!至於證明者怎麼簽、驗證者怎麼驗,我之後會用淺顯的方式讓大家粗略明白,讓我先進結論~

非交互式零知識證明

以上我在這邊提供的方法,只是非交互式零知識證明中的其中一種,因為其實也是有其他方式也能達成非交互式零知識證明,如果有興趣的人可以去網路上查詢相關做法,但其內容會牽涉到很深的數學理論,這遠遠偏離我想淺談的初衷,但是我之所以會提出的這個版本,是因為這個版本可以說是非交互式零知識證明在區塊鏈最早、也是目前最廣泛的作法。
喔!講了十天終於提到了跟我參賽的主題Web 3有關聯的區塊鏈了!沒錯,其實剛開始零知識證明剛出來的時候,並不是為了要服務區塊鏈的,所以可能會有很多人在剛開始看這主題文章時,都會納悶這篇文章到底跟Web 3有什麼關係,那麼我明天就來談談零知識證明跟區塊鏈的關係吧!


上一篇
Day 09 - 零知識證明SP04:同態隱藏應用
下一篇
Day 11 - 零知識證明EP07:零知識證明與區塊鏈
系列文
淺談ZK Rollup30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言