📜 [專欄新文章] 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.
👏 歡迎轉載分享鼓掌
同時也有255部Youtube影片,追蹤數超過70萬的網紅Spice N' Pans,也在其Youtube影片中提到,If you're a fan of anything herbal, you might want to give this recipe a try. It's one of the easiest recipes we have on our channel. Simply marinate ...
「roots function」的推薦目錄:
- 關於roots function 在 Taipei Ethereum Meetup Facebook 的最讚貼文
- 關於roots function 在 CheckCheckCin Facebook 的精選貼文
- 關於roots function 在 Mama's Infinity Love Facebook 的最讚貼文
- 關於roots function 在 Spice N' Pans Youtube 的最讚貼文
- 關於roots function 在 Joanna Soh Official Youtube 的精選貼文
- 關於roots function 在 Herman Yeung Youtube 的最佳貼文
roots function 在 CheckCheckCin Facebook 的精選貼文
【秋冬護膚】嘴唇乾燥紅腫快要變孖膶腸?
⭐用舌頭舔唇補濕是假象
⭐只會愈舔越乾
#星期一踢走BlueMonday
養脾養陰滋潤雙唇
秋風呼呼令皮膚處於乾燥狀態,嘴唇沒有汗腺或皮脂腺分泌油脂保護,亦缺乏角質層避免水分散失,所以在乾燥天氣下嘴唇顯得特別脆弱,輕則脫皮、紅腫,重則乾裂流血。不少人勤力為雙唇塗抹潤唇膏,但滋潤效果總是不持久,為甚麼?從中醫角度來看,「脾開竅於口,其華在唇」,如果脾胃功能不佳,嘴唇則無法得到滋潤,脾胃積熱亦會引發嘴唇乾裂。所以想保持雙唇滋潤有光澤,可以從健脾方面入手,多吃健脾的白米、淮山、芡實、蓮子、薯仔、番薯等,每日飲米水,避免進食辛辣及生冷食物,因為辛辣食物傷津耗氣,而生冷食物會妨礙脾胃運化功能。陰虛體質人士亦容易出現嘴唇乾燥情況,宜早睡早起,避免熬夜晚睡,適量食用蜂蜜、百合、無花果、雪耳、花旗參、麥冬等,有助潤燥養陰。有需要時可以敷個唇膜,有助鎖住嘴唇水份,紓緩嘴唇乾燥脫皮問題。
簡易鎖水唇膜
材料:凡士林適量、保鮮紙一小塊、暖毛巾
做法:在嘴唇上厚塗一層凡士林,蓋上保鮮紙,敷上暖毛巾約10分鐘,最後抹去凡士林即可。
花旗參麥冬茶
功效:滋陰清熱生津,紓緩長期晚睡、經常口乾、嘴唇乾燥等症狀。
材料:花旗參1湯匙、麥冬1湯匙、蜂蜜適量
做法:材料洗淨放保溫瓶,以熱開水沖洗一遍,注入熱開水焗5-10分鐘至香味透出,待水稍微邊暖和即可加入適量蜂蜜。此茶可反覆沖泡至味淡
留言或按讚👍🏻支持一下我們吧!❤️ 歡迎 Follow 我們獲得更多養生資訊。
Nourish the spleen and yin to moisten the lips
The autumn wind causes the skin to remain dry constantly. The lips do not have sweat glands and sebum secreted by the sebaceous glands as protection, and do not have the stratum corneum to prevent water loss. Therefore, our lips tend to be fragile during the dry weather, and they would peel easily, become swollen, and sometimes even bleed.
Many people rely on lip balm but its moisturizing effect is not always long lasting. Why is that? From the perspective of Chinese Medicine, “Lips are the windows to the spleen, and essence are in the lips”. If the spleen does not function well, the lips will not stay hydrated, and the accumulated heat in the spleen and stomach may cause the dry lips to crack.
In order to keep the lips luscious and plump, we need to strengthen the spleen by eating more white rice, Chinese yam, gorgon nut (‘qian shi’), lotus seed, potato and sweet potato. Drink rice water daily, and avoid eating hot, spicy, raw and cold food, ad hot and spicy food will exhaust the body fluid and the qi, whereas raw and cold food can obstruct the spleen’s and stomach’s function in regulating the circulatory system.
Individuals with yin deficiency will easily develop dry lips, thus they should sleep and wake up early; and avoid sleeping late. Consume an appropriate amount of honey, lily, fig fruit, snow fungus, American ginseng and dwarf lilyturf roots (‘mai dong’), as they can help moisten the dryness and nourish the yin. If need be, apply lips mask, as it can help lock in the moisture, relieve dryness on the lips to prevent it from developing cracks.
Easy lips masks to lock in the moisture
Ingredients: An appropriate amount of Vaseline, a small piece of plastic wrap, a warm towel
Method: Apply a thick coat of Vaseline on the lips; cover the lips with a plastic wrap first, followed by a warm towel. 10 minutes later, wipe off the Vaseline from the lips.
American ginseng and radix ophiopogonis tea
Effects: nourishes yin and clears asthenic heat, alleviates thirst. Relieve symptoms caused by frequent late nights, dry mouth and dry lips.
Ingredients: 1 tablespoon of American ginseng, 1 tablespoon of radix ophiopogonis, honey
Preparation: Place all ingredients into thermos and rinse with hot water once. Add in hot water and steep for 5 minutes until aroma develops. Add honey to taste when the tea cool down. This tea can be re-browed until flavour weakens.
Comment below or like 👍🏻 this post to support us. ❤️ Follow us for more healthy living tips.
#男 #女 #我枯燥 #陰虛
roots function 在 Mama's Infinity Love Facebook 的最讚貼文
[INSTAGRAM GIVEAWAY]
To join, head to
https://www.instagram.com/p/B4Tq04MnDCe/
Shero Ching Bye Bye Blackheads set
.
Do you have stubborn blackheads? Are you still squeezing it? Worry no more, try this Shero Ching Bye Bye Blackheads set!
I can see immediate results in JUST ONE USE! It helped clean out my pores on nose area and smoothen my skin. 😍 This does really function like pore strips BUT it really wasn’t as harsh and drying. No weird smell too.
.
This 3 steps blackheads removal kit consist of:
1) Derived liquid - soften the roots of blackheads, open the pores and ensure easy extraction of the blackheads
2) White nose mask - remove blackheads effectively
3) Shrink pores essence - helps to close pores
.
.
Together with @enchantic.sg , we are giving away one box of Shero Ching Bye Bye Blackheads set to one lucky winner!
----------------------
🌟HOW TO JOIN:
1. Like this post & 6 posts back
2. Follow our INSTAGRAM
@mamasinfinitylove & Enchantic Beauty
3. Tag as many friends (one tag per comment, multiple comments may warrant a higher chance of winning)
4. Repost this and tag both of us! (Optional bonus)
---------------------
🌟🌟
For non-contest junkies, you can purchased the set at //instagram.com/enchantic.sg
🌟🌟
.
.
*Giveaway ends 11 Nov 2019, 11:59pm! *One random winner will be announced in the comment below. *Open to Singapore residences only. *Not administrated by Instagram. *Must complete at least steps 1-3 for your entries to be eligible for the giveaway.
.
Thank you for your support & good luck! 🍀
.
.
#sggiveaway #giveaway #sgcontest #giveawaysg #instagiveaway #sherochingbyebyeblackheads #enchanticsg #byebyeblackheads #beautyreview #mask #mamasinfinitylovegiveaway
Singapore Online Contest and Giveaway Sharing @sgcontestfever @giveaway.corner SG Giveaways
roots function 在 Spice N' Pans Youtube 的最讚貼文
If you're a fan of anything herbal, you might want to give this recipe a try. It's one of the easiest recipes we have on our channel. Simply marinate the chicken, dump it in your rice cooker and voila!
Not a fan of anything herbal but you still want to make something like this for your family? You can use this recipe instead https://www.youtube.com/watch?v=4yFfJAUjXD8&t=191s and cook it in your rice cooker in the same way as Roland did in this video.
See the ingredient list below for your easy reference.
The device we used in this video is La Gourmet Healthy Rice Cooker. Our kind sponsor sent us their new rice cooker to try and truly, we are impressed!! With this new rice cooker, we have banished our normal rice cooker to our store room. I mean - why not? It's like going on a healthy diet without even trying. We can eat rice as usual but it's actually healthier because it contains 37% lesser starch. Solid!
This rice cooker also comes with various other cooking functions which makes it really an awesome buy. Time for you to ditch your normal rice cooker!
For your reference, please see below to see how much water and rice to use when cooking rice. The portion used is for 4 people so if you're feeding lesser or more people (or simply you’re a a rice monster) , please adjust accordingly.
Please note that when using La Gourmet Healthy Rice Cooker, the low starch rice function will only work if you're cooking plain rice i.e. only when cooking rice and water with no other ingredients. If you want to add other ingredients, you can still use the La Gourmet Healthy Rice Cooker, just use the rice function to cook your rice. If you're doing so, please use the portion below listed for normal rice cooker.
Hope this helps! Buy buy buy, must buy!!!
-----------
If you like to get this La Gourmet Healthy Rice Cooker, head to our major departmental stores in Singapore (Takashimaya, Isetan, Robinsons, Courts, BHG, OG, Metro, Tangs) Do check out Lazada too because La Gourmet sells some of their products there too. La Gourmet is also available in Malaysia, Indonesia and Vietnam. Hope you can find them in your home country.
Ingredients
--------
Serves 4 -5 pax
Group A Ingredients
--------
5g of ginseng roots
5g of Angelica roots
Soak Group A ingredients in 1/2 cup (125ml) of hot water. Wait until they have cooled down before using them (including the water) to marinate your chicken
Group B
------
1/2 tablespoon of cekur root powder (sorry for the typos in the video- you can look for galangal powder if you can’t find cekur powder and last resort is to use ginger powder)
2 tablespoons of oyster sauce
2 tablespoons of light soy sauce
1 teaspoon of salt
1 tablespoon of Chinese cooking wine (Shaoxing Huatiao wine)
1 stalk of spring onion (lightly smash the stem)
1 kg chicken
3 tablespoons of dark soy sauce (although we rubbed 2 tablespoons on the chicken followed by 1 tablespoon to the sauce much later but you can add them as part of the marinade)
Add Group A & B ingredients together and marinate in the fridge for at least 2 hours.
Group C
------
A few stalks of spring onion
20g of young ginger - sliced
Lay Group C ingredients in the rice cooker first before adding the chicken. Remember to add the rest of the marinade to cook with the chicken. Cook the chicken for about 28 minutes and check that the chicken is thoroughly cooked before serving.
Group D
------
Some cornstarch solution
Some chopped spring onion
Once you have removed the chicken from the pot, remove the spring onion and ginger as well. You can discard the spring onion and ginger. Bring the sauce a boil first then add some cornstarch solution to thicken your sauce. Spring onion is optional so it's entirely up to you.
===
If you like this recipe, you might like these too:
10 MIN EASY Thai Glass Noodles w/ Prawns Recipe 泰式冬粉虾
https://www.youtube.com/watch?v=F1oPAXfXuLI&t=40s
Secret Revealed! Super Crispy Chinese Prawn Fritters 炸虾球 Crispy Prawn (Shrimp) Ball Recipe
https://www.youtube.com/watch?v=lKyP-3RClt8&t=94s
How to cook Hong Kong Crispy Garlic Shrimp - Typhoon Shelter Fried Prawns 避风塘炒虾 Chinese Prawn Recipe
https://www.youtube.com/watch?v=Q7FOlkXFuBg&t=80s
Disclaimer:
Spice N' Pans is not related to these products and cannot guarantee the quality of the products in the links provided. Links are provided here for your convenience. We can only stand by the brands of the products we used in the video and we highly recommend you to buy them. Even then, preference can be subjective. Please buy at your own risk. Some of the links provided here may be affiliated. These links are important as they help to fund this channel so that we can continue to give you more recipes. Cheers!
![post-title](https://i.ytimg.com/vi/4IocWFqWTIo/hqdefault.jpg)
roots function 在 Joanna Soh Official Youtube 的精選貼文
♥ Make your own TEA BLEND and gift it to your friends & family this festive season. Watch the video & read below for more info.
♥ LIKE, SHARE this video & SUBSCRIBE http://www.youtube.com/joannasohofficial Support me in reaching 1 million subscribers!!! xx
♥ Joanna is a certified Personal Trainer (ACE), Women’s Fitness Specialist (NASM) and Nutrition Coach (VN).
Snap picture of your creation and tag me @JoannaSohOfficial. xx
Brewing Method:
1 teabag + 1 cup of water at 80° - 85°C/ 176° - 185°F
(you don't want to burn the leaves / flowers)
Steep for 3 to 5 minutes and enjoy
Things to remember:
- Each teabag can be steeped 1 – 2 times
- For best results, drink 1 – 2 cups every day
- You may sweeten with a little bit of raw honey, maple syrup or rock sugar
- Do NOT add milk!
Each recipe makes between 20 - 24 sachets
(about 2 tsps. of tea mixture per sachet)
p/s Tea bags can easily be bought from any supermarket / daiso / pound shop / online or you can even make your own with using cheesecloth or muslin.
1) FitTea (Mild Caffeine)
Combine
½ cup Oolong
¼ cup Lemongrass
2 tbsps. Ginger Roots
2 tbsps. Licorice Roots
Benefits
- Speed up metabolism
- Burn fat more efficiently
- Reduce fat & cholesterol absorption
- Reduce belly fat
- Curb appetite
- Increase energy
2) BeauTea (Caffeine free)
Combine
½ cup Chamomile
¼ cup Rosebuds
¼ cup Lavender
Benefits
- Ease menstrual & stomach cramps
- Radiant skin & hair
- Fight acne
- Reduce stress & anxiety
- Improve digestion
- Better sleep
3) TeaTox (Low Caffeine)
Combine:
½ cup Green Tea
¼ Rose Buds
¼ Peppermint
Benefits
- Flush out damaging toxins
- Healthy liver function
- Increase nutrient absorption
- Boost energy
- Reduce bloating
- Improve Digestion
4) EnergyTea (Low Caffeine)
Combine:
½ cup Green Tea
¼ cup Jasmine
¼ cup Lemongrass
Benefits
- Boost energy
- Increase alertness
- Aid Weight Loss
- Improve Digestion
- Calm Your Nerves
- Reduce Bad Breath
MAKE YOUR OWN TEA BLEND
Choose 1 or 2 teas / flowers as the base and combine with 1 or 2 other ingredients. Combine 3 - 4 ingredients. Remember, less is more!
TEA ( Low Caffeine)
- green tea
- oolong
- rooibos
- black tea
- ceylon tea
- darjeeling
- earl grey
- english breakfast
FLORAL (Caffeine Free)
- jasmine
- rosebuds
- lavender
- chamomile
- elder flower
- marigold
TART & SWEET (Caffeine Free)
- hibiscus
- rose hips
- licorice root
- stevia leaf
EARTHY & PUNGENT
- burdook root
- cramp bark
- dandelion leaves
- dandelion roots
- juniper berries
- oregon grape root
STRONG & SPICY
- all spices
- anise seeds
- cocoa powder
- peppermint
- peppercorn
- ginger
- cinnamon
- cardamom
- cloves
- fennel seeds
HERBS
- sage
- rosemary
- thyme
- gingko
- holy basil
- nettle leaf
MILD & FRUITY
- gojiberries
- lemongrass
- hawthornberries
- coconut flakes
- lemon peel
- orange peel
- elder berries
MILD & NUTTY
- cacao nibs
- carob bean
- milk thistle
- eleuthero
- ashwagandha
Check out these link:
https://www.itoen.com/all-things-tea/...
https://blendbee.com/make-your-own-te...
Please LIKE, SHARE & SUBSCRIBE to my channel. Do READ this box more info. Let's stay connected!
http://www.facebook.com/joannasohoffi...
http://instagram.com/joannasohofficial/
https://twitter.com/Joanna_Soh/
http://www.joannasoh.com
(Subscribe to my website for printable workouts & recipes)
Lots of Love xx
![post-title](https://i.ytimg.com/vi/Wscfkt-pF3Y/hqdefault.jpg?sqp=-oaymwEZCNACELwBSFXyq4qpAwsIARUAAIhCGAFwAQ==&rs=AOn4CLCvBZrqf3SH-2jiQrvrOSUe1aCW4A)
roots function 在 Herman Yeung Youtube 的最佳貼文
HKDSE Mathematics 數學天書 訂購表格及方法︰ http://goo.gl/forms/NgqVAfMVB9
課程簡介︰ https://youtu.be/Rgm7yUVG9cY
------------------------------------------------------------------------------
DSE 數學 Core 天書 A 第1堂 (共2小時45分鐘) https://www.youtube.com/playlist?list=PLzDe9mOi1K8p2A7HMhwz4udhLJTQt9p2b
DSE 數學 Core 天書 A 第2堂 (共2小時8分鐘) https://youtu.be/SGeMFO9tips?list=PLzDe9mOi1K8p2A7HMhwz4udhLJTQt9p2b
DSE 數學 Core 天書 A 第3堂 (共2小時4分鐘) https://youtu.be/-z_sjshGWEs?list=PLzDe9mOi1K8p2A7HMhwz4udhLJTQt9p2b
DSE 數學 Core 天書 A 第4堂 (共3小時17分鐘) https://youtu.be/1yWKUMSE5fU?list=PLzDe9mOi1K8p2A7HMhwz4udhLJTQt9p2b
Past Paper Demo (太多,無法估計) https://youtu.be/41cdF_BqxME?list=PLzDe9mOi1K8p2A7HMhwz4udhLJTQt9p2b
------------------------------------------------------------------------------
DSE 數學 Core 天書 A 的內容:
1 -- Number system 數系
2 -- Estimation and Error 估算及誤差
3 -- Quadratic Equation 二次方程
4 -- Function and Graph 函數及圖像
5 -- Exponential (Index) and Logarithm 指數及對數
6 -- More about Graphs 進階圖像
7 -- Numeral systems 進制系統
------------------------------------------------------------------------------
HKDSE 數學 Core 各天書 的內容︰ https://www.facebook.com/hy.publishing/photos/a.312736375489291.68655.198063650289898/933817946714461/?type=3&theater
HKDSE 數學 Core 特別快車班
28堂 (共7本天書) 完成整個 HKDSE 數學 Core
(中一至中六) 要考的所有課題,
適合任何考 HKDSE 的同學上課 (中四至中六都合適)
(p.s. Herman Yeung 所有天書,中英對照)
------------------------------------------------------------------------------
Please subscribe 請訂閱︰
https://www.youtube.com/hermanyeung?sub_confirmation=1
------------------------------------------------------------------------------
Blogger︰ https://hermanutube.blogspot.hk/2016/02/herman-yeung-main-menu.html
Facebook︰ https://www.facebook.com/hy.page
YouTube︰ https://www.youtube.com/HermanYeung
Instagram︰ https://www.instagram.com/hermanyeung_hy
------------------------------------------------------------------------------
![post-title](https://i.ytimg.com/vi/gRUFej-IVmw/hqdefault.jpg)