〝 KUMA熊醬坐鎮 〞髒污通通不敢放肆 !!
拔拔麻麻們肯定都有經驗,辛苦拼命賺罐罐錢
到家卻看到滿地毛、衛生紙、永遠瞄不準的尿😆
#KUMA麻麻 整理到厭世心聲廠商終於聽到了❤️
iRobot Roomba i3+ 自動倒垃圾輕旗艦掃地機器人
超大密封過敏原集塵袋「 能裝20個600ml飲料瓶垃圾量 」
掃地結束後全智能收集高達 30 次環境髒汙「不髒手」
獨家專利 Aero Force 塑膠主滾刷,清除力多 1.5 倍
還有「 精準標靶清潔 」鎖定想清潔地區深層打掃
APP串流「出差、外出工作」照樣能隨時啟動清掃
「木地板、大理石、磁磚、短毛地毯」都可以使用
耐髒布料點綴質感配上客廳房間裝潢擺設超優雅
iRobot Braava Jet m6 乾溼分離兩用拖地機器人
機體方正深入 #邊邊角角,拖的乾淨溜溜~~
內附乾擦帶走 #灰塵毛髮、濕拖噴水 #清除頑固髒污
「 450ml 」超大水箱,濕拖模式達到清潔「12坪」
超貼心不髒手設計,一鍵即可汰換拋棄式清潔墊設計
獨家串流技術「機器人互相溝通」先掃再拖
i3+ 深層打掃 ,m6 接棒拖地,KUMA麻要先來休息囉
P.S.為何不合併成一台兩用機器人呢??
對於兩用機器人實用性上基本上會有一方面較弱
iRobot Roomba i3+、iRobot Braava Jet m6
完善APP串連機器人溝通搭配,請相信術業有專攻
#iRobot居家好幫手
( 活動連結會放在留言處呦 )
同時也有2部Youtube影片,追蹤數超過3,490的網紅美絮子 Melody,也在其Youtube影片中提到,人生第一次光暗百抽真緊張, 繼前陣子小狼和佐哥幫LAMA代抽完變成消波塊之後, 小美深深害怕自己要變成他們的鄰居XD 還好後來抽光暗卷的時候召喚陣有爭氣一點,偽4很多但整體閃率很OK了~ 雖然沒有原五,但是有最新的原4暗樹妖和上一期的光環~以及暗武士。 沒有抽到原五,也沒有抽到博士最想要的暗人魚。...
基本上會有3 在 邱顯智 Facebook 的最讚貼文
最近接到陳情,有一些地方警局正在加強執法「電動自行車未懸掛車牌」,衍生電動自行車車牌頻頻遭竊的案外案,在這邊,來跟大家談談電動自行車的納管問題。
根據2008年施行的道交條例69-1條和電動輔助自行車及電動自行車型式安全審驗管理辦法,合格的電動自行車都會有「審驗合格標章 #雷射貼紙」。2016年辦法修正後,除了增加一張白底黑字的「合格標章 電動自行車」車牌,並將原先須黏貼在車子龍頭的 #貼紙,改為黏貼在車後的車牌上。
問題來了,將雷射貼紙黏貼於後方懸掛之合格標章車牌,較為方便員警辨識執法,但這也延伸出車牌容易失竊之問題。
因為,目前電動車雷射貼紙採 #認車不認人 的模式,上面僅會標明車輛廠牌,型號,流水號。同廠牌同型號的車牌,只會有流水號的不同。
這會有什麼問題呢?除了失竊車牌無法照正常方式報警失竊,不易尋回外,在取締上,除非全面造冊,否則基本上會有辨識困難的問題,更遑論後方懸掛之合格標章車牌,在某知名網購網站即可隨意購買。
上個會期,有關電動自行車納管的法案,在5月13日送出交通委員會,因為疫情爆發,尚待協商與二三讀處理。當時達成的共識條文包括:
微型電動二輪車應經檢測及形式審驗合格,登記、領用、懸掛牌照後,使得行駛道路;微型電動二輪車所有人應依規定投保強制汽車責任保險,未依規定投保,公路監理機關不予受理登記、換照或發照。
簡單講,領牌照、保強制險,才能上路。
希望下個會期,執政黨能盡快處理相關法案,讓電動自行車比照現行機車制度,#將車與人連結,才能妥善完成納保與過戶程序,並在違規時能依法處理。
終結混亂的電動自行車規定,讓民眾不再無所適從,下個會期,我們繼續加油!
基本上會有3 在 Taipei Ethereum Meetup Facebook 的最讚貼文
📜 [專欄新文章] Tornado Cash 實例解析
✍️ Johnson
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
Tornado Cash 是一個使用 zk-SNARKs 建立的 Dapp,它實現了匿名的代幣交易,這篇文章就用一些程式碼片段,來分享它是怎麼運作的。
本文為 Tornado Cash 研究系列的 Part 3,本系列以 tornado-core 為教材,學習開發 ZKP 的應用,另兩篇為:
Part 1:Merkle Tree in JavaScript
Part 2:ZKP 與智能合約的開發入門
Special thanks to C.C. Liang for review and enlightenment.
我們知道在以太坊上的交易紀錄都是公開的,你可以在 etherscan 上看到某個地址的所有歷史交易紀錄,當然地址是合約的話也是一樣。
也許創建一個新的錢包和地址就好了?假設一個情境是 Alice 想要匿名傳送 1 ETH 給 Bob,Alice 原本的錢包是 A,但她不想讓 A 地址傳給 Bob 的交易紀錄被看到,所以 Alice 創建另一個錢包 B,顯然 B 錢包是空的,Alice 必須把 A 錢包的 1 ETH 傳到 B 錢包,再用 B 錢包的地址傳給 Bob。
但問題就在於,只要追蹤 B 錢包的地址,就能看到 B 的歷史交易紀錄中 A 錢包曾經打幣給 B 錢包,於是到頭來交易還是被追蹤到了。
Tornado Cash 的解決方案,簡單來說,它是一份合約,當你要匿名傳送代幣時,就把一定數量的幣丟進合約裡 (Deposit),此時你會拿到一個 note,長得像這樣:
tornado-eth-0.1-5-0x3863c2e16abc85d72b64d78c68fca5936db2501832e26345226efdfb2bc45804977f167d86b711bb6b4095ddaa646ec93f0a93ac4884a66c1d881f4fc985
note 就是一串字串,擁有這字串的人,就能提領 (Withdraw) 剛剛傳入合約的代幣。握有 note 就代表擁有提款的權利,所以 note 一旦被別人知道,別人就可以把錢給提走。
其中,後面那段亂碼,本篇文章就以「秘密」來稱呼,這個秘密是由 secret 與 nullifier 組成,而這兩個都是在鏈下隨機產生的亂數。
因此 Tornado 的合約基本上會有兩個函式:
Deposit
Withdraw
有興趣的人可以先到 Dapp 上先玩一次看看,使用 Goerli 測試網,這裡可以領 Goerli 的代幣:https://goerli-faucet.slock.it/
Deposit
我們就從 Deposit 開始說起,簡單來說, Deposit 是將資料儲存到合約的 Merkle Tree 上。
剛剛提到的秘密,它是在鏈下產生,由 secret 跟 nullifier 組成,合在一起之後也稱作 preimage,因為我們要對這個 preimage 進行 hash,就會成為 commitment。
合約中 Deposit 如下:
deposit 除了傳送代幣到合約之外,需填入一個參數 _commitment。
我們對 preimage 使用 Pedersen 作為 hash function 加密後產生 commitment,以偽代碼表示如下:
const preimage = secret + nullifier;const commitment = pedersenHash(preimage);
這個 commitment 會成為 Merkle Tree 的葉子,所以合約中的 _insert(commitment) 來自 MerkleTreeWithHistory.sol 的合約,將我們的資料插入 Merkle Tree,然後回傳一個 index 給你,告訴你這個 commitment 在 Merkle Tree 上的位置,最後一起發布成公開的 Deposit 事件。
我們知道 MerkleTree 是將一大筆資料兩兩做雜湊後產生一個唯一值 root,這個 root 就是合約上所儲存的歷史資料。
root 的特性就是只要底下的資料一有更動,就會重新產生新的 root。
所以只要一有用戶 deposit ,就會插入新的葉子到 Merkle Tree 上,於是就會產生新的 root,所以在合約中有一個陣列是用來儲存所有的 root 的 roots:
bytes32[ROOT_HISTORY_SIZE] public roots;
roots 是用來紀錄每個 deposit 的歷史,每一次 deposit 都會創造新的 root,而所有 root 都會被儲存進 roots 裡,於是當你要提領的時候,就要證明你的 commitment 所算出的 root 曾經出現在 roots 裡,代表曾經有 deposit 的動作,因此才可以進行提領。
Withdraw
在 Deposit 之前 Tornado Cash 就會在鏈下產生秘密後交給使用者,擁有這個秘密的人等於擁有提款的權利。
提領的時候,秘密會在鏈下計算後產生 proof,proof 是 withdraw 需要的參數,所以只要確保這個 proof 能夠被驗證,那麼代幣的接收地址 (recipient) 就可以隨便我們填,只要不填上當初拿來 deposit 用的地址,基本上就做到匿名交易的效果了。
也就是說,產生這個 proof 並提交給合約,能夠證明此人知道秘密,但卻不告訴合約秘密本身是什麼。
function withdraw(bytes calldata _proof, bytes32 _root, bytes32 _nullifierHash, address payable _recipient, address payable _relayer, uint256 _fee, uint256 _refund) external payable nonReentrant;
我們可以清楚看到 withdraw 函式裡沒有接收有關秘密的任何資訊作為參數,也就是秘密不會與合約有所接觸,也不會暴露在 etherscan 上。
回顧 ZKP 所帶來的效果:
鏈下計算
隱藏秘密
在 Tornado Cash 的例子中,我們用秘密來產生證明,完成的鏈下計算包括:
將秘密 hash 成 commitment
算出 Merkle Tree 的 root。
以下是簡化後的 withdraw.circom:
template Withdraw(levels) { signal input root; signal input nullifierHash;
signal private input nullifier; signal private input secret; signal private input pathElements[levels]; signal private input pathIndices[levels];
component hasher = CommitmentHasher(); // Pedersen hasher.nullifier <== nullifier; hasher.secret <== secret; hasher.nullifierHash === nullifierHash;
component tree = MerkleTreeChecker(levels); // MiMC tree.leaf <== hasher.commitment; tree.root <== root; for (var i = 0; i < levels; i++) { tree.pathElements[i] <== pathElements[i]; tree.pathIndices[i] <== pathIndices[i]; }}
component main = Withdraw(20);
從上述代碼就可以看出這份 circuit 的 private 變數有:
secret
nullifier
pathElements
pathIndices
而 public 變數有:
root
nullifierHash
如同我們一開始說過的,秘密就是指 secret 與 nullifier。這裡進行的鏈下計算就是對 secret 與 nullifier 雜湊成 commitment。而使用的 hash function 叫做 Pedersen。
在進行 Merkle Tree 的計算之前,我們還檢查了 nullifier 雜湊後的 nullifierHash 跟 public 變數 nullifierHash 是不是一樣的。
hasher.nullifierHash === nullifierHash;
接下來,開始計算 Merkle Proof,用意是確認經過雜湊後的 commitment 有沒有出現在 Merkle Tree 上,所以我們的 private input 還有 pathElements 與 pathIndices(詳情參考 Part 1 Merkle Tree in JavaScript),讓它跑一趟 Merkle Proof 的計算,最後就能夠算出一個 root,再確認計算後的 root 與我們的 public 變數 root 是否一樣。
tree.root <== root;
於是我們就能產生一個 ZKP 的證明 — 證明 private 變數:secret, nullifier, pathElements, pathIndices 可以計算出 public 變數:root 與 nullifierHash。
把這個證明提交給合約,合約透過 Verifier 驗證 proof 是否正確,以及必須事先確認:
public 變數 root 有在合約的 roots 裡面。
public 變數 nullifierHash 在合約中是第一次出現。
以下附上完整的 withdraw 原始碼:
必須注意 ZKP 是向合約證明使用者填入的 secret 和 nullifier 可以計算出某個 root,但無法保證這個 root 曾經在合約的 roots 歷史上。
所以合約的 withdraw 中,除了 verifyProof 之外,還要事先檢查 ZKP 算出來的 root 是不是真的在歷史上發生過,所以需要 isKnownRoot 的檢查:
function isKnownRoot(bytes32 _root) public view returns(bool)
必須先檢查 isKnownRoot 後才能進行 verifyProof。
經過 verifyProof 驗證成功後,合約就開始進行提款的動作,也就會將代幣傳到 recipient 的地址,最後拋出 Withdrawal 的事件。
nullifier 與 nullifierHash
為什麼我們的秘密不是只有 secret 還要額外加一個 nullifier?
簡單來說,這是為了防止已經提領過的 note 又再提領一次,也就是所謂的 double spend。
require(!nullifierHashes[_nullifierHash], "The note has been already spent");
可以看到 withdraw 需要填入參數 nullifierHash,跟 isKnownRoot 一樣的狀況,我們需要對電路的 public 變數先經過一層檢查之後,才能帶入到 verifyProof 裡面。
nullifierHash 可以理解為這個 note 的 id,但它不會連結到 deposit,因此可以用來紀錄這個 note 是否已經被提領過。
所以當 verifyProof 驗證成功之後,我們要紀錄 nullifierHash 已完成提領:
nullifierHashes[_nullifierHash] = true;
有關為什麼需要事先檢查 public 變數後,才能帶入 verifyProof ,可以參考 Part 2:ZKP 與智能合約的開發入門 提到的 publicSignals 的部分。
附上 Tornado Cash 的架構圖:
簡化版的 tornado-core
tornado-core 的程式碼很簡潔漂亮,所以我模仿該專案自己實作一遍:
simple-tornado:https://github.com/chnejohnson/simple-tornado
這份專案只完成了 tornado-core 的核心部分,不一樣的是我的開發環境使用 hardhat 與 ethers 寫成,而 circom 與 snarkjs 使用官方當前的版本,合約用 0.7.0,測試使用 Typescript 。
比起兩年前的 tornado-core ,simple-tornado 使用的技術更新,可能更適合初學者理解這份專案,但是它有 bug…我在 issues 的地方有紀錄說明。
在開發的過程中,我的順序是先從最小單位的 MiMC hash function 開始玩,發現必須 javascript 算一次 hash、solidity 算一次、circom 再算一次,確保這三個語言對同一個值算出同樣的 hash 之後,才能放心去做更複雜的 Merkle Tree。
總結
我們可以看到 Tornado Cash 簡單的兩個函式:Deposit 與 Withdraw,透過將代幣送入合約後再提領到另一個地址的流程,應用 ZKP 達成匿名的交易。
除了斷開 Deposit 與 Withdraw 的地址關聯性之外,Tornado Cash 還有做了一層「藏樹於林」的隱私防護,這部份的解釋就請參考 ZKP 讀書會 Tornado Cash。
網路上很多關於 ZKP 的文章或專案都是在 2019 年後出產的,經過許多人對這項技術的嘗試,讓我們對 ZKP 有了更清晰的理解,如今兩年後,開發工具也變得更加成熟,期待未來在 web 隱私議題上能看到更多 ZKP 大放異彩的應用。
原始碼
tornado-core
simple-tornado
參考資料
ZKP 讀書會 Tornado Cash
Tornado Privacy Solution Cryptographic Review
Tornado Cash 實例解析 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
基本上會有3 在 美絮子 Melody Youtube 的精選貼文
人生第一次光暗百抽真緊張,
繼前陣子小狼和佐哥幫LAMA代抽完變成消波塊之後,
小美深深害怕自己要變成他們的鄰居XD
還好後來抽光暗卷的時候召喚陣有爭氣一點,偽4很多但整體閃率很OK了~
雖然沒有原五,但是有最新的原4暗樹妖和上一期的光環~以及暗武士。
沒有抽到原五,也沒有抽到博士最想要的暗人魚。
抱著陪葬的心情,小美也把自己身上的卷抽光,結果......火精爹就來了= =
博士我真的沒有拿你當墊卷的啊......相信我QQ
老頭加碼129抽,這帳號特別容易出鳥頭!?
最後出了偽五大蛇,大家一起幫QQ吧
10/05(五)基本上會有代抽,多少抽還不確定~
P.S.影片因為畫質一直有問題所以前後上傳了3次,覺得難過QQ
每星期五PM22:00~AM00:30是小美固定的魔靈召喚時間,每週都請記得鎖定小美的魔靈實況唷!
------------------------------
如果想看小美直播唱歌聊天的話,也可以追蹤我的粉專喔^_^
粉專是直播時間、公開活動的公布地,加上日常動態發文區~
-
♥ 蝦皮拍賣「《美絮子》現貨出清小舖」⬇
https://shopee.tw/annalin30
♥ Twitch實況⬇
https://www.twitch.tv/melodyxiaomei
♥ YouTube頻道⬇
http://www.youtube.com/MelodyGames
♥ Facebook粉專⬇
http://www.facebook.com/MelodyXiaoMei
♥ IG ⬇
https://www.instagram.com/melodyxiaomei
基本上會有3 在 SHIN LI Youtube 的精選貼文
#SHINLI #男生化妝 #新手化妝
2018年更新了一個新的新手化妝分享,歡迎觀賞
https://www.youtube.com/watch?v=N1SiyQwrSvI
我是SHINLI,謝謝你們觀看我的頻道 。
► 訂閱SHINLI : https://goo.gl/N6HfkY
►追蹤SHINLI
INSTAGRAM [shinlii] :
https://goo.gl/iXXNJT
►相關影片 :
抗痘大戰,好用痘痘藥推薦
https://goo.gl/oR7q4J
痘疤GET OUT - 淡疤好物推薦
https://goo.gl/hzDuFV
-
男生的新手化妝
男生化妝的重點就是「零妝感」!
但會想要分享這個並不是因為覺得自己化妝技術很好,只是覺得應該有很多男生其實可能想要接觸但卻不知從何開始,所以拍了這個分享影片。
我化妝總共分幾步驟
妝前保養 → 痘痘藥(可略過) →防曬以及隔離 → 粉底液或粉餅→ 遮瑕 → 定妝
1.妝前保養
這個步驟主要是要讓臉部保濕,讓後續不會出油,也讓妝感更服貼。
#廣源良菜瓜水
先用菜瓜水噴在化妝棉上擦拭臉部,再做一個基礎的清潔與保濕,菜瓜水又便宜跟起來很舒服,完全不用心疼。
#契爾氏金盞花化妝水
這款火紅程度不需要我多講,但他的鎮定效果真的不是蓋的,一級棒棒棒棒!
#肌研及潤保濕乳液
我很喜歡用這瓶,保濕度夠,價格又部會太高,而且沒有甚麼味道也不會有酒精,用起來很舒服。
2.痘痘藥
擦一點痘痘藥讓自己的痘痘可以鎮定舒緩一點,但不要用凝膠內的,這樣你的化妝品會跟這個打架,穩起屑的!
#獅王PAIR痘痘藥
很清爽的質地,而且很好吸收,用一點在痘痘上面就可以有安心的效果。
3.防曬隔離
防曬是絕對少不了的步驟,化妝品可能本身會有防曬,但那個絕對不夠,加上隔離乳基本上會有一些潤色的效果。
#Biore高防曬隔離乳液
這款是"物理性"的防曬,不會讓你致痘,重點是它控油好到炸,你只要用了真的超有感,重點是他很便宜,200有找。
#Orbis和漢淨肌光暈隔離霜
這個是主打讓油痘肌也能用的隔離乳,本身有點粉色,使用後會有點潤色的效果。
4.粉底液或粉餅
底妝的部分有超多種方式,最基本的粉底液或是粉餅,皮膚科醫生都會推薦用粉餅,因為比較不會悶住皮膚。
切記,量要少,讓膚色均勻就可以了!
#FIT ME反孔特霧粉底液
因為我很黑我買色號230的,但是它是要用倒的,有時候會不小心失手,這款也是比較不會造成痘痘生長的粉底液。
但說真的他的遮瑕度,還好,不過真的可以稍微讓你毛孔看起來小小的。
5.遮瑕
這個步驟有些人會在粉底液前用,但我會在上粉底液後使用,才知道我那些痘疤需要再做遮瑕。
#Maybelline純淨礦物遮瑕筆
這款其實遮瑕度普普,但因為是我第一支買得所以一直用到現在(其實也沒多久),輕點在要遮瑕的地方,在用手指暈開即可。
6.定妝
如果是油痘肌,千萬不可以忘記這個步驟,他可以讓你的妝長長久久到永久(可能也沒那麼久),但會讓你更不會出油。
#惹我清爽吸油蜜粉
很便宜,用起來也還不錯,真的有吸油的感覺,輕拍在你臉頰中最會冒油的地方,然後再用餘粉輕拍在其他的地方即可。
7.護唇膏
這個可有可無,但因為我有時候嘴唇會比較乾,所以還是會上一下,才不會脫皮嚇到別人。
#Lucas' Papaw Ointment 木瓜霜
萬用,不管你是要滋潤還是痘痘或是燒傷甚麼有的沒的(自己GOOGLE),都可以用它,我是把它拿來當成護唇膏,我覺得很讚,小小一點大大威力,讓你雙唇潤澤一級棒。
這只是我個人的經驗分享,
但如果你有甚麼更好的建議,
也歡迎教我一下,
但請溫柔一點,霸偷霸偷。
-
►看其他影片
超商店員的怒吼-惹怒超商店員的五個小動作
https://goo.gl/rVP6Wm
奧客退散 - 五個咖啡廳的奧客行為
https://goo.gl/rbe6va
入伍不慌張,當兵必備用品!
https://goo.gl/amQnzh
-
►音樂(Music) : https://goo.gl/9Tvgh5
基本上會有3 在 中橫路況交通資訊站- 基本上在高山道路會有雲霧是 ... - Facebook 的推薦與評價
基本上 在高山道路會有雲霧是基本的... 尤其海拔1500以上至於什麼時候有雲霧這個問題 ... 就像什麼時候會想尿尿一樣(新白楊至翠峰常有雲霧路段) 一樣! ... 3 yrs Report. ... <看更多>
基本上會有3 在 版權警告基本須知- YouTube說明 的推薦與評價
此外,Content ID 聲明並不會導致使用者收到警告。 即使將收到警告的影片刪除,也無法解除警告狀態。請參閱下方內容,瞭解如何解除版權警告。 收到版權警告會有什麼 ... ... <看更多>