別想偷懶 !! 雙人全身肌力訓練你的核心 訓練你的腿部肌群~ c金女神二人組 陪你一起練起來~【邊吃邊聊 Chatting over eating】
https://youtu.be/p_908m3oNng
要吃也要瘦~
c金女神 陪你一起在家喘起來
核心&腿部肌群 統統都不放過~
#全身肌力 #腿部肌群 #核心 #雙人運動 #徒手健身 #健身 #瘦身 #減肥 #宅運動 #馬甲線 #減重 #運動 #燃脂 #瘦身 #爆汗 #燃脂運動 #瘦身燃脂 #健康運動 #瘦身教學 #馬甲綫 #人魚綫 #減肥運動 #居家訓練 #翹臀訓練 #馬甲線 #在家運動 #產後瘦身 #腹肌訓練 #邊吃邊聊 #八金蛙后 #健身 #瘦身 #減肥 #李仱娜 #邑葵
💁企劃:amblinher
📸Photographer&場地: 十月攝影工作室
💄Makeup:youngerliao
👗服裝造型:fattystylist
✂剪接: Null
🎅🎰封面製作:Mr.7
🌟Artist: 八金蛙后邑葵 & Cecilia Chen
同時也有21部Youtube影片,追蹤數超過1萬的網紅Ritorun Ch.りとるん,也在其Youtube影片中提到,チャンネル登録、高評価👍Twitterフォローお願いします(🍎`꒳´🍎) ୨୧┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈୨୧ ▸ アフリカTV https://play.afreecatv.com/aftvgame/null イベントの詳細▿ https://bit.ly/2PYcVXp ୨୧┈┈┈...
「null c」的推薦目錄:
- 關於null c 在 Facebook 的最讚貼文
- 關於null c 在 Taipei Ethereum Meetup Facebook 的精選貼文
- 關於null c 在 Hưng Nhổn Facebook 的精選貼文
- 關於null c 在 Ritorun Ch.りとるん Youtube 的精選貼文
- 關於null c 在 史九87 SJ87 Youtube 的精選貼文
- 關於null c 在 史九87 SJ87 Youtube 的精選貼文
- 關於null c 在 [心得] 空指標常數(null pointer constant) - 看板C_and_CPP 的評價
- 關於null c 在 C++ nullptr 與NULL 的差異 的評價
- 關於null c 在 Checking for NULL pointer in C/C++ [closed] - Stack Overflow 的評價
- 關於null c 在 In C, why is NULL and 0 triggering an if statement - Software ... 的評價
null c 在 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.
👏 歡迎轉載分享鼓掌
null c 在 Hưng Nhổn Facebook 的精選貼文
Valorant: Kỹ năng Agent 16 KAY/O
KAY/O là một cỗ máy chiến tranh được chế tạo vì một mục đích duy nhất: vô hiệu hóa kẻ thù. Khả năng áp chế kỹ năng của kẻ địch khiến chúng không thể phản kháng chắc chắn sẽ mang đến lợi thế lớn cho KAY/O và đồng đội khi giao tranh.
Riot đã công bố KAY / O được trang bị đèn flash, lựu đạn, hồi sinh và trấn áp, một công cụ mới ngăn kẻ thù.
Kỹ năng
(Q) FLASH / drive, KAY / O ném một quả lựu đạn làm mù người chơi trong tầm nhìn của nó. Nhấp chuột phải vào lựu đạn mù, ném 1 quả lựu đạn tích đầy năng lượng, khiến nó phát nổ ngay chỉ trong 1 giây, ngược lại nếu ném bằng cách nhấp chuột trái, lựu đạn mù sẽ phát nổ trong 1,6 giây.
Người chơi sẽ muốn ném FLASH / lái xe khi vào một địa điểm để giúp đội của họ tấn công. Đây cũng là một cách tuyệt vời để kiểm tra các góc và chống lại một tay bắn tỉa đối phương.
(C) FRAG / ment ném một chất nổ xuống sàn và bốc cháy nhiều lần, gây sát thương chết người ở trung tâm của nó.
Nó có thể sẽ được sử dụng nhiều hơn để khoanh vùng vì nó khá dễ né và tốc độ đường đạn chậm. Nhưng người chơi có thể học cách xếp hàng trong các tình huống sau khi trồng cây, ngăn không cho đội đối phương phá hỏng Spike và đứng im cho đến khi nó phát nổ.
(E) ZERO/point: KAY / O ném một lưỡi kiếm trấn áp. Lưỡi dao sẽ cắm vào bề mặt đầu tiên chạm phải, sau một khoảng thời gian sẽ phát nổ và áp chế tất cả những ai trong tầm ảnh hưởng, khiến các kỹ năng của kẻ thù trở nên vô dụng
(X) NULL/cmd: Chiêu cuối của robot, cho phép KAY / O phát xung năng lượng bức xạ để ngăn chặn kẻ thù trúng phải trong bán kính khổng lồ của nó. Người khởi xướng cũng nhận được kích thích chiến đấu trong suốt thời gian và bị hạ gục thay vì bị giết khi nhận sát thương chí mạng. Anh ta có thể được hồi sinh bởi đồng minh vào thời điểm này hoặc bị giết nếu đội đối phương có thể gây ra 850 sát thương cho robot bị bắn rơi.
Nếu KAY/O bị hạ gục khi đã tải đầy năng lượng, hắn sẽ bị tắt nguồn và rơi đi vào trạng thái mất ổn định, các đồng minh có thể cân bằng lại bộ vi xử lý của hắn để hồi sinh hắn.
null c 在 Ritorun Ch.りとるん Youtube 的精選貼文
チャンネル登録、高評価👍Twitterフォローお願いします(🍎`꒳´🍎)
୨୧┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈୨୧
▸ アフリカTV
https://play.afreecatv.com/aftvgame/null
イベントの詳細▿
https://bit.ly/2PYcVXp
୨୧┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈୨୧
▸ りとるんグッズ
https://ritorun.booth.pm/
▸ チャンネル登録よろしくねっ
https://www.youtube.com/channel/UC3tOL8JHgdhz4hPU-DKYXNw
▸ Twitterフォローしてくれると配信情報とかわかるよっ
https://twitter.com/RitorunGames
▸ りとるんメンバーシップはこちらから↓↓(コミュニティ更新4/16🆕)
https://www.youtube.com/channel/UC3tOL8JHgdhz4hPU-DKYXNw/join
▸ りとるんの欲しい物が詰まったリスト
https://www.amazon.co.jp/hz/wishlist/ls/NC710X6BK5G2?&sort=default
୨୧┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈୨୧
▾お願い▾
※配信に関係ない、個人的な会話のやり取りは控えてください。
※話題に出してない配信者さんの名前を出さない、他配信で私の名前も出さないで下さい(配信者さんが出してる場合を除く)
※不快になるようなコメント等はしないでください
※スパムや荒らしを見かけても反応しないこと、ブロック&通報で無視してください
(BANされた人がいても皆はスルーしてください)
楽しい配信にしたいので皆さんご協力お願いね!
୨୧┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈୨୧
▸総合タグ 【#りとるん】
▸生配信 【#切りとるん】
▸ファンアート【#りとアート】
▸タグ検索用 【#りとるっく】
▸ファンネーム【りとっこ】
✉ [email protected](連絡用、Amazonギフト券、BAN解除依頼等)
BGM:トーマス大森音楽工房
https://www.youtube.com/c/FreeMusicTh...
୨୧┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈୨୧
null c 在 史九87 SJ87 Youtube 的精選貼文
💻 演算法到底是什麼
💻 演算法如何決定我們看什麼
💻 為什麼演算法這麼重要
👉資訊相關👈
————————————————————————
● 軟體工程師冷知識 - printf 為什麼有個 f、C++ 名字由來、為什麼要 hello world 我想長資識 https://youtu.be/Ddcbdkcd8eo
● 面試祕笈!絕不藏私!軟體工程師的面試技巧 我想長資識 E03 https://youtu.be/UxmlFsQFqx4
● Null 不是唸「怒嘔」?工程師常常唸錯的單字 我想長資識 E02 https://youtu.be/1YEcEQw0vGA
● 韌體是什麼? 4分鐘!讓你認識軟體硬體與韌體 我想長資識 E01 https://youtu.be/ZHWsHUEz4qk
————————————————————————
👉追蹤我們👈
————————————————————————
史九87 IG ► https://www.instagram.com/im9vv
史九87 FB ► https://www.facebook.com/shihjo87
商業合作請洽詢 ► shihjo87@gmail.com
信箱箱址中文:
24199
三重忠孝路郵局第 88 號信箱
信箱箱址英文:
P.O.BOX 88 Sanchong Zhongxiao Road
New Taipei City 24199
Taiwan (R.O.C)
————————————————————————
null c 在 史九87 SJ87 Youtube 的精選貼文
三個你不一定知道的小知識
我想長資識有史以來最輕鬆的主題 😜
👨💻 C 語言的由來 (C++ 為什麼叫做 C++, C# 又是什麼)
👩💻 printf 的 f 到底是什麼意思?
👨💻 為什麼寫程式的人都在那邊 hello world
👉資訊相關👈
————————————————————————
● 面試祕笈!絕不藏私!軟體工程師的面試技巧 我想長資識 E03 https://youtu.be/UxmlFsQFqx4
● 2019 年最令人期待的手機? Pixel 4 曝光!來自 Google 的技術結晶 https://youtu.be/fppqZnZAZQM
● Null 不是唸「怒嘔」?工程師常常唸錯的單字 我想長資識 E02 https://youtu.be/1YEcEQw0vGA
● 韌體是什麼? 4分鐘!讓你認識軟體硬體與韌體 我想長資識 E01 https://youtu.be/ZHWsHUEz4qk
————————————————————————
👉追蹤我們👈
————————————————————————
史九87 IG ► https://www.instagram.com/im9vv
史九87 FB ► https://www.facebook.com/shihjo87
商業合作請洽詢 ► shihjo87@gmail.com
信箱箱址中文:
24199
三重忠孝路郵局第 88 號信箱
信箱箱址英文:
P.O.BOX 88 Sanchong Zhongxiao Road
New Taipei City 24199
Taiwan (R.O.C)
————————————————————————
null c 在 C++ nullptr 與NULL 的差異 的推薦與評價
本篇ShengYu 介紹C++11 nullptr 與NULL 的差異,nullptr 是C++11 加入的新功能,用法跟NULL 差不多,那為什麼C++11 要生出一個nullptr 呢?nullptr 跟 ... ... <看更多>
null c 在 [心得] 空指標常數(null pointer constant) - 看板C_and_CPP 的推薦與評價
以下是板工的小小心得,準備補充13誡用。
若是有不對的地方,請各位鞭小力點 /(_ _)\
(板工很懶得上色,以後會放一份在板工新blog)
### 在C的情況(注意:C++不適用,C++的場合請看下一節) ###
根據C11 standard 6.3.2.3 裡對空指標常數 (null pointer constant)的定義:
An integer constant expression with the value 0, or such an expression cast
to type void *, is called a null pointer constant.
也就是說,(void*)0 是空指標常數(null pointer constant),
而(int *)0 是型別為整數指標的空指標(null pointer),這兩者是不一樣的。
比較明顯的分別是,空指標常數可以被設成任何型別指標的左值,
而空指標只能被設成同樣型別指標的左值。
以下是一個比較清楚的例子:
int *a = 0; // 沒問題,空指標常數
int *b = (int*) 0; // 沒問題,左值是同型別的空指標
int *c = (void*) 0; // C沒問題,左值是空指標常數,不過C++會掛
int *d = (long*) 0; // 爆了,左值跟右值不同型態
這邊有另一個例子:
typedef void (*func)(void); // func f = void (*f)();
func a = 0; // 沒事,a是空指標常數
func b = (void *)0; // C 沒問題,C++會掛
func c = (void *)(void *)0; // C跟C++都看不懂
### 在C++的情況 ###
根據C++14 standard 4.10 裡對空指標常數 (null pointer constant)的定義:
A null pointer constant is an integer literal (2.13.2) with value zero
**or**(以後為C++11後特有) a prvalue of type std::nullptr_t.
意思是說,它可以是0或 nullptr,所以以下的情況:
int x = NULL; // C++ 可能沒問題(視版本而定),不過會造成誤解
int* ptr = (void*)0; // C 沒問題,C++會掛
int* ptr = nullptr; // C++11以後的正統用法,
也就是上述C++14 standard裡的空指標常數
**int x = NULL** 為啥會在C++裡造成誤解?
因為C++有C沒有的函數重載(function overloading),舉例來說
void DoSomething(int x);
void DoSomething(char* x);
- NULL = 0: DoSomething(NULL)會呼叫void DoSomething(int x),即
DoSomething(0)。
- NULL=nullptr: 會呼叫void DoSomething(char* x),即DoSomething(nullptr)。
結論就是,C++11以後還是儘量用nullptr取代NULL吧!
### 參考資料 ###
- [comp.lang.c FAQ list · Question 5.2 ](https://c-faq.com/null/null2.html)
- [Is (int *)0 a null pointer?]
(https://stackoverflow.com/questions/21386995/is-int-0-a-null-pointer)
- [Why are NULL pointers defined differently in C and C++?]
(https://stackoverflow.com/questions/7016861/
why-are-null-pointers-defined-differently-in-c-and-c)
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 86.209.161.140
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1461783066.A.60F.html
※ 編輯: wtchen (86.209.161.140), 04/28/2016 03:49:36
※ 編輯: wtchen (86.209.161.140), 04/28/2016 03:51:00
※ 編輯: wtchen (86.209.161.140), 04/28/2016 03:51:24
我沒有,我只是想表達"assign to lvalue..." (中文不夠好阿)
不過說實話,我情願多發點心得文一邊被鞭一邊修正,
這樣自己學到東西別人可能也受益,
總比死抱著錯誤觀念來的好....
※ 編輯: wtchen (86.209.161.140), 04/28/2016 17:57:53
修正版出爐囉,請繼續幫忙找碴 XD
※ 編輯: wtchen (86.209.161.140), 04/28/2016 18:54:02
... <看更多>