📜 [專欄新文章] 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.
👏 歡迎轉載分享鼓掌
同時也有2部Youtube影片,追蹤數超過2萬的網紅賓狗單字Bingo Bilingual,也在其Youtube影片中提到,你英文想變更好嗎?快來 PressPlay 訂閱賓狗: https://www.pressplay.cc/bingobilingual · 免費試用 3 天 · 搭配本集 Podcast 的詳細講義 · 手機背景播放,善用零碎時間學習 · 一次掌握頂尖學習資源:文法、發音、口說及更多 【本集單字...
「c# default value」的推薦目錄:
- 關於c# default value 在 Taipei Ethereum Meetup Facebook 的最佳貼文
- 關於c# default value 在 Taipei Ethereum Meetup Facebook 的精選貼文
- 關於c# default value 在 賓狗單字Bingo Bilingual Youtube 的最讚貼文
- 關於c# default value 在 香港花生 Youtube 的最讚貼文
- 關於c# default value 在 c# - Default value of a type at Runtime - Stack Overflow 的評價
- 關於c# default value 在 C# - How to set a default value for a property - YouTube 的評價
- 關於c# default value 在 c# - Should I assign a default value for this property in the ... 的評價
- 關於c# default value 在 A Thorough Guide to Bond for C# - Microsoft Open Source 的評價
c# default value 在 Taipei Ethereum Meetup Facebook 的精選貼文
By Frank Wang
[使用 go-ethereum 1.6 Clique PoA consensus 建立 Private chain (1)] -- by Frank Wang
Ethereum Proof of Authority
在 Ethereum 官方的共識機制是使用 PoW,Miner 必須靠使用算力去解決密碼學問題來取得寫帳(打包 Block)權。但 PoW 機制在私有鏈或聯盟鏈上並不是一個那麼有效率的共識機制,私有鏈的維運者必須花費多餘的算力來維持私有鏈的運作。
而 Proof of Authority 思維是直接指定哪些節點有寫帳權,其他節點透過演算法如果是被授權的節點打包 Block 則判定 Block 有效。
Ethereum Client 中有不同語言的實作,之前 Parity 版本的實作就有提供 PoA 的共識機制(介紹)。而在前段時間發佈的 geth 1.6 也支援了 PoA 的共識機制。不過 geth 的 PoA 使用方法跟機制和 Parity 的版本不同,geth 實作了 ethereum/EIPs#225 一個稱作 Clique 的共識機制。所以這篇主要筆記如何建立一個 geth Clique Private chain。
情境中會使用 4 個節點,分別代表兩個普通的節點發起交易,一個創世塊指定的授權節點,一個後期加入的授權節點來玩玩 Clique 。
安裝 geth
由於 go-ethereum 使用 golang 開發的,所有的程式都被編譯成單一的可執行檔了,執接下載下來就可以直接執行。
geth & tools 1.6 — https://ethereum.github.io/go-ethereum/downloads/
找到相對應 OS 後下載,記得下載 geth & tools 的版本,接下來會使用 geth 1.6 版本的一個創 Private chain 的工具 puppeth 來建立 Clique Private chain。
最後記得將這些執行檔加入 PATH 方便呼叫。
環境準備
待會要建置的環境將會使用 4 個 ethereum 節點,並且全部節點跑在同一台機器上,這樣比較省事。先創好 4 個資料夾,分別叫 node1 node2 signer1 signer2 ,node 是一般的 ethereum client,signer 在接下來的情境中當成打包 block 的角色。
-> % lsnode1 node2 signer1 signer2
建立 Ethereum 帳號
接著我們要替這四個角色各建立一個 Ethereum 帳號。
frank@frank-linux [10:51:22 AM] [~/src/eth-poa] -> % cd node1
frank@frank-linux [10:55:08 AM] [~/src/eth-poa/node1] -> % geth --datadir ./data account newWARN [04–18|10:55:30] No etherbase set and no accounts found as default Your new account is locked with a password. Please give a password. Do not forget this password.Passphrase: Repeat passphrase: Address: {c7873030c2532aafe540d9dfd02a08330ee06465}
在這步驟切換到每個目錄底下,指令 geth --datadir ./data account new 這段指令是指要使用當下目錄底下的 data 目錄當作 geth 存放資料的地方,並且創一個新的 Account。在剛剛建立的 node1, node2, signer1, signer2 都下相同指令創一個帳號。
一下是我創好的每個角色的 Account address:
node1: c7873030c2532aafe540d9dfd02a08330ee06465
node2: 6d650780d493056f679a30b2c65cfa5e07835ad6
signer1: 5cc640ae524f70c39081d65bc699b3b61a67bd3f
signer2: 0fe2d8747d24156b342c9fa5c5e7138cf4047a8d
創好帳號後就可以開始建立 Private chain 了
建立創世塊設定
由於 Clique 並不像 Parity 版本的 PoA 靠設定檔設定授權的節點。Clique 是將授權節點的相關資訊放在 Block Header 中,所以我們必須對創世塊做一些設定才可以讓授權機制生效。(但這並不意味著新增或刪除授權節點需要更換創世塊,晚點介紹怎麼新增授權節點)
Clique 是將授權的資訊放在 extraData 中,但資料結夠的格式並沒有那麼直覺,所以在此使用 geth 1.6 提供的建立 Private Chain 的工具 puppeth 來建立創世塊,puppeth 是各互動式的程式,直接啟動照著指示輸入相關資訊。
frank@frank-linux [11:19:16 AM] [~/src/eth-poa] -> % puppeth+ — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -+| Welcome to puppeth, your Ethereum private network manager || || This tool lets you create a new Ethereum network down to || the genesis block, bootnodes, miners and ethstats servers || without the hassle that it would normally entail. || || Puppeth uses SSH to dial in to remote servers, and builds || its network components out of Docker containers using the || docker-compose toolset. |+ — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -+
Please specify a network name to administer (no spaces, please)> poa_for_fun
這裡會希望你給你的 Private chain 一個名字
Sweet, you can set this via — network=poa_for_fun next time!
INFO [04–18|11:19:21] Administering Ethereum network name=poa_for_funWARN [04–18|11:19:21] No previous configurations found path=/home/frank/.puppeth/poa_for_fun
What would you like to do? (default = stats) 1. Show network stats 2. Configure new genesis 3. Track new remote server 4. Deploy network components> 2
這裡選 2 ,要建立一個新的創世塊設定
Which consensus engine to use? (default = clique) 1. Ethash — proof-of-work 2. Clique — proof-of-authority> 2
共識機制,選 2,Clique PoA
How many seconds should blocks take? (default = 15)> 10
多少秒數會產出一個 Block,在這裡設 10 秒。當然你可以自己設定你想要的
Which accounts are allowed to seal? (mandatory at least one)> 0x5cc640ae524f70c39081d65bc699b3b61a67bd3f> 0x
指定一個 Account address 作為授權打包的角色。這裡使用上面產出的 Signer1 的 address。
Which accounts should be pre-funded? (advisable at least one)> 0xc7873030c2532aafe540d9dfd02a08330ee06465> 0x5cc640ae524f70c39081d65bc699b3b61a67bd3f> 0x
指定要不要事先給一些 ether。這裡選 node1 和 signer1 的 address,當然這隨你指定
Specify your chain/network ID if you want an explicit one (default = random)>
Network Id,直接用 random
Anything fun to embed into the genesis block? (max 32 bytes)>
沒什麼需要特別加入 genesis 的,留空
What would you like to do? (default = stats) 1. Show network stats 2. Save existing genesis 3. Track new remote server 4. Deploy network components> 2
選 2 存檔
Which file to save the genesis into? (default = poa_for_fun.json)> INFO [04–18|11:19:50] Exported existing genesis block
What would you like to do? (default = stats) 1. Show network stats 2. Save existing genesis 3. Track new remote server 4. Deploy network components> ^C
ctrl+c 離開,會在當下目錄看到一個 poa_for_fun.json 檔案。
替 4 個節點初始化 Private chain
使用 geth init 指令,分別替換 4 個 node 的 datadir
frank@frank-linux [11:38:07 AM] [~/src/eth-poa] -> % lsnode1 node2 poa_for_fun.json signer1 signer2frank@frank-linux [11:38:07 AM] [~/src/eth-poa] -> % geth --datadir node1/data init poa_for_fun.json INFO [04–18|11:39:10] Allocated cache and file handles database=/home/frank/src/eth-poa/node1/data/geth/chaindata cache=128 handles=1024INFO [04–18|11:39:10] Writing custom genesis block INFO [04–18|11:39:10] Successfully wrote genesis state hash=5722d7…47e737frank@frank-linux [11:39:10 AM] [~/src/eth-poa] -> % geth --datadir node2/data init poa_for_fun.jsonINFO [04–18|11:39:14] Allocated cache and file handles database=/home/frank/src/eth-poa/node2/data/geth/chaindata cache=128 handles=1024INFO [04–18|11:39:14] Writing custom genesis block INFO [04–18|11:39:14] Successfully wrote genesis state hash=5722d7…47e737frank@frank-linux [11:39:14 AM] [~/src/eth-poa] -> % geth --datadir signer1/data init poa_for_fun.jsonINFO [04–18|11:39:21] Allocated cache and file handles database=/home/frank/src/eth-poa/signer1/data/geth/chaindata cache=128 handles=1024INFO [04–18|11:39:21] Writing custom genesis block INFO [04–18|11:39:21] Successfully wrote genesis state hash=5722d7…47e737frank@frank-linux [11:39:21 AM] [~/src/eth-poa] -> % geth --datadir signer2/data init poa_for_fun.jsonINFO [04–18|11:39:24] Allocated cache and file handles database=/home/frank/src/eth-poa/signer2/data/geth/chaindata cache=128 handles=1024INFO [04–18|11:39:24] Writing custom genesis block INFO [04–18|11:39:24] Successfully wrote genesis state hash=5722d7…47e737
到目前我們已經準備好讓節點可以啟動和互相連線了。
啟動 geth client 並設定 peers 間的連線
分別在 node1, node2 目錄使用指令啟動 geth
geth --datadir ./data --networkid 55661 --port 2000 console
這裡需要注意的是 datadir 參數沒問題,先前的步驟已經在每個節點各自的目錄都建立了 data 目錄。networkid 大家一定都要用同一個值才可以互相連線。port 用來讓 geth 跟其他 geth 連線所 listen 的一個 port,由於四個節點都在本機,所以這裡必須都指定不同的值。以下使用 node1 2000, node2 2001, signer1 2002, signer 2003 當範例。
如果節點是授權打包 block 的節點,那你啟動時要先 unlock 你的 account,這樣才可以進行交易的打包。多帶一個 unlock 參數,以及你要解鎖的 account address。啟動後會要求輸入當時創 account 時的 passphrase。所以在這裡啟動 signer1 和 signer2 時都要用 unlock 參數帶入他們各自的 address 解鎖。
geth --datadir ./data --networkid 55661 --port 2002 --unlock 5cc640ae524f70c39081d65bc699b3b61a67bd3f console
啟動後會看到這樣的結果,如果沒噴任何錯誤就是啟動成功了,同時會啟動一個 console 的互動介面,可以打像是 admin.nodeInfo 這類的指令來操作 geth。
在啟動訊息中有一段
INFO [04–18|12:01:31] RLPx listener up self=enode://87692411dd1af113ccc04d3f6d3d7d47366c81e595525c861c7a3c902ca0a86f46e8d7a837f431536822dbb012f68d942ed96910385805864e990efdf3839a1e@[::]:2000
由於目前是在 private chain 上,沒有設定啟動節點也沒設定 static node,各節點啟動後是沒辦法找到對方的。所以在此我們把 node2, singer1, signer2 都加入 node1 為自己的節點連上。geth 要連上對方的節點就必須好 enode://
在 node2, signer1, signer2 的 geth console 頁面分別打入指令
>admin.addPeer(“enode://87692411dd1af113ccc04d3f6d3d7d47366c81e595525c861c7a3c902ca0a86f46e8d7a837f431536822dbb012f68d942ed96910385805864e990efdf3839a1e@127.0.0.1:2000”)
完成後回到 node1 的 geth console 打入 admin.peers 應該要看到三個節點資訊。
到這步 geth 節點已經連上可以開始進行 PoA 挖礦和交易了。
啟動 Miner
到 signer1 的 console 打入 miner.start() 這時候如果你本機之前沒有啟動過 miner,geth 會先產生 DAG 等 DAG 產生完後就會開始挖礦了。
在 signer1 的 console 會出現正在 mining 的訊息。
其他節點則會收到 import block 的訊息。
Make a transaction
到這裡 Clique 的 Private chain 已經設定完成了,我們可以開始在這條鏈上做一些交易。接下來為了方便會使用 geth 的 console 來做 send ether 交易,如果你不習慣的話也可以使用 mist 這類的 UI 錢包來做。
node1 console
還記得在建立創世塊的時候有先給了 node1 和 signer1 的 address 一些 ether 吧?先用這令看看這些 ether 有沒有真的在鏈上。使用指令 ")" target="_blank">eth.getBalance("") 來查詢。
> eth.getBalance(“c7873030c2532aafe540d9dfd02a08330ee06465”)9.04625697166532776746648320380374280103671755200316906558262375061821325312e+74> eth.getBalance(“6d650780d493056f679a30b2c65cfa5e07835ad6”)0>
確定 node1 有 ether 但 node2 沒有,接著用 eth.sendTransaction 指令來把一些 ether 從 node1 轉到 node2 吧。
現在 node1 的 console 把自己的 Account unlock
> personal.unlockAccount("c7873030c2532aafe540d9dfd02a08330ee06465")
Unlock account c7873030c2532aafe540d9dfd02a08330ee06465Passphrase:true>
轉出 0.05 ether 到 6d650780d493056f679a30b2c65cfa5e07835ad6
>eth.sendTransaction({from:"c7873030c2532aafe540d9dfd02a08330ee06465", to:"6d650780d493056f679a30b2c65cfa5e07835ad6", value: web3.toWei(0.05, "ether")})INFO [04-18|12:39:53] Submitted transaction fullhash=0xa7a9da239b8f96b9f6fe4007ee88773915f034be2365b2dab234fd8c0545aa37 recipient=0xc7873030c2532aafe540d9dfd02a08330ee06465"0xa7a9da239b8f96b9f6fe4007ee88773915f034be2365b2dab234fd8c0545aa37">
如果你 singer1 的 miner 沒關掉的話,在幾秒後就會看到一個含有一筆交易的 block 產出
再來看看 node1 和 node2 的 ether
> " target="_blank">eth.getBalance("c7873030c2532aafe540d9dfd02a08330ee06465")9.04625697166532776746648320380374280103671755200316906558211535061821325312e+74> " target="_blank">eth.getBalance("6d650780d493056f679a30b2c65cfa5e07835ad6")50000000000000000>
交易完成!
加入一個新的信任節點
在 Clique 共識機制中是使用 Clique 提供的 API 來做節點管理,現在只 demo 加入節點進入信任名單。
signer2
signer2 是一開始沒設定在創世塊中信任列表的節點,如果這時候讓它啟動 miner 會怎麼樣呢?會噴一個未授權的錯誤
> miner.start()INFO [04-18|12:49:51] Starting mining operationnull> INFO [04-18|12:49:51] Commit new mining work number=46 txs=0 uncles=0 elapsed=284.189µsWARN [04-18|12:49:51] Block sealing failed err=unauthorized
必須回到已經在授權名單內的節點將新的節點加入。
signer1
回到 signer1 的 console 輸入加入的指令
> clique.propose("0x0fe2d8747d24156b342c9fa5c5e7138cf4047a8d", true)
singer2
接著回到 signer2 的 cosole
開始打包交易了
結語
由於 geth 1.6 才發佈不久,關於 Clique 的相關文章還蠻少的。提供如何使用 geth 1.6 建立一個 Clique private chain 的簡單教學,其實大部分都是我自己在建置時的筆記,內容省略了很多關於 Clique 的一些特性和原理,有興趣的建議直接看 ethereum/EIPs#225。希望這篇可以幫助到使用 geth 但又想用用 PoA 共識機制的同伴們XD
c# default value 在 賓狗單字Bingo Bilingual Youtube 的最讚貼文
你英文想變更好嗎?快來 PressPlay 訂閱賓狗:
https://www.pressplay.cc/bingobilingual
· 免費試用 3 天
· 搭配本集 Podcast 的詳細講義
· 手機背景播放,善用零碎時間學習
· 一次掌握頂尖學習資源:文法、發音、口說及更多
【本集單字】
diplomatic 外交的
secure a victory 獲得勝利
gain international exposure
增加國際能見度;讓世界看見台灣
(An idea) pop into one’s mind/head 心裡冒出一個點子
Non-partisan 無黨派的
Be devoted to 目標(名詞) - Ving
pressing 急迫必須處理的
senior 資深的
Delegation 代表團
Institute for National Defense and Security Research
國防安全研究院(中華民國國防部成立的國防智庫)
In association with A : 在 A的幫助下
Award 名詞:獎項
動詞:頒獎給 ...
Handle 處理;handling 動名詞
搭配 competent 形容詞:有效的;有能力的
value 重視
Solidarity 團結
Like-minded 想法接近的(常在國際上形容意識型態)
Seize the chance 把握機會
alliance 結盟;緊密關係
搭配動詞 build
Halifax, 哈利法克斯國際安全論壇, HFX 國際安全論壇, 蔡英文, 頒獎, 領獎, 台北舉辦, 國防部, 智庫, 民主
現在抖內賓狗,有好康回饋啦!
https://pay.firstory.me/user/bingobilingual
· 加入 IG 摯友清單(看得到綠圈圈)
· 點餐賓狗碎碎念主題
· 每月一集「抖內限定」的私房賓狗碎碎念
!7 月底前加入訂閱式抖內,我會寄親筆簽名明信片到你家唷!
賓狗誠心徵求廠商乾媽乾爹!!
歡迎來信:weeklybingoenglish@gmail.com
口播案例:https://bingobilingual.firstory.io/playlists/ckmm0e1of9zai08974rfszzfh
想跟賓狗一起不死背、「玩單字」嗎?
歡迎加入臉書私密社團:
https://www.facebook.com/groups/883689222203801/
賓狗的 IG @bingobilingual_bb
https://www.instagram.com/bingobilingual_bb
賓狗的 FB
https://www.facebook.com/bingobilingual
陪賓狗錄 podcast:
https://www.youtube.com/c/BingoBilingual
(側錄影片)
【Podcast的廣告效益 - 學生問卷】
5-10 分鐘,幫學生一個忙,還可以抽獎喔!
學術單位:國立臺北商業大學 企業管理系 研究所與大學部學生
抽獎資格:只要有在 Podcast 節目中聽過廣告內容的經驗,填寫問卷並留下Email,都有機會參加抽獎!
抽獎禮物:7-11百元禮券*10位
問卷連結:https://forms.gle/ZZAfiwotkmQRbpiaA
*問卷皆採匿名方式,請安心填寫
你想要高品質中英對照新聞嗎?訂閱《風傳媒》,就能隨意暢讀華爾街日報的新聞,中英對照喔!原價一年一萬四,立刻降到三千九,趕快透過賓狗的專屬連結訂閱吧: https://events.storm.mg/member/BGWSJ/
跟賓狗 Line 聊天:
https://line.me/ti/g2/AnkujGhzM4qHqycKmUd9Nw?utm_source=invitation&utm_medium=link_copy&utm_campaign=default
在 KKBOX 收聽賓狗:
https://podcast.kkbox.com/channel/4tuXnkLJpEDF7ypC6S?lang=tc
c# default value 在 香港花生 Youtube 的最讚貼文
來源視頻 和 金融原理解釋,見本頁頁底。
-----------
網上討論會
(請在本視頻的議論欄發言。有見地的內容,我會抄貼到這裏下面。)
討論會題目﹕
假如郭文貴關於港幣貶值的預言屬實,港府(如突然敢冒大不諱行駛基本法賦與的高度自治權)可以做什麼,來挽救廣大市民,避免或減少損失?
^^^^^^^^^^今後, 以上管叫[總題目]^^^^^^^^^^
F (Zen Gong指 1. 中國銀行發鈔,有可能背後的美元儲備有水份。2. 發鈔量是美元儲備的4.2倍。 )
1. Money Supply M2 in Hong Kong is $14,063 billion HKD in August 2018. HK's Foreign Exchange Reserves is $424.8 billion USD in August.
https://tradingeconomics.com/hong-kon...
https://tradingeconomics.com/hong-kon...
The problem is: the figures are provided by all banks based on a honest system. HSBC & HK Chartered Bank are British banks they would play by the rule. But China Bank (HK)'s $USD reserve is in HK or Beijin? as part of China's $USD? i.e. they can have no $USD at all in HK. M1 are bank notes, bank credit & plastic monies, M2/M3 include short/long term credit. They can switch between easily that make auditing extremely difficult.
2. In HK's Foreign Exchange Reserve basket the composition mainly (80+% by IMF rule) is $USD, rest are Euro, Yen and Yuan. The fixed rate is a 7.8. The $USD reserve is USD$424.8 billion and HK's M2 money supply is HK$14,063 billion in August. The variable/unpegged rate should be HK$14,063/US$424.8=33.1 not 7.8 today. Or, USD $424.8B x 7.8= HK $3,313 billion its USD reserve can support, not HK$14, 063 billion M2. HK printed 4.2 times monies it should, not including M3 (long term credit) and figures provided by banks might be grossly exaggerated.
E (KIU WAI LAM 提供一些具體數字)
香港最新外匯儲備資產數字
香港金融管理局(金管局)2018年10月5日(星期五)公布,香港於2018年9月底的官方外匯儲備資產為4,264億美元(2018年8月底為4,248億美元)(附件)。
連同未交收外匯合約在內,香港於2018年9月底的外匯儲備資產為4,188億美元(2018年8月底為4,172億美元)。
為數4,264億美元的外匯儲備資產總額,相當於香港流通貨幣約7倍,或港元貨幣供應M3約46%。
D (原來“ 路德社”頻道有更專業和深入的討論,我請你請參考)
連結: https://youtu.be/Tx7oY042u7g
10/13/2018 路德时评(对冲基金大佬良心小哥):这几天大量突增的对港币维稳的洗脑文章,以及12日港财政司司长突赴京与央行行长商讨对策,港币是否能夠撐的住?(普通話)
點題:
1. 設郭文貴說白港幣將貶值的(中國日期)10月10日是day 1; days 2 & 3 立刻發生幾件事:(i)國內有貌似專業的長文講港元不會同美元脱鈎, 被容許發表;但列舉了香港M0, M1, M3的數字, 偏偏不提最相關的M2。(ii)財政司司長陳茂波赴京見中央銀行行長易綱, 但報導非常簡短,耐人尋味; 可能反映他們要暗示中央會為港元托底, 但又不敢說白有危機。
2. 全面回顧了1997年索羅斯狙擊港元的歷史, 及其意義, 又指出事前事後北京可都視索羅斯為"中國的老朋友", 貴為上賓。
3. 嘉賓講者特別提出, 索羅斯狙擊英鎊和其他金融操作佳績連年, 當年狙擊港元卻要敗退, 是中共津津樂道的威水史, 但是, 剛剛以非法交易罪宣判郭文貴的政泉公司案罰款600億人民幣破了全球有史以來最高罰金的紀錄, 卻無大吹大擂, 是盜國賊自知理虧, 底氣不足, 缺乏自信, 末日近矣。
4. 1:21:00有網友問港府可不可以禁止做空港幣, 算是對下面A貼的[總題目]的一個回答, 嘉賓講者以A3的邏輯回答。從路德的總結, 又可推算即使港府敢開徵「炒港幣稅」, 中共也麻煩,因為暴露了盜國賊違法造成港幣超發來吸金,將斷了這條吸金的通道,配合當世界出現其他反共招數的時候, 中共少了這金融“後援”, 會加速潰敗。這也局部回答了A5的道德兩難的困惑。
C (明杜志可算是回應以下的A4點)
1. hk foreign reserve got only 300 billion us dollars
2. 沖唔到港元架,香港有2萬億港元再加銀行體糸可以回撥,金管局可以下令唔借港元比外資沽空,其實97金融風暴已經沖過,佢地沽港股抽高個息再沽港元,結果佢地都係輸住走,如果甘易沽到港元脫勾,港元一早脫左啦
B (Eric Chan 可算是回應以下的A5點)
身為香港人, 雖然唔情願港紙遭受狙擊, 但若一時陣痛換來長治久安, 香港人亦唯有默默承受!!
[從這裏開始,... 的符號表示原文已大幅刪節,因為Youtube說明欄的上限是5000字符,業已超過。請到Tsui Hon Kwong頻道和花生台本視頻的留言欄閱讀全文。]
A (我自己來開個頭)
Tsui Hon Kwong: 港府可以宣佈徵收「炒港幣稅」!細節如下。
1. 把正常經濟活動和炒買炒賣港幣兩種行為分開。再細節,1.1 例如,...如能開具證明,是正常經濟活動所需,不在規管範圍之內。...1.2 怎樣防止假證明?...尤其是,盜國賊最清楚是他們自己造假或行賄造成港幣超發的,...他們深知加入炒賣必賺,就會出盡法寶假扮是正常經濟活動;...。在個難題上,仍有待大家...。
2. 把炒港幣的潛在利潤,用稅收抽走。再細節,2.1 某個銀碼以下的兌換,保留免稅,...。那麼,界線該劃在哪裏好呢?我認為在一千萬美元左右較恰當。...。2.2 稅率多少才好?至少要同潛在利潤掛鈎,...。
3. 徵收「炒港幣稅」會不會沾污香港是自由貿易港的美名,影響到經濟步向蕭條?...
4. 「炒港幣稅」是否有效?是不是有重大缺失,根本不可行?...
5. 道德兩難問題﹕一方面,郭文貴認為港幣貶值將在中共倒台、全國實現民主法治的過程中起得到關鍵作用,...。另一方面,最避不開港幣大貶值的是...基層人民...;整體經濟、民生發展、方方面面都會出現極大困難;再...漫延到全國,以致郭文貴都說﹕「...我心裏很難受,我跨不過那個坎,因為我看到這些行動真的在實踐中,我真的很難受。...,好幾次我在陽台...,眼淚就掉下來,受不了呀。」...這,就是道德兩難:找方法避免貶值或減弱貶值及其帶來的損失,是道德的嗎?...
-----------
詞語解釋(出場序)
CCP ----- 中國共產黨, China Communist Party
Kayle Bass ----- 美國對沖基金經理人。Wikipedia: In 2008, Bass successfully predicted and effectively bet against the U.S. subprime mortgage crisis by purchasing credit default swaps on subprime securities which, in turn, increased in value when the real estate bubble burst.
Bass has made prominent bets on Japan, European sovereign debt and, most recently, China. He has also given his expectations regarding the economic future of Japan and Argentina.
P2P ----- peer to peer, 一種網路借貸平臺,由非政府、非銀行的機構集資,答應投資人優厚利率,然後貸款給需要資金的企業或個人。幾年前中共許多官員為這些新興的金融機構站台,從民間圈到許多資金。數月前國內大量P2P公司倒閉或負責人挾款失蹤,令投資者血本無歸。論者認為都是被貪官掠去了。
泛亞 ----- 如上,也是國內一間集資公司,許多官員向全國公眾推薦,說既安全、回報又高。幾年前又倒閉,令許多投資者賠上畢生積蓄。論者認為都是被貪官掠去了。
民族證券 ----- 郭文貴在國內的公司之一。損害郭的利益的目標之一。盜國賊殘害其員工,掠奪其資產;都是為了要脅郭就範,迫他停止點名揭露諸如王歧山等盜國賊的違法網絡和罪行。
徐明 ---- 冤案主角, 大連實德集團董事長, 2013年因涉薄熙來案,獲刑入獄, 作為污點證人指證薄熙來貪腐, 獄中表現良好, 提前釋放, 但在即將獲釋前猝死
李明 ----- 冤案主角, 著名影视公司小马奔腾董事长,涉公安部副部长李东生案被带走协助调查,官方说李明在询问中情绪激动,注射了镇静剂之后不治身亡。
雷洋 ----- 冤案主角, 北京便衣警察懷疑市民雷洋有嫖娼行為,在拘捕過程中雷洋逃脫後被再次拘捕,押解途中雷洋死亡。次日,該事件發布到網絡,引起了輿論的廣泛關注。官方說他是因為自瀆而死
「我的弟弟」----- 郭文貴、他弟弟和另一個女性家人(可能是嫂嫂)是1989年支持天安門學生運動的北京市民之中的三個。三人被捕,警局中有警員拔槍要殺女家人,他弟弟撲過去保護她,中彈,失救而死。
孟建柱 ----- 郭文貴揭露違法罪行的四名頭號盜國賊之一。
王樂泉 ----- 中共官員,官至中共中央政治局委员,新疆維吾爾自治區黨委書記。2010年被中共免去在新疆的所有職務。现任中国法学会会长。
----------------------------------------------------------
來源視頻﹕
https://youtu.be/rwttNTC0Izo
10月9号:C C P如果攻击台湾,美国会不会出兵?为什么说港币和人民币会垮掉?保护台湾香港极为重要!
(郭文貴頻道,美國日期2018.10.9) (普通話)
金融原理﹕
https://youtu.be/YPC6bhJv760
为什么说香港也会存在货币超发?为什么历史上阻击做空港币比较困难?为什么此次上万亿美元阻击港币加上金融大杀器一定能够成功?
(路德社直播台,美國日期2018.10.9) (普通話)
c# default value 在 C# - How to set a default value for a property - YouTube 的推薦與評價
How to set a default value in C# for auto-properties, properties with backing variables, and List or Collection properties. ... <看更多>
c# default value 在 c# - Should I assign a default value for this property in the ... 的推薦與評價
Why allow the impossible? I believe that I should be setting the Method property to string.Empty by default, and if the user doesn't supply ... ... <看更多>
c# default value 在 c# - Default value of a type at Runtime - Stack Overflow 的推薦與評價
... <看更多>
相關內容