「漫威電影只是複製貼上,或許這類型的電影把觀眾都變成了殭屍。」——《#沙丘》導演丹尼維勒納夫
隨著《沙丘》於各地盛大上映,劇組團隊馬不停蹄地進行全球宣傳之際,導演丹尼維勒納夫接受外媒《El Mundo》採訪時,宣稱漫威電影只是複製貼上,此言論一出,就把漫威「主題樂園」式的論戰再度翻攪出來,成了今日影迷們最熱的議題之一。
丹尼維勒納夫是這樣說的:「也許問題在於,我們面對太多的漫威電影了,而這些漫威電影只是複製貼上,或許這類型的電影把觀眾都變成了殭屍。不過,現在的電影市場我們仍舊可以發現很多有價值的巨型高成本電影,我認為還不能悲觀。」
丹尼維勒納夫近年接連交出《雙面危敵》、《怒火邊界》、《異星入境》、《銀翼殺手2049》等口碑不俗的作品,除了在獎項上有所斬獲之外,製作成本更是一部比一部高昂。丹尼維勒納夫沉寂多年後的新片《沙丘》改編 1965 年由法蘭克赫伯特撰寫的同名經典科幻小說,此片由傳奇影業製作,更找來《一個巨星的誕生》編劇 Eric Roth 、《普羅米修斯》編劇 Jon Spaihts 共同撰寫劇本,由華納影業發行,斥資 1.65 億美金。
卡司方面,更有提摩西夏勒梅、辛蒂亞、蕾貝卡弗格森、奧斯卡伊薩克、喬許布洛林、傑森摩莫亞、史戴倫史柯斯嘉、戴夫巴蒂斯塔、哈維爾巴登、夏綠蒂蘭普琳和台灣男星張震等人。
《沙丘》扛著華納兄弟年度旗艦大作的招牌,卡司與製作團隊皆是一時之選,理所當然,資方並不希望賠本虧錢,也因此在科幻包裝下,充斥所謂的「市場商業」元素,而商業元素恰恰正是漫威系列作品所再三強調的,也令外界討論《沙丘》的藝術性,
然而,丹尼維勒納夫進一步提到:「想想看好萊塢的黃金時代,商業電影也可以提出不同的藝術觀點,因此也能具有政治意義。我從來不覺得擁有一筆龐大的預算時,對於我想做的事是某種損失或是障礙。然而,誰說高預算的電影不能同時具備藝術性?我認為像克里斯多福諾蘭、艾方索柯朗這樣的人就能夠做到。」
上一位抨擊漫威影業,並引發眾議的重量級大導,大概要回溯到 2019 年的馬丁史柯西斯。當時馬丁史柯西斯宣傳新片《愛爾蘭人》接受採訪時,將超級英雄電影比喻成一種「主題樂園」,更表示表示漫威電影宇宙的超級英雄電影「不是電影」,無法讓人們傳遞感情或是內心體驗。
當時這番言論也引起各界討論,有贊成當然也有反對,包含山繆傑克森等好萊塢影人出面回應,山繆傑克森當時在《綜藝報》表示:「電影就是電影。馬丁史柯西斯的電影也不見得每個人都喜歡,每個人都有自己的看法。這番言論也無法阻止任何人繼續拍電影。」
此議題今年又因為丹尼維勒納夫的表態掀起論戰,丹尼維勒納夫也在另一個媒體《French outlet Premiere》表示:「如果我們談論的是漫威電影,問題在於,所有這些電影都是用同一個模具製作的,有些電影人或許可以加一些顏色變化,但他們都是從同一個工廠中被產製挑選的,這些電影是非常公式的。」
從票房來檢視,當代觀眾的確非常熱愛丹尼維勒納夫口中的「公式化」電影,漫威自從 2008 年推出《鋼鐵人》之後,便打造獨樹一格的宇宙觀,且深受觀眾好評迴響,目前全球影史票房前 10 名漫威就佔據了其中 3 名,包含第 2 名《復仇者聯盟:終局之戰》的 27.97 億美金、第 5 名《復仇者聯盟:無限之戰》的 20.48 億美金、第 8 名《復仇者聯盟》的 15.18 億美金。傲視群雄的票房實力,使之成為當代最具影響力的片廠。
而今年推出的《黑寡婦》以及正在熱映中的《尚氣與十環傳奇》也都開出不錯票房,尤其《尚氣與十環傳奇》以 9467 萬美金的成績打破北美勞工節連假的開票紀錄,目前北美累積 1.52 億美金、全球則有 2.64 億美金的表現,在 COVID-19 疫情之下實屬不易。
至於憑藉《游牧人生》大放異彩的趙婷,執導的漫威作品《永恆族》更將接棒《尚氣與十環傳奇》,預計於今年 11 月上映。可以想見,只要觀眾對於漫威作品仍舊買單,未來「主題樂園」的電影之爭會不斷被談及並引發相關論戰。
最後,關於《沙丘》續集的未來發展,丹尼維勒納夫最近表示:「如果真的有《沙丘》續集,對我來說將是一個瘋狂的遊樂場,就像純粹的感受電影樂趣一樣。我不想代表團隊中的每個人說話,但我會說我們真的在這部電影中創造了一種家庭的感覺,讓每個人重新團結,那是天堂。」
不過,《沙丘》續集是否真的能如願誕生,仍要看其市場表現,不只是院線成績,更也要能在華納旗下的串流平台 HBO Max 獲得成功。因此決定華納兄弟是否繼續製作《沙丘》系列的關鍵因素,仍舊是票房與觀眾反應。
至於《沙丘》是不是與漫威電影不同,還要待觀眾走進戲院,親眼見證了。
📝9 月 8 日《沙丘》試片結束後,寫了一篇短評,提供讀者參考👉https://bit.ly/3hJC7LI
同時也有198部Youtube影片,追蹤數超過4萬的網紅吳老師教學部落格,也在其Youtube影片中提到,Python基礎程式語言應用證照班第7次上課 01_重點回顧與308題增加外迴圈 02_308題改為for_each的寫法 03_308題改用餘數與除除方法 04_310迴圈公式計算解答 05_402不定數迴圈最小值解答 06_402不定數迴圈改用串列完成 07_404數字反轉判斷用文字串接解答 ...
遞迴公式 在 Facebook 的最讚貼文
【面對創傷,沒有公式可以套】
在《建立對跨世代創傷的敏感度和覺知》講座裡,其中一位專家提到一個研究,一個人所經歷過的創傷,會透過基因顯化或者是經驗傳遞的方式繼續「污染」我們的孩子,但是,一旦我們「make sense of」我們的創傷,我們就可以終止這個傳遞。
講座裡並沒有詳細描述研究的細節,對我個人而言我也並不在乎,因為我已經得到我想要的東西了—如果我不想要活成我的父母親的樣子,我該做的事情,是「make sense of」我的創傷。
聽起來很直觀,不過,這個「make sense of」的概念,其實並沒有這麼好理解。我個人會把它翻譯成「弄清楚」。如果想要從創傷當中恢復,我們必須把事情從頭到尾都弄清楚。
弄清楚什麼?
難就難在這裡,沒有別人可以給我們答案。所有我們經歷過的一切,只有我們自己最清楚,所以能夠把多少情緒、經驗和記憶連接起來,完全仰賴我們願意花多少時間進入自己的內心,推開那扇塵封已久的大門,在那一團亂七八糟毫無頭緒的混亂面前坐下來,一點一點,一片一片,一絲一絲,找出到底有什麼該弄清楚的,或是還有什麼不清楚的。
***
這次回到台灣,有一件我非常不願意去做,但是又覺得必須面對的事,那就是在還來得及的時候,去見一次大魔王,跟他好好說說話。也沒有什麼特別的目的,就只是隱約有種感覺,看過他之後會有機會「弄清楚」一些事。
大魔王目前超過九十歲,目前住在一位親戚叔叔的家裡。會把他稱作大魔王,不只是因為對我個人而言他極難相處。從我六歲開始,只要跟他單獨對話超過五分鐘,他就有辦法把我惹毛。當我越長越大,對事情的了解越來全面的時候,我個人認為這個家族之所以分崩離析、情感破碎,大魔王必須要負上很大的責任。
當初蕃茄還不太會走路的時候,我們全家曾去見過他一次。受日本教育的大魔王,客廳的茶几上總會有一個雅緻的點心盒待客。當他把鐵盒掀開,喜歡甜食的蕃茄立刻眼睛一亮,搖搖晃晃地走過來,雙手捧起一大把,掉了一堆在桌面上,但還是很積極地在客廳走來走去,幫在場的每個人都分配一點。
大魔王見狀,笑咪咪地說:「這個孩子好,會分享,以後媽媽下一胎會生兒子。」
我的腦中立刻響起一句「狗改不了吃屎」,默不做聲把掉在桌上的所有點心都放回盒中,蓋上蓋子。那天我喝了一杯茶就離開,再也沒有踏進那間房子。
親戚叔叔雖然跟我的母親同輩,但是因為幾乎是家族裡最小的,跟我只差十五歲上下。從出生那一刻起,我就仰望著他一路從青少年、成人、結婚和生子。也因此,我是一路聽著家族對他的批評長大。
小時了了。聰明反被聰明誤。浪費天份。只顧談情說愛。個性頑劣。脾氣暴躁。好吃懶做。不務正業。虛榮。愛玩。
這樣的叔叔,最後居然是由他來觀照大魔王的生活起居,老實說我是從來沒有想過的。
總之,到了要見大魔王的當天。
我心裡還是覺得隨時想要逃走,畢竟跟他在一起的痛苦回憶太多了,加上我深信我跟母親之間的痛苦回憶也幾乎都源自於他,我實在是沒有把握再見到他的時候我會做出什麼事。但是有種不知名的力量一直在身後推著我往前走,我終於來到叔叔家門口,門從裡面被打開。
大魔王坐在客廳看電視,看見我走進來,笑一笑說:「你好。」
叔叔阿姨和表妹在家裡四處走來走去張羅拖鞋水果,邊回頭大喊:「阿嬤,你看這是啥人?」
大魔王僵在那裡,維持著不失禮貌的微笑盯著我。我深吸一口氣,把口罩脫下來。一看到我的臉,大魔王就哭了。
「阮阿孫,是阮阿孫啊嗚嗚嗚嗚嗚⋯⋯」
於是祖孫兩人相擁而泣,盡棄前嫌,在老人一生的最後終於迎來了大和解,讓他能安心離開,不再有所牽掛。
最好是。
有這麼容易的話就不叫創傷了。
我面無表情地抱著他,拍拍他有點駝的背,只覺得無盡煩躁。到現在沒人要理你了才在那裡哭,我從小站在你面前站到大你根本沒正眼瞧過我一次,連我幾歲幾年級髮型跟上次一不一樣都記不清楚。
我扶著老魔王走到餐桌前坐下來,叔叔阿姨跟表妹也都入座,一邊吃著水果,時不時也加入我跟老魔王的談話。而我這才發現,老魔王已經有些失智了。
先是問我爸爸好不好,再問我是不是全家都回來,之後告訴我上回弟弟全家有找他吃飯他走進餐廳差點跌倒好丟臉要弟弟不要告訴別人,再問我有沒有弟弟的電話他想要打去給他。這樣一輪以後,又開始問爸爸好不好。一次,兩次,三次,無限迴圈。
我放鬆下來了。
這種狀態的魔王,雖然套不出什麼有趣的過往,對於我原本期待可能可以「弄清楚」什麼的計畫沒什麼幫助,但是至少安全。我不用擔心他會突然冒出一句話直接啟動我的攻擊模式。(好啦其實還是有兩次,但是真的算很少了可以當作沒有)
然而,事情有了意外的開展。
跳針跳久了也是會累,叔叔阿姨開始加入話當年的行列。原本女友換不停的叔叔,認識阿姨不到一年就閃電結婚,婚後起的衝突也跟天打雷劈一樣精彩。也因為我當時十九歲,是當時二十六歲的阿姨在家族裡唯一能聊的對象,現在把各方觀點同時湊在一起攤牌真的是非常精彩。
聊著聊著,我心裡突然有種感覺開始醞釀。
衣架必須全部照著同樣的方向擺。櫃子上的書有一定的順序。屬於他的椅子絕對不能碰。一抓狂起來髒話狂飆物品齊飛。熱愛藝術。對細節催毛求疵。
我一邊咀嚼當年這些叔叔的經典地雷和個性,一邊聽叔叔繼續講。
「我其實已經改很多,妥協很多了。」叔叔回頭指指遠方:「你看像我那邊那張椅子,上面都是狗的毛,也沒人要清,可是我也就算了。」
我看到他旁邊的阿姨開始翻白眼,忍不住笑出來:「叔叔,那是你的椅子吧?沒人要清的話,你也可以清啊?」傳統大男人真的是很誇張,是以為其他人都沒事等著在那邊服侍他嗎?
叔叔沒有立刻回答,沈吟了幾秒後,說:「我當然也可以自己清,可是,這樣就不對了啊。當初要養狗的時候,我就說我唯一的條件是我的椅子上不可以有狗毛,大家都說好好好,結果變成這樣,也沒有人表示⋯⋯」
像是有一道電流直接穿過全身一樣,我突然瞪大眼睛:「等一下,我聽懂了!!」
我轉向在旁邊的阿姨:「阿姨,我聽懂了!這件事真的不對,不能是叔叔擦桌子!這不是家事分工的問題,這是承諾的問題。大家都答應我了,不會讓狗弄髒我的桌子,如果還是被弄髒,還被覺得大驚小怪要我自己擦,我會覺得沒有人在乎我。」
阿姨呆住了。叔叔也呆住了,表情像是生平第一次有人理解他在說什麼。
我的腦袋還在持續運轉,重組我得到的新資訊。一直以來大家都說叔叔脾氣大、愛計較、愛生氣大男人龜毛記仇難伺候,阿姨好可憐好厲害可以忍受他這種人,但是不對,我懂了,叔叔不是故意這樣的,他太不舒服了,他的雷一直被踩到,可是都沒人懂,也沒有人在意,就只是一直說他脾氣很差要他改⋯⋯
「叔叔,你是高敏感人,你知道嗎?」我脫口而出。
我把高敏感特質簡單地描述了一下,叔叔不停地點頭。我告訴他我可以理解,我以前也經常覺得家人無法理解我在意的點。
「 國中的時候,我媽說他要去一趟文具店,我說太好了那順便幫我補充兩支原子筆。我把我習慣用的SKB藍色0.5拿給他,跟他說就買這個一模一樣的兩支,結果他回來的時候自作主張買了兩支完全不一樣的。」
「幹什麼啊!!就買一樣的就好了啊!」叔叔很激動。
「是不是!我氣得要命,他還說我不知好歹那兩支很貴。」
「就不是貴的問題啊!就不是我要用的筆啊!」
「是不是!」
阿姨在一旁非常驚訝地看著我們,不知道是不是第一次發現,先生的要求不是在「挑毛病」,是真的非常需要顧及這些細節。我跟叔叔一人一句,講起那些無法讓別人理解我們時的挫折感。
「我小時候,我媽答應我要買一個玩具給我,但是他忘記了。我超生氣啊,明明說好的,是他忘記了,他就一直說是我無理取鬧,根本不是這樣,我又說不出來,只能拼命用自己的頭去撞牆壁。」
「我也記得這種心情。我不管怎麼解釋,我媽就是沒有要理我,我到最後只能尖叫啊,狂尖叫。」
「還好你沒做出更激烈的舉動。」
「差一點了,就差這麼一點點。」
「真的還好沒有。」
「是啊,如果沒有克制住,拳頭揮出去或者是拿東西自殘,又會變成我們有病,搞不好就被抓去吃藥了。」
「難怪我女兒會說:『我又不是故意要這麼生氣的,我就是會這麼生氣啊。』」在一旁的阿姨很認真的參與,顯然想起個性跟爸爸很像的小女兒。而我也忍不住想起蕃茄,每當他摀著耳朵尖叫,或是大罵「我要殺死你」的時候,他也是沒有辦法讓自己不生氣的吧。他就是會這麼生氣,這麼需要表達,而在這個當下打他罵他甚至是批評他都完全沒有幫助。
大家都沈默了,各自咀嚼著剛剛的對話。
我抬頭看叔叔的側臉,發現他已經蒼老了好多。我突然明白,叔叔從國中就開始交女朋友,翹課,離家出走,跟壞朋友出去玩,淨做那些大人眼中「浪費自己天份」的事,其實是因為他真的渴望被人理解,他一直在尋找一個可以幫助他,讓他知道如何跟自己相處的人。只可惜他的雙親,對他只有辱罵和毆打。
「叔叔,你辛苦了。我從小就認識你,經過這麼多年到現在,我真的有看到你的改變。」
叔叔並沒有回應我,只是盯著自己放在桌上的雙手,喃喃的說:「一定可以的⋯⋯這種複製,一定可以被打破的⋯⋯」
我的內心一震,眼睛開始發熱。這一刻,我知道他想著他自己的孩子,就如同我想著我自己的孩子一樣。我們都希望,這樣的傷害,可以在我們手上就停止。
當天晚上,我做了一個非常清晰的惡夢。
我在學校,做了一件一般大家不會去做的事。我的出發點良善,但是大家的解讀跟我的預期完全相反。我看到大家看著我的眼神越來越不對勁,也一個一個從我身邊躲開。我拼命思考有誰可以幫我保證我的人格,卻想不出任何一個名字。我越來越焦急,想不出有什麼東西可以拿來讓我發「毒誓」,讓大家可以相信我。夢境結束在我走出窗外一躍而下。
我睜開眼睛,覺得極度想吐,然後爆哭。
之前在課堂上曾經提到,當一個人跟自己的傷痕真正接軌的時候,往往會在夢境裡反映出來。這是我第一次經歷。雖然極度不舒服,但是我知道這表示身體在處理我積壓已久的情緒和傷痛,有點開心。
***
第一篇創傷文,沒想到是用這個事件來開頭。也許是因為,經常有人留言問我「該怎麼處理自己的問題」,而我想用這篇文章來表達「沒有正確答案」。
就像我一開始認為可以從阿嬤的記憶裡找到有幫助的東西,但是最後卻是從完全沒想到的叔叔身上發現我們共同的特質,彼此都得到被理解的感受。面對創傷,也許我們終究就只能摸索出一個可能的方向,鼓起勇氣踏出追尋的步伐,然後對接下來的發展保持開放的心胸。
Dr. Gabor Mate在《理解創傷》這個講座裡提到,面對創傷,一個很有幫助的態度就是「感到好奇」。「這件事代表什麼意思?這件事可以教會我什麼?而這時就會產生深刻的同理。」
對我來說,所謂的「make sense of my trauma」就是這件事吧。當我們對自己的傷口感到好奇,我們就會有動機想要「弄清楚」,想要知道更多的細節,而不會一直覺得「夠了沒?這樣可以了吧?」想要趕快抽身。
要從創傷中恢復,找回自己,是一段漫長的旅程,如果沒有辦法享受途中的風景,只是想著如何快點到達終點,很快就會失去耐性而放棄吧。療癒是如此,教養也是如此。
叔叔,我自己,小表妹,蕃茄。這一趟回台,很意外地湊成了家族內的「高敏感一條龍」。看見彼此之間驚人的相似之處,還有經歷那些「我懂」的瞬間,我覺得受到鼓舞。
我想,我願意再繼續往下走一段。
___
歡迎匿名留言:
[蕃茄家塗鴉牆--面對創傷](https://padlet.com/tomatogreenlife/f3xvuqro7m4psz93)
遞迴公式 在 Taipei Ethereum Meetup Facebook 的最佳貼文
📜 [專欄新文章] Merkle Tree in JavaScript
✍️ Johnson
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
這篇文章會說明 Merkle Tree 的運作原理,以及解釋 Merkle Proofs 的用意,並以 JavaScript / TypeScript 簡單實作出來。
本文為 Tornado Cash 研究系列的 Part 1,本系列以 tornado-core 為教材,學習開發 ZKP 的應用,另兩篇為:
Part 2:ZKP 與智能合約的開發入門
Part 3:Tornado Cash 實例解析
Special thanks to C.C. Liang for review and enlightenment.
本文中實作的 Merkle Tree 是以 TypeScript 重寫的版本,原始版本為 tornado-core 以 JavaScript 實作而成,基本上大同小異。
Merkle Tree 的原理
在理解 Merkle Tree 之前,最基本的先備知識是 hash function,利用 hash 我們可以對資料進行雜湊,而雜湊後的值是不可逆的,假設我們要對 x 值做雜湊,就以 H(x) 來表示,更多內容可參考:
一次搞懂密碼學中的三兄弟 — Encode、Encrypt 跟 Hash
SHA256 Online
而所謂的 Merkle Tree 就是利用特定的 hash function,將一大批資料兩兩進行雜湊,最後產生一個最頂層的雜湊值 root。
當有一筆資料假設是const leaves = [A, B, C, D],我們就用function Hash(left, right),開始製作這顆樹,產生H(H(A) + H(B))與H(H(C) + H(D)),再將這兩個值再做一次 Hash 變成 H(H(H(A) + H(B)) + H(H(C) + H(D))),就會得到這批資料的唯一值,也就是 root。
本文中使用的命名如下:
root:Merkle Tree 最頂端的值,特色是只要底下的資料一有變動,root 值就會改變。
leaf:指單一個資料,如 H(A)。
levels:指樹的高度 (height),以上述 4 個資料的假設,製作出來的 levels 是 2,levels 通常會作為遞迴的次數。
leaves:指 Merkle Tree 上的所有資料,如上述例子中的 H(A), H(B), H(C), H(D)。leaves 的數量會決定樹的 levels,公式是 leaves.length == 2**levels,這段建議先想清楚!
node:指的是非 leaves 也非 root 的節點,或稱作 branch,如上述例子中的H(H(A) + H(B)) 和 H(H(C) + H(D))。
index:指某個 leaf 所在的位置,leaf = leaves[index],index 如果是偶數,leaf 一定在左邊,如果是奇數 leaf 一定在右邊。
Merkle Proofs
Merkle Proofs 的重點就是要證明資料有沒有在樹上。
如何證明?就是提供要證明的 leaf 以及其相對應的路徑 (path) ,經過計算後一旦能夠產生所需要的 root,就能證明這個 leaf 在這顆樹上。
因此這類要判斷資料有無在樹上的證明,類似的說法有:proving inclusion, proving existence, or proving membership。
這個 proof 的特點在於,我們只提供 leaf 和 path 就可以算出 root,而不需要提供所有的資料 (leaves) 去重新計算整顆 Merkle Tree。這讓我們在驗證資料有沒有在樹上時,不需要花費大量的計算時間,更棒的是,這讓我們只需要儲存 root 就好,而不需要儲存所有的資料。
在區塊鏈上,儲存資料的成本通常很高,也因此 Merkle Tree 的設計往往成為擴容上的重點。
我們知道 n 層的 Merkle Tree 可以存放 2**n 個葉子,以 Tornado Cash 的設計來說,他們設定 Merkle Tree 有 20 層,也就是一顆樹上會有 2**20 = 1048576 個葉子,而我們用一個 root 就代表了這 1048576 筆資料。
接續上段的例子,這顆 20 層的 Merkle Tree 所產生的 Proof ,其路徑 (path) 要從最底下的葉子 hash 幾次才能到達頂端的 root 呢?答案就是跟一棵樹的 levels 一樣,我們要驗證 Proof 所要遞迴的次數就會是 20 次。
在實作之前,我們先來看 MerkleTree 在 client 端是怎麼調用的,這有助於我們理解 Merkle Proofs 在做什麼。
基本上一個 proof 的場景會有兩個人:prover 與 verifier。
在給定一筆 leaves 的樹,必定產生一特定 root。prover 標示他的 leaf 在樹上的 index 等於 2,也就是 leaves[2] == 30,以此來產生一個 proof,這個 proof 的內容大致上會是這個樣子:
對 verifier 來說,他要驗證這個 proof,就是用裡面的 leaf 去一個一個與 pathElements 的值做 hash,上述就是 H('30', 40) 後得出 node,再 hash 一次 H('19786...', node) 於是就能得出這棵樹的 root。
重點來了,這麼做有什麼意義?它的巧思在於對 verifier 來說,他只需要儲存一個 root,由 prover 提交證明給他,經過計算後產生的 root 如果跟 verifier 儲存的 root 一樣,那就證明了 prover 所提供的資料確實存在於這個樹上。
而 verifier 若不透過 proof ,要驗證某個 leaf 是否存在於樹上,也可以把 leaves = [10, 20 ,leaf ,40]整筆資料拿去做 MerkleTree 的演算法跑一趟也能產生特定的 root。
但由 prover 先行計算後所提交的 proof,讓 verifier 不必儲存整批資料,也省去了大量的計算時間,即可做出某資料有無在 Merkle Tree 上的判斷。
Sparse Merkle Tree
上述能夠證明資料有無在樹上的 Merkle Proofs 是屬於標準的 Merkle Tree 的功能。但接下來我們要實作的是稍微不一樣的樹,叫做 Sparse Merkle Tree。
Sparse Merkle Tree 的特色在於除了 proving inclusion 之外,還可以 proving non-inclusion。也就是能夠證明某筆資料不在某個 index,例如 H(A) 不在 index 2 ,這是一般 Merkle Tree 沒辦法做到的。
而要做到 non-membership 的功能其實也不難,就是我們要在沒有資料的葉子裡補上 zero value,或是說 null 值。更多內容請參考:What’s a Sparse Merkle Tree。
實作細節
本節將完整的程式碼分成三個片段來解釋。
首先,這裡使用的 Hash Function 是 MiMC,主要是為了之後在 ZKP 專案上的效率考量,你可以替換成其他較常見的 hash function 例如 node.js 內建 crypto 的 sha256:
crypto.createHash("sha256").update(data.toString()).digest("hex");
這裡定義簡單的 Merkle Tree 介面有 root, proof, and insert。
首先我們必須先給定這顆樹的 levels,也就是樹的高度先決定好,樹所能容納的資料量也因此固定為 2**levels 筆資料,至於要不要有 defaultLeaves 則看創建 Merkle Tree 的 client 自行決定,如果有 defaultLeaves 的話,constructor 就會跑下方一大段計算,對 default 資料開始作 hash 去建立 Merkle Tree。
如果沒有 defaultLeaves,我們的樹也不會是空白的,因為這是顆 Sparse Merkle Tree,這裡使用 zeroValue 作為沒有填上資料的值,zeros 陣列會儲存不同 level 所應該使用的 zero value。假設我們已經填上第 0 筆與第 1 筆資料,要填上第 2 筆資料時,第 2 筆資料就要跟 zeros[0] 做 hash,第 2 筆放左邊, zero value 放右邊。
我們將所有的點不論是 leaf, node, root 都用標籤 (index) 標示,並以 key-value 的形式儲存在 storage 裡面。例如第 0 筆資料會是 0–0,第 1 筆會是 0–1,這兩個 hash 後的節點 (node) 會是 1–0。假設 levels 是 2,1–0 節點就要跟 1–1 節點做 hash,即可產出 root (2–0)。
後半部份的重點在於 proof,先把 proof 和 traverse 看懂,基本上就算是打通任督二脈了,之後有興趣再看 insert 和 update。
sibling 是指要和 current 一起 hashLeftRight 的值…也就是相鄰在兩旁的 leaf (or node)。
到這裡程式碼的部分就結束了。
最後,讓我們回到一開始 client 調用 merkleTree 的例子:
以及 proof 的內容:
前面略過了 proof 裡頭的 pathIndices,pathIndices 告訴你的是當前的 leaf (or node) 是要放在左邊,還是放在右邊,大概是這個樣子:
if (indices == 0) hash(A, B);if (indices == 1) hash(B, A);
有興趣的讀者可以實作 verify function 看看就會知道了!
原始碼
TypeScript from gist
JavaScript from tornado-core
參考
Merkle Proofs Explained
What’s a Sparse Merkle Tree?
延伸:Verkle Tree
Merkle Tree in JavaScript was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
遞迴公式 在 吳老師教學部落格 Youtube 的最佳解答
Python基礎程式語言應用證照班第7次上課
01_重點回顧與308題增加外迴圈
02_308題改為for_each的寫法
03_308題改用餘數與除除方法
04_310迴圈公式計算解答
05_402不定數迴圈最小值解答
06_402不定數迴圈改用串列完成
07_404數字反轉判斷用文字串接解答
08_404數字反轉用List反轉輸出
09_重點回顧與預告
完整教學
http://goo.gl/aQTMFS
吳老師教學論壇
http://www.tqc.idv.tw/
教學論壇(之後課程會放論壇上課學員請自行加入):
https://groups.google.com/g/tcfst_python_2021_2
證照基礎程式語言 (Python 3)證照
Python 第1類:基本程式設計
技能內容:變數與常數、指定敘述、標準輸入輸出、運算式、算術運算子、數學函式的應用、格式化的輸出Python 第2類:選擇敘述
技能內容:if、if...else、if…elifPython 第3類:迴圈敘述
技能內容:while、for…inPython 第4類:進階控制流程
技能內容:常用的控制結構、條件判斷、迴圈Python 第5類:函式(Function)
技能內容:函式使用、傳遞參數、回傳資料、內建函式、區域變數與全域變數
上課用書:
Python 3.x 程式語言特訓教材(第二版)
作者: 蔡明志, 財團法人中華民國電腦技能基金會
出版社:全華
出版日期:2018/12/20
定價:490元
吳老師 110/9/2
EXCEL,VBA,Python,自強工業基金會,EXCEL,VBA,函數,程式設計,線上教學,PYTHON安裝環境
遞迴公式 在 吳老師教學部落格 Youtube 的最佳解答
Python基礎程式語言應用證照班第7次上課
01_重點回顧與308題增加外迴圈
02_308題改為for_each的寫法
03_308題改用餘數與除除方法
04_310迴圈公式計算解答
05_402不定數迴圈最小值解答
06_402不定數迴圈改用串列完成
07_404數字反轉判斷用文字串接解答
08_404數字反轉用List反轉輸出
09_重點回顧與預告
完整教學
http://goo.gl/aQTMFS
吳老師教學論壇
http://www.tqc.idv.tw/
教學論壇(之後課程會放論壇上課學員請自行加入):
https://groups.google.com/g/tcfst_python_2021_2
證照基礎程式語言 (Python 3)證照
Python 第1類:基本程式設計
技能內容:變數與常數、指定敘述、標準輸入輸出、運算式、算術運算子、數學函式的應用、格式化的輸出Python 第2類:選擇敘述
技能內容:if、if...else、if…elifPython 第3類:迴圈敘述
技能內容:while、for…inPython 第4類:進階控制流程
技能內容:常用的控制結構、條件判斷、迴圈Python 第5類:函式(Function)
技能內容:函式使用、傳遞參數、回傳資料、內建函式、區域變數與全域變數
上課用書:
Python 3.x 程式語言特訓教材(第二版)
作者: 蔡明志, 財團法人中華民國電腦技能基金會
出版社:全華
出版日期:2018/12/20
定價:490元
吳老師 110/9/2
EXCEL,VBA,Python,自強工業基金會,EXCEL,VBA,函數,程式設計,線上教學,PYTHON安裝環境
遞迴公式 在 吳老師教學部落格 Youtube 的精選貼文
Python基礎程式語言應用證照班第7次上課
01_重點回顧與308題增加外迴圈
02_308題改為for_each的寫法
03_308題改用餘數與除除方法
04_310迴圈公式計算解答
05_402不定數迴圈最小值解答
06_402不定數迴圈改用串列完成
07_404數字反轉判斷用文字串接解答
08_404數字反轉用List反轉輸出
09_重點回顧與預告
完整教學
http://goo.gl/aQTMFS
吳老師教學論壇
http://www.tqc.idv.tw/
教學論壇(之後課程會放論壇上課學員請自行加入):
https://groups.google.com/g/tcfst_python_2021_2
證照基礎程式語言 (Python 3)證照
Python 第1類:基本程式設計
技能內容:變數與常數、指定敘述、標準輸入輸出、運算式、算術運算子、數學函式的應用、格式化的輸出Python 第2類:選擇敘述
技能內容:if、if...else、if…elifPython 第3類:迴圈敘述
技能內容:while、for…inPython 第4類:進階控制流程
技能內容:常用的控制結構、條件判斷、迴圈Python 第5類:函式(Function)
技能內容:函式使用、傳遞參數、回傳資料、內建函式、區域變數與全域變數
上課用書:
Python 3.x 程式語言特訓教材(第二版)
作者: 蔡明志, 財團法人中華民國電腦技能基金會
出版社:全華
出版日期:2018/12/20
定價:490元
吳老師 110/9/2
EXCEL,VBA,Python,自強工業基金會,EXCEL,VBA,函數,程式設計,線上教學,PYTHON安裝環境