📜 [專欄新文章] Reason Why You Should Use EIP1167 Proxy Contract. (With Tutorial)
✍️ Ping Chen
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
EIP1167 minimal proxy contract is a standardized, gas-efficient way to deploy a bunch of contract clones from a factory.
1. Who may consider using EIP1167
For some DApp that are creating clones of a contract for its users, a “factory pattern” is usually introduced. Users simply interact with the factory to get a copy. For example, Gnosis Multisig Wallet has a factory. So, instead of copy-and-paste the source code to Remix, compile, key in some parameters, and deploy it by yourself, you can just ask the factory to create a wallet for you since the contract code has already been on-chain.
The problem is: we need standalone contract instances for each user, but then we’ll have many copies of the same bytecode on the blockchain, which seems redundant. Take multisig wallet as an example, different multisig wallet instances have separate addresses to receive assets and store the wallet’s owners’ addresses, but they can share the same program logic by referring to the same library. We call them ‘proxy contracts’.
One of the most famous proxy contract users is Uniswap. It also has a factory pattern to create exchanges for each ERC20 tokens. Different from Gnosis Multisig, Uniswap only has one exchange instance that contains full bytecode as the program logic, and the remainders are all proxies. So, when you go to Etherscan to check out the code, you’ll see a short bytecode, which is unlikely an implementation of an exchange.
0x3660006000376110006000366000732157a7894439191e520825fe9399ab8655e0f7085af41558576110006000f3
What it does is blindly relay every incoming transaction to the reference contract 0x2157a7894439191e520825fe9399ab8655e0f708by delegatecall.
Every proxy is a 100% replica of that contract but serving for different tokens.
The length of the creation code of Uniswap exchange implementation is 12468 bytes. A proxy contract, however, has only 46 bytes, which is much more gas efficient. So, if your DApp is in a scenario of creating copies of a contract, no matter for each user, each token, or what else, you may consider using proxy contracts to save gas.
2. Why use EIP1167
According to the proposal, EIP is a “minimal proxy contract”. It is currently the known shortest(in bytecode) and lowest gas consumption overhead implementation of proxy contract. Though most ERCs are protocols or interfaces, EIP1167 is the “best practice” of a proxy contract. It uses some EVM black magic to optimize performance.
EIP1167 not only minimizes length, but it is also literally a “minimal” proxy that does nothing but proxying. It minimizes trust. Unlike other upgradable proxy contracts that rely on the honesty of their administrator (who can change the implementation), address in EIP1167 is hardcoded in bytecode and remain unchangeable.
That brings convenience to the community.
Etherscan automatically displays code for EIP1167 proxies.
When you see an EIP1167 proxy, you can definitely regard it as the contract that it points to. For instance, if Etherscan finds a contract meets the format of EIP1167, and the reference implementation’s code has been published, it will automatically use that code for the proxy contract. Unfortunately, non-standard EIP1167 proxies like Uniswap will not benefit from this kind of network effect.
3. How to upgrade a contract to EIP1167 compatible
*Please read all the steps before use, otherwise there might have problems.
A. Build a clone factory
For Vyper, there’s a function create_with_code_of(address)that creates a proxy and returns its address. For Solidity, you may find a reference implementation here.
function createClone(address target) internal returns (address result){ bytes20 targetBytes = bytes20(target); assembly { let clone := mload(0x40) mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(clone, 0x14), targetBytes) mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) result := create(0, clone, 0x37) }}
You can either deploy the implementation contract first or deploy it with the factory’s constructor. I’ll suggest the former, so you can optimize it with higher runs.
contract WalletFactory is CloneFactory { address Template = "0xc0ffee"; function createWallet() external returns (address newWallet) { newWallet = createClone(Template); }}
B. Replace constructor with initializer
When it comes to a contract, there are two kinds of code: creation code and runtime code. Runtime code is the actual business logic stored in the contract’s code slot. Creation code, on the other hand, is runtime code plus an initialization process. When you compile a solidity source code, the output bytecode you get is creation code. And the permanent bytecode you can find on the blockchain is runtime code.
For EIP1167 proxies, we say it ‘clones’ a contract. It actually clones a contract’s runtime code. But if the contract that it is cloning has a constructor, the clone is not 100% precise. So, we need to slightly modify our implementation contract. Replace the constructor with an ‘initializer’, which is part of the permanent code but can only be called once.
// constructorconstructor(address _owner) external { owner = _owner;}// initializerfunction set(address _owner) external { require(owner == address(0)); owner = _owner;}
Mind that initializer is not a constructor, so theoretically it can be called multiple times. You need to maintain the edge case by yourself. Take the code above as an example, when the contract is initialized, the owner must never be set to 0, or anyone can modify it.
C. Don’t assign value outside a function
As mentioned, a creation code contains runtime code and initialization process. A so-called “initialization process” is not only a constructor but also all the variable assignments outside a function. If an EIP1167 proxy points to a contract that assigns value outside a function, it will again have different behavior. We need to remove them.
There are two approaches to solve this problem. The first one is to turn all the variables that need to be assigned to constant. By doing so, they are no longer a variable written in the contract’s storage, but a constant value that hardcoded everywhere it is used.
bytes32 public constant symbol = "4441490000000000000000000000000000000000000000000000000000000000";uint256 public constant decimals = 18;
Second, if you really want to assign a non-constant variable while initializing, then just add it to the initializer.
mapping(address => bool) public isOwner;uint public dailyWithdrawLimit;uint public signaturesRequired;
function set(address[] _owner, uint limit, uint required) external { require(dailyWithdrawLimit == 0 && signaturesRequired == 0); dailyWithdrawLimit = limit; signaturesRequired = required; //DO SOMETHING ELSE}
Our ultimate goal is to eliminate the difference between runtime code and creation code, so EIP1167 proxy can 100% imitate its implementation.
D. Put them all together
A proxy contract pattern splits the deployment process into two. But the factory can combine two steps into one, so users won’t feel different.
contract multisigWallet { //wallet interfaces function set(address[] owners, uint required, uint limit) external;}contract walletFactory is cloneFactory { address constant template = "0xdeadbeef"; function create(address[] owners, uint required, uint limit) external returns (address) { address wallet = createClone(template); multisigWallet(wallet).set(owners, required, limit); return wallet; }}
Since both the factory and the clone/proxy has exactly the same interface, no modification is required for all the existing DApp, webpage, and tools, just enjoy the benefit of proxy contracts!
4. Drawbacks
Though proxy contract can lower the storage fee of deploying multiple clones, it will slightly increase the gas cost of each operation in the future due to the usage of delegatecall. So, if the contract is not so long(in bytes), and you expect it’ll be called millions of times, it’ll eventually be more efficient to not use EIP1167 proxies.
In addition, proxy pattern also introduces a different attack vector to the system. For EIP1167 proxies, trust is minimized since the address they point to is hardcoded in bytecode. But, if the reference contract is not permanent, some problems may happen.
You might ever hear of parity multisig wallet hack. There are multiple proxies(not EIP1167) that refer to the same implementation. However, the wallet has a self-destruct function, which empties both the storage and the code of a contract. Unfortunately, there was a bug in Parity wallet’s access control and someone accidentally gained the ownership of the original implementation. That did not directly steal assets from other parity wallets, but then the hacker deleted the original implementation, making all the remaining wallets a shell without functionality, and lock assets in it forever.
https://cointelegraph.com/news/parity-multisig-wallet-hacked-or-how-come
Conclusion
In brief, the proxy factory pattern helps you to deploy a bunch of contract clones with a considerably lower gas cost. EIP1167 defines a bytecode format standard for minimal proxy and it is supported by Etherscan.
To upgrade a contract to EIP1167 compatible, you have to remove both constructor and variable assignment outside a function. So that runtime code will contain all business logic that proxies may need.
Here’s a use case of EIP1167 proxy contract: create adapters for ERC1155 tokens to support ERC20 interface.
pelith/erc-1155-adapter
References
https://eips.ethereum.org/EIPS/eip-1167
https://blog.openzeppelin.com/on-the-parity-wallet-multisig-hack-405a8c12e8f7/
Donation:
pingchen.eth
0xc1F9BB72216E5ecDc97e248F65E14df1fE46600a
Reason Why You Should Use EIP1167 Proxy Contract. (With Tutorial) was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
同時也有3部Youtube影片,追蹤數超過44萬的網紅MakeLearningFun,也在其Youtube影片中提到,Programming become more and more important nowadays. Some people may think it is different to learn, but actually it is not! With the right tools and ...
「c shell function」的推薦目錄:
- 關於c shell function 在 Taipei Ethereum Meetup Facebook 的最佳解答
- 關於c shell function 在 9bulan10hari Facebook 的最讚貼文
- 關於c shell function 在 Herman Yeung Facebook 的最佳解答
- 關於c shell function 在 MakeLearningFun Youtube 的精選貼文
- 關於c shell function 在 prasertcbs Youtube 的最佳貼文
- 關於c shell function 在 Savoury Days Kitchen Youtube 的最讚貼文
c shell function 在 9bulan10hari Facebook 的最讚貼文
#terkini
"Salah saya... memang saya xambil serious pasal kepentingan asid folik ni... sebab sy igt org2 dulu tak makan pun dpt lahirkan kita ni elok... tapi tak sangka jadi pada saya... kpd yg nk pregnant & dh pregnant tolonglah makan.... tolonglah ambil tahu perkara yg boleh & tak boleh utk pregnant =( "
SOALAN & JAWAPAN MENGENAI #ASIDFOLIK.
...Continue Reading#terkini
" it's my fault... I'm really serious about the importance of this acid acid... because I remember that people who didn't eat before we were able to give birth to us... but didn't expect it to happen to me... to those who want to get pregnant & pregnant Please eat.... please know the things that can & cannot be pregnant =("
Questions & answers about #asidfolik.
Failure to eat #asidfolik before & when pregnant can cause the possibility of a baby in the content to face the risk of #kurangupaya on the nerve of the creek and his brain of 75 %.
.
.
💊 actually what is this acid acid?
A very important supplement taken before and during pregnancy.
Have you ever heard of a baby born without a shell? Baby Bonjol on the neck? Bonjolan on the back of a baby like a tail?
Most of the cases recorded are caused by the lack of baby acid that works to help formation of new cells (babies). Say that if you don't consume this acid acid, and the neural tube is not well formed, then the flaws on the nerves of the creek & Brain (neural tube defects - ntd).
.
.
.
💊 What's in the acid acid until it's so important?
Check out our diet patterns. How much are the vegetables, fruits, Bijiran & milk that we drink a day?
Do you know, a pills acid pill that is yellow & Small 5 mg isn't it.. together with a bowl of spinach, 1 OKRA, 1 Cups of asparagus, 1 Cups of black beans beans & Papaya. (budget).
So, do we eat all these types of vegetables every day?
Because we can't eat all of these every day maybe because we're busy working, so this acid acid is made a replacement.
.
.
.
💊 why do you have to eat 3 months before pregnant?
O & g expert experts encourage this baby acid to be eaten 3 months before pregnancy aims to help formation of new cells in the body (fetus).
According to study, pregnant mothers can avoid the risk of the baby being affected by 75 %. Besides, the content of this baby acid is actually ' Mencntikkan Rahim ', that's why she took 3 months before pregnant.
.
.
.
💊 how to know 3 more months to get pregnant?
Many husbands and wives make mistakes when they don't plan to get pregnant. There are people who follow their provisions... "if pregnant is a conceived".
Actually & it should be a couple of husband and wife to plan. Make a 'meeting' with a partner & discuss when you are targeted to have a child, so that the future mother will know when the date is before pregnant.
.
.
.
💊 if you've planned but what's the most ' babas '?
My advice, whether we are planning to get pregnant or not, our diet needs to be taken care of. Junk Food & fast food among you need to avoid & practice healthy diet all the time & not just to plan for pregnancy.
In this condition mommy don't panic. After knowing pregnant, quickly start intake of baby acid 4 mg once a day and practice healthy diet.
Don't take acid acid before pregnancy doesn't mean our body has no acid acid at all. Allah has created this human body like a complete machine =)
.
.
Baby acid is only eaten before 3 MONTHS BEFORE PREGNANT UNTIL 3 months old content. Entering 4 months of age mommy's content can already eat obimin (Multivitamin) that contains calcium.. Iodine.. B12 etc...
.
.
Calcium
✔ it is necessary for the absorption and use of calcium and phosphorus as well as setting the mineral rate in the body.
✔ Important for growth especially baby bones and teeth.
✔ it prevents muscle from being weak other than being involved in arranging heart beats.
.
.
🍇 Iron (Iron)
✔ an important role in oxygen transportation from lungs to tissue cells.
✔ Not only in mother's body, even it also plays the same role as the baby in the content.
✔ It joins oxygen in the lungs and releases oxygen to the tissues in need.
✔ it is also used in the production of anaemia (Red blood cells).
✔ If the lack of iron, it will cause pregnant mothers to get tired quickly and the possibilities of anemia (Red blood cells lack) will increase.
.
.
🍇 Vitamin C
✔ due to the human body system cannot produce vitamin C, it must be obtained through food or in the form of supplement medications.
✔ this type of vitamin is an antioxidant and helps to increase resilience to infection and healing wounds. It can also increase the absorption of iron in food to prevent anemia.
.
.
🍇 Vitamin B12
✔ helps the development of brain, nerves, and blood vessels. It can also improve the energy level, mood and stress level during the is of these two.
.
.
🍇 Iodine
It is very important to keep the function of thyroid gland during pregnancy. The lack of iodine can cause cancelled physical growth, severe mental disability and deafness other than can cause miscarriage and birth.
.
.
💊 don't you have any side effects to eat this supplement?
✔ This is one of the most 'famous' mistakes among women. Many people remember that taking supplement supplement is excessive, it doesn't harm health and they think it's good.
✔ the truth is, anything that is taken over and does not hold on will harm the health.
✔ Take care! Intake of extra supplements can not be replaced with balanced food. It is just an additional source that is not supposed to be taken as the only source of food that the body needs or is made a replacement.
This is not even 1 % preparation of getting children.... there are many more pregnancy & birth knowledge that mommy needs to know before being called Mom & Dad is great for children. Refer to the book #9 bulan10hari... lots of pregnancy knowledge.. Birth... Confinement & nursing in dlmnya.
.
.
Where can I get this folic acid?
- can buy at pharmacy for as low as 1.30 cents depending on the brand.
- if you get it at the health clinic / government hospitals free...
.
.
💊 like, share & tag this info so that many parents will be alert about acid acid.
💊 COPYRIGHT@NAZIRA NAZIR ONLY MADE 9 bulan10hari not allowed to copy paste!Translated
c shell function 在 Herman Yeung Facebook 的最佳解答
Form 6 Maths - M2 - Practice Paper
SECTION A
Question 1
屬中五程度的 binomial theorem 二項式定理,仲要係最容易個隻。
Question 2
System of linear equation 線性方程組 之 homogeneous equation 齊次三元
有 non-trivial solution 非零解,其實只係
而同學細心d睇,其實係一個2次的狀態,
只需要用產產產的方法就 okay
Question 3
會考程度的 MI,相對比較繁少少的考法
時間會長少少,不過 5 分,所以 format 上不要太過求其
Question 4
(a) part 唔難,
但 (b) part 其實係 partial fraction (積分 integration 教過的技巧。)
Question 5
(a) part 為 三角學的 compounded angle formula
而 (b) part 當中就算唔識計,都可以用到我地 program 黎估到答案係 0
Question 6
典型的 first principle 考法
Question 7
有d似中七 maths and statistics 的作風,利用 e 及微分 differentiation 砌公式出黎。
Question 8
(a) 正如上堂所講 substitution 唔會再俾 hint (除非太深)
(b) 積分A筆記已列曬所有 by part 的典型題目,呢條係其中一條
Question 9
Tangent, normal 切線法線 的第三類題型,溫翻我地d筆記無可能唔識。
Question 10
(a) 開始有少少睇頭,要自己明白要 in 都 e 就一定要次方同d裡面果件完全相同先可以 in 到。開始超越中五程度
(b) 開始打破傳統,迫學生用 shell method,仲要完全明白內裡 concept 先計到。
我地會於 intensive plan b 加強呢 part 的技巧
大睇上 section A 要攞分唔算太難,如果數學底較差的同學,應該放多D時間嚮上面,令自己可以當中取得40分以上,就一定穩合格
SECTION B
Question 11
(a), (b) 唔算難,但 (c) part 就要睇你有無做過 past paper,其實有某幾年的 past paper 都有類似考法,有做過的相信用多少少時間應該攻得入,無做過的可能真係會全軍覆沒。
Question 12
(a)(i) & (a)(ii) part 其實都係用緊中五程度的 2D Vector
(a)(iii) part 就要你好明白立體向量的概念,如果學校教得好少或者好亂,可能完全唔知佢問咩。
(b)(i) 有背公式唔難搵
(b)(ii) 的確好深,要明白如何運用平行於抽象的3D當中,此 part 的深度已達中七。
Question 13
(a) 要了解 odd, even function 奇偶函數的特性,否則無可能識計
(b) 利用 compounded angle formula 複數公式,慢慢砌一定砌到,但2分的回報實在太低。
(c) 要用曬 (a), (b) part 的結果,當中都算複雜
Question 14
(a) part 好淺
(b) part 的內在 concept 唔難,但好煩,好易令自己陷入困境而浪費好多時間
綜合全份卷,都係算深,但部署上一定要先做 section A,
section A係50分,section B又係50分,
但所用的時間相信 section B要多一倍
成本效益,所以一定先攻陷 section A
另外 Long question 都係以取易不取難的戰術
做曬所有易食的部分。
c shell function 在 MakeLearningFun Youtube 的精選貼文
Programming become more and more important nowadays. Some people may think it is different to learn, but actually it is not! With the right tools and resources, we believe every one can learn programming!
In this video, we explain hello world c++ program in detail such as iostream,
cout, less than operators, end , main function and return value of the program.
We also demonstration how the compiler can help us and some experiments about the return value.
If you want to watch more video from us, please
-do subscribe us!
-like the video and share to you friend who have kid on the facebook, tweeter, google+....etc
how to learn math
https://www.youtube.com/playlist?list...
stem projects
https://www.youtube.com/playlist?list...
Anpanman Educational Toys
https://www.youtube.com/playlist?list...
Learn Shapes for kids
https://www.youtube.com/playlist?list...
Learn letter A to Z
https://www.youtube.com/playlist?list...
Learn names of fruits and vegetables
https://www.youtube.com/playlist?list...
Learning street vehicles names and vehicle sounds
https://www.youtube.com/playlist?list...
Learn names of animal with animal sound
https://www.youtube.com/playlist?list...
c shell function 在 prasertcbs Youtube 的最佳貼文
การใช้ _ ใน interactive shell
การตั้งชื่อตัวแปรด้วย _ ในโค้ด
การนำหน้าชื่อตัวแปรด้วย _
การนำหน้าชื่อ function, method, class ด้วย _
การ import module ที่มีชื่อตัวแปร ฟังก์ชัน และคลาส ที่ขึ้นต้นด้วย _
การใช้ __all__
=== ดาวน์โหลดไฟล์ตัวอย่างได้ที่ https://goo.gl/R89e5h และ https://goo.gl/V2mMxC
============
playlist สอนภาษาไพธอน Python เบื้องต้น
https://www.youtube.com/watch?v=DI7eca5Kzdc&list=PLoTScYm9O0GH4YQs9t4tf2RIYolHt_YwW
============
playlist สอนภาษาไพธอน Python การเขียนโปรแกรมเชิงวัตถุ (OOP: Object-Oriented Programming)
https://www.youtube.com/watch?v=4bVBSluxJNI&list=PLoTScYm9O0GF_wbU-7layLaSuHjzhIRc9
============
playlist สอนภาษา R เบื้องต้น
https://www.youtube.com/watch?v=oy4qViQLXsI&list=PLoTScYm9O0GF6qjrRuZFSHdnBXD2KVICp
============
playlist สอนภาษาจาวา Java เบื้องต้น
https://www.youtube.com/watch?v=O3rW9JvADfU&list=PLoTScYm9O0GF26yW0zVc2rzjkygafsILN
============
playlist สอนการเขียนโปรแกรมเชิงวัตถุด้วย Java เบื้องต้น
https://www.youtube.com/watch?v=zC_0xOSX1dY&list=PLoTScYm9O0GEvHKqqib-AdVFwVe_2ln8W
============
playlist สอนการทำ Unit Test ภาษาจาวา Java
https://www.youtube.com/watch?v=R11yg8hKApU&list=PLoTScYm9O0GHiK3KNdH_PrNB0G3-kb1Bi
============
playlist สอนภาษา C เบื้องต้น
https://www.youtube.com/watch?v=Z_u8Nh_Zlqc&list=PLoTScYm9O0GHHgz0S1tSyIl7vkG0y105z
============
playlist สอนภาษา C# เบื้องต้น
https://www.youtube.com/watch?v=hhl49jwOIZI&list=PLoTScYm9O0GE4trr-XPozJRwaY7V9hx8K
============
playlist สอนภาษา C++ เบื้องต้น
https://www.youtube.com/watch?v=_NHyJBIxc40&list=PLoTScYm9O0GEfZwqM2KyCBcPTVsc6cU_i
============
playlist สอนภาษา PHP เบื้องต้น
https://www.youtube.com/watch?v=zlRDiXjYVo4&list=PLoTScYm9O0GH_6LARFxozL_viEsXV2wgO
============
เชิญสมัครเป็นสมาชิกของช่องนี้ได้ที่
https://www.youtube.com/subscription_center?add_user=prasertcbs
c shell function 在 Savoury Days Kitchen Youtube 的最讚貼文
This video shows you how to make a fluffy, soft and tender upside-down banana cake. This cake can be baked in a rice cooker or an oven.
INGREDIENTS (18 - 20 round pan)
A. Fruit part
250 gram (about 2-3 large) bananas (apples or pineapples are also very good)
30 - 40 ml (2-3 Tbsp) lemon juice
50 gram unsalted butter (about 1/2 stick or 1/2 C)
70 gram brown or yellow sugar (1/3 C)
B. Cake
180 gram all purpose flour (1-1/2 C)
7 gram baking powder (1-3/4 tsp)
1/4 tsp cinnamon powder
1/8 tsp 5 spice powder (optional)
120 gram (1 stick/ 1 C plus 1/2 Tbsp) unsalted butter - softened at room temp
a pinch salt
85 gram caster sugar (1/3 C - I feel the sweets in EU and the US are sweeter than in Vietnam, so you can increase sugar to 95 - 100 gr if you'd prefer a "deep" taste of sweetness)
2 medium sized eggs (60 - 65g/ egg including shell) - at room temp
60 ml (1/4 C) milk - at room temp
65 gram (1/4 C) yogurt - at room temp
If your rice cooker doen's have a cake function, you can first set it at "Cooking mode", then when the rice cooker changes to "Warm mode", wait for 3 - 4 minutes and set it back to cooking mode. We need to bake this cake for about 45 - 55 minutes. It's best to keep the rice cooker at "cooking mode" in about 3/4 of this time.
The cake can be baked in a preheated oven at 165 degrees C/ 330 deg. F in about 45 - 50 mins, until a skewer inserted in the middle of the cake comes out clean and dry.
--------
Mời các bạn xem công thức đầy đủ tại http://www.savourydays.com/video-cach-lam-banh-chuoi-up-nguoc-voi-noi-com-dien-va-lo-nuong/
MINI GAME & QUÀ TẶNG TỪ ZOJIRUSHI VN
* Đối tượng tham gia: tất cả các bạn bè của SD hiện đang sống tại Việt Nam hoặc có địa chỉ chính thức tại Việt Nam để có thể nhận quà tặng qua đường bưu điện
* Thời gian: từ 16/1 đến hết ngày 21/1 (giờ Việt Nam)
* Cách thức tham gia:
(1) Chia sẻ/ Share video này hoặc video từ Facebook Fanpage của Savoury Days (https://www.facebook.com/savourydays/videos/948761055177480/) tại Facebok. Để chế độ Share Public (cho tất cả mọi người) (nếu không Zojirushi sẽ không "nhìn thấy" các bạn để chọn người may mắn được :) ). Trong link chia sẻ có các hashtag #zojirushivn #savourydaysvn #giveaways (các bạn chỉ cần copy dòng này là được nhe :)
(2) Để lại phản hồi ở dưới video này (tại YouTube) giải thích lí do vì sao bạn muốn có chiếc bình nước này (thông tin về bình nước các bạn có thể tham khảo thêm tại www.zojirushi.vn, bình nước giải thưởng là loại bình lưỡng tính SM-AFE 35)
* Cách thức chọn người trúng giải: Zojirushi và SD sẽ chọn ra ngẫu nhiên 2 trong số các bạn chia sẻ post và 3 trong số các bạn phản hồi ở dưới video để tặng quà (như vậy, các bạn không nhất thiết phải làm cả 2 bước trên nhưng nếu có cả 2 bước thì cơ hội trúng giải sẽ cao hơn nha :) ).
* Danh sách các bạn may mắn sẽ được thông báo tại www.savourydays.com vào thứ Hai ngày 25/1/2016. Zojirushi sẽ chuyển phần quà tới địa chỉ của các bạn theo đường bưu điện.
--------------
MUSIC: Life of Riley by Kevin MacLeod is licensed under a Creative Commons Attribution license (https://creativecommons.org/licenses/by/4.0/)
Source: http://incompetech.com/music/royalty-free/index.html?isrc=USUAN1400054
Artist: http://incompetech.com/