📜 [專欄新文章] 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.
👏 歡迎轉載分享鼓掌
「lower case symbol」的推薦目錄:
lower case symbol 在 JaeYoong Facebook 的最讚貼文
Oh wow! I just realized this guy sounds so much like me!! Long long post! But good read though! (:
The phone rang.
She was sobbing badly on the other end of the line.
“I’m going over,” I told her and hung up before she could protest.
1am. It was going to be a long night ahead..
She was still crying when she opened the door. She looked so broken, so vulnerable. I didn’t have to know what was wrong, I just held her in my arms. She cried even more.
“He broke up with me,” she finally said.
I just kept quiet as she let it all out.. questions, tears, anger, hurt.
“Why does love have to hurt so much?”
“No, love.. doesn’t hurt,” I said gently.
“So says the guy who’s been single forever? What would you know about love,” she jabbed.
“So says the guy who’s been your friend though Mr now-ex-#4,” I grinned. “Love doesn’t hurt you.. it’s the person that doesn’t know how to love or appreciate love that hurts you. But love never hurts,”.
“You won’t understand, Matt,” she sighed, “you’ve never been in love…”
“That’s not entirely true, you know..”
“Wait what- so who’s this girl I’ve never heard abou-“
“What did you love about #4 anyway?” I interjected.
“I don’t know… he is just perfect. And I love him so much,”
“But you don’t know what it is that you love about him?”
“It’s just.. the feeling when I’m with him. It always felt right with him. He made me feel loved and I loved him too,”
“That’s it? Just a feeling?”
“Well.. yea. What were you expecting me to say?”
“.. something more specific, maybe? I mean, if you thought he’s so ‘perfect’, why’d he still chea- erm, why’d he leave you?”
“Because I’m just not good enough for him? I don’t know..” she paused. “What is love to you then…”
“Hmm.. to me, being together or in love with someone should be more that just a feeling.. it should also be about mutual understanding, acceptance, respect, commitment and trust.”
“That’s what all couples would hope and want their relationship to be like, Matt. But expectations and reality don’t always go together..”
“Or maybe.. someone’s just not trying?”
“Well if you think love is so simple.. why haven’t you been with anyone all these years?”
“I never said love was simple.. but I guess the reason why I’ve never been with anyone yet is because.. I already know exactly what I want,”
“You have.. a checklist?”
“Sorta. It’s not the typical kinda ‘I’d like a girl with long hair, nice smile, etc’ superficial checklist though,”
“Oh. What kind of list is it then?”
“It’s like.. a concept of love. Of what it is about a girl that will make me fall completely in love with her. A concept that has more than three specific reasons that would answer any question as to why I love her.”
“You have a concept of love?” she laughed. “Love isn’t a theory, Matt.. you can’t just classify love by a concept or definition, you simply feel it with your heart..”
“But you see.. the reason why I think there are so many broken hearts, is because people merely jump into a relationship when their heart feels a certain something towards someone. But I don’t think that’s love, that’s merely an infatuation. Personally, I believe there are more than three reasons and aspects that actually determines whether we really are truly in love beyond the superficial ‘I don’t know why I love him/her.. I just do’ reason,”
“That makes sense. So what exactly is this.. ‘concept’ of yours about?” she asked, genuine curiosity replacing her initial skepticism.
“I call it the 4+1 theory. The aspects that will determine if it’s true love or just a fickle infatuation. It’s based on this idea that whenever we like someone, if we really go deeper into what is it that draws us to him or her, we’d be able to find that one specific reason. That’s not love though. That’s merely an attraction or infatuation. But when more than three of the aspects from this theory are present, you’ll be pretty sure that it’s more than just a feeling. For me personally, this determines if I’ll ever fall in love with a girl…”
Mind. Heart. Body. Soul.
The mind aspect, to put it simply, is her intellect. But I don’t mean the academic smarts.. it’s the way she thinks, processes and analyzes things way beyond a shallow self centeredness. It’s the way she puts across her thoughts, not for winning an argument’s sake, but to really try to understand or even sensibly debate opposing views that might leave anyone reflecting on her words or challenge me to think differently. It’s the way she carries herself off with an aura of sophistication and enigmatic charm and no matter how much I might think I already know her or have her figured out, she’ll still surprise me with something unexpected. Good surprise. I like intellect. Personally, it takes a little more to intrigue me and stimulate my senses. If I can connect with someone and talk endlessly about the concept of nothing, then, only then, will we be able to talk about everything else.. and I think that’s incredibly alluring,”
“Ooh.. so my best friend’s sapiosexual too,” she teased. “But what about her likes and dislikes or like her personality.. does that go under the mind aspect too?”
“Well, that’s where the heart aspect comes in. The heart represents who she is by what she values or cares about. The things she likes, the things she dislikes. What really matters to her, as well as her insecurities and fears..”
She bit her lower lip - thinking. “But what if him knowing about my past and all my insecurities scares him or drives him away? Or what if he ever uses all of these against me if someday things go bad between us?”
“Erm.. you do realize that it doesn’t really matter now because whether or not he ever knew, he already chose to leave you right? But.. if he still or ever tries to hurt you in any way, then he is a fucking bastard and I will punch his face,”. I really meant it.
“I don’t think he even cares about me anymore,” she sighed, “maybe he never really did.. we were so.. different. I don’t know why I never actually realize it before,”
“Maybe because then, you were too ‘blinded by love’ to see, or you chose to conveniently ignore the differences. Honestly though, I think it’s critical for two people to understand each other’s heart and learn to accommodate each other’s differences rather than simply turning a blind eye or deaf ear ‘because I love him and that’s all that matters’. Because if two people are too different in the way they think, behave or live.. I reckon it will become a huge problem when the infatuation bubble bursts.”
“I don’t really understand..” she said.
“Let me just ask you this.. does he know how passionate you are towards the arts and music?"
“Well, no.. not really. He’s more the sports kind of guy and doesn’t like theatre and stuff so I didn’t want him to get bored if I talked to him about things he isn’t interested in..”
“Then i’m guessing he probably also doesn’t care or know the little things about you. Like how you’re afraid of the dark and why you’re actually scared of darkness.. how family and relationships are really important to you.. that ice cream is your happy pill. You know, I’m even going to bet that he doesn’t know you go to bed every night, clutching your phone just hoping and waiting for him to text you goodnight..”
She started to tear again, but I continued..
“You see, it’s not a matter of whether it bores him or not.. it’s a matter of whether he bothers or not. I mean, if he doesn’t even know these things about you, then he really doesn’t know you at all. How then can he say he loves you?”
“But I really loved him,” she murmured softly to herself .
“I know you did. I know you still do and it’s hurting you like shit. But you need to know that for any kind of relationship to work.. two people need to give and take. Sadly, with him, it seems like you’re the one who was always giving. If he actually really loved you back as much, he’d make a greater effort to close the gap and bridge the differences between you two. He’d want to hear what you have to say, he would actually consider your opinions, your needs and your feelings. He’ll not just tell you or text you that he loves you.. he’ll show it by the things he will do or be willing to do no matter how inconvenient or silly it might be, just because.. he knows it’ll make you happier or better. To me, when it comes to a relationship, the heart aspect isn’t just a feeling or who you/he or she is anymore. It becomes two hearts beating as one. Two people wanting to understand each other.. sharing the good, the bad and possibly a future together; actually bothering and supporting each other’s feelings, values, dreams, thoughts, emotions,”
She stayed silent for a long while before she looked up, holding my gaze.. there was this unspoken tension building before she finally spoke again.
“But.. what if something that’s important to me, is not something the guy might feel same way about?"
“Then I’ll try-” I caught myself. “I mean, if I were him. I’d try. I’d make the effort.. because it’s important to you and you’re important to me,”
She remained silent again. She wasn’t crying anymore but this time, the prolonged silence was starting to grow even more deafening.
“Matt,” she finally spoke - softly, “do you believe in love at first sight?”
“No.” I said flatly.
“Oh..” she sighed. “You know what you said about mind and heart.. it’s actually starting to sink in and I’m beginning to realize that maybe these two aspects weren’t exactly a big part of my relationship with him,”
“So what made you fall in love with him then?”
“Well.. don’t laugh, but I’ve always thought that with him, it was love at first sight. I mean, there was just this spark between us from the very first time we met,”
“Cos he was hot?” I scoffed.
“No.. don’t be an idiot,” she tried to hide her smile but failed. I rolled my eyes. “Okay fine, yea maybe that. But it wasn’t the only reason!”
I raised an eyebrow.
“He was really nice too! And he was always sweet to me,“ she began her defense case. “He always made me feel happy, secure and loved without even having to try, you know?” I just continued staring at her waiting for her to go on. “Oh never mind, you’d never understand..”
“Actually.. I do. And I think I now understand what it was that made you fall in love with him.
The body aspect.
The body aspect is about physical attraction, intimacy and presence.
I don’t believe in love at first sight. I don’t believe you can just “instantly know” you’re in love or that someone’s THE one just by “first sight”. No offense, but I think the whole love at first sight concept is bullshit that only exists in movies and fairy tales. In reality, it isn’t love. That very first attraction.. is probably lust. Lust at first sight”.
“What nonsense! It’s not like I was lusting over him from the very first time I laid eyes on him! Maybe it’s the case for guys.. I mean, sex is always on a guy’s mind whenever he meets a girl right? But it’s different for girls, Matt..” she protested.
“Okay. You know what.. since you brought up the age-old guys and sex debate, I’ll tell you this secret to clarify something about guys for the first and last time.. probably 99% of guys are naturally sexual. If you ever meet any guy who tells you he isn’t sexual at all, it’s not that he’s gay – no, gays are even more horny .. he’s likely to be a liar and you should be more wary of him. BUT! Here’s the thing.. even though guys are sexual by nature, it isn’t always the only or most important thing to a guy,”
“Really?” now she raised her eyebrow with that annoying smirk on her face.
“Oh come on, you girls know how it is, plus you aren’t exactly saint-like innocent either.. sometimes you see a hot guy and you start fantasizing or making statements like ‘omg have my babies’..”
“That…” she started blushing.
“That.. is exactly my point. It’s the same with guys. We might talk and think about sex a lot more openly than girls but it isn’t always the only thing on our mind. When I said it’s lust at first sight.. I didn’t literally mean you want the guy naked and in bed. What I meant is the momentary attraction or desire– he might be hot, he might be charming, he might have smiled at you that made you feel a certain way.. but that’s not love. That’s really just a superficial physical attraction. Saying “I’m in love” right there and then just completely takes the special meaning out of the word ‘love’. If you ask me, I personally think the process of loving or falling in love with someone involves discovering the person and then perhaps developing feelings. It could happen quickly or over a longer period of time, but not at first sight,”
“Hmm.. that does make sense,” she paused and then her lips curled up forming that annoying smirk again. “Oh wow, this is the first time you and I are talking about sex huh..”.
“You never asked..”
“Tell me then.. what is sex to you?”
“Sex.. to me, is merely a physical act. I am not part of the whole “sex is sacred/taboo” camp but then, I don’t take sides with the whole bed hopping culture either,”
“I can’t believe you just said that sex is merely a physical act..” she began in a disappointed tone.
“But sex really is just a physical act if it’s without emotions or feelings. And that is why I distinguish between sex and making love, the same way I clearly differentiate ‘loving’ and ‘being in love’ with someone,”
“Oh.” this time, she smiled. She understood.
“Don’t get me wrong.. I think physical intimacy is very important in a relationship but for me, the one physical aspect that matters the most.. is the physical presence. That, is also what I reckon made you fall in love with him.
“Okay this, I really want to know…” she said.
“The physical presence is simply being there. You want him to be with you. You want to be there for him. Because just being there with or for each other makes your day, or you as a person, a little better. You may act or behave a little different when you’re with him, but in a good way – in a way that you actually feel completely comfortable, safe and you. Perhaps even without you knowing, you smile more and laugh harder. You feel real, genuine joy. And even on days when the smile can’t happen, you know you don’t have to pretend to be okay or be self conscious in front of him; because its perfectly okay to be the way you are and feel when you’re with him. He cares about you and you feel loved when you’re with him. Sometimes, there are no need for words or explanations.. just his presence, him being there for you, holding you.. makes you feel better or believe that it’s going to be okay again. Because you’re not just holding on to someone for attention or sympathy.. you actually feel and believe that you’re holding on to a part of or the rest of your life..”
Which leads to the fourth aspect – soul.
The soul aspect to me, is the deepest form and the final affirmation that should answer any remaining doubt or questions as to whether we’ve truly fallen in love with a person.
It’s when you start noticing but still appreciate all the other little things, even the flaws - especially the flaws. It’s when you truly know a person stripped down of all their walls, exposed to their soul and yet still accept and love him or her. It’s a level of understanding and acceptance that goes beyond the “honeymoon everything is perfect” period.
It’s when you finally realize this one person is someone you can always and want to tell everything to, and you want to ask and know everything of him or her as well. It’s when you actually want to share your life and trust your secrets with this person; and you can. This someone is the first person you think of when you’re happy, sad or when something significant happens. This same person is someone you can call at 1am in the morning and they’d drop everything to make time for you, staying by you till the sun rises or you’re better again - as you would for him or her as well. This person cares and will listen. Will really listen, giving you their undivided attention and genuine love; not necessarily every time but any time you need him or her. This one person makes your problem their problem and they go through it together with you just so you don’t have to go through the pain and tears alone,”
It was at this moment, for the very first time, she looked at me in a different way but said nothing.
“You see, the soul aspect..” I continued, “is when you start to see and want to share the rest of your life with this one other. And not in a clingy “I can’t live without you” way, but in a way that I can still live my life without you as I have before I met you, but now that you’ve come to exist in my life, I see the possibility of a life with you and now I actually want to make decisions and live a life, continuing to create more moments and memories together with you”.
“Well.. so.. have you met this one person yet? I mean, I’m sure it’s almost impossible to find that ‘perfect’ girl who fulfills all of your four aspects of love right?” she mumbled. I could barely hear her. She wasn’t even looking at me anymore.
“No, it is not impossible and I don’t think its asking for too much. You see the thing about these four aspects is, we often and will find one or two aspects in many different people. And that alone may be enough to make us attracted to them or develop a crush on them. But really, that is not love at all. If we like a person because “he’s cute” or “the way she thinks”, that’s just us liking the body and/or mind aspect of a person. The reality is, we are always going to meet many people who possess these different aspects of mind, heart, body or soul. But on a rare occasion when you do meet someone who possess all these four aspects.. you’ll almost definitely know that he or she is not one of many but may just be the one. So personally, I won’t settle for anything less unless she possess more than three qualities. You know people write the symbol of love as < 3 (less than three), I actually think love should be more than three.. I define it as 4+1. “
“So what’s plus one?” she asked, still not looking at me.
“Plus one…” I trailed off – unconsciously.
“Matt?” she placed her hand on top of mine, finally looking me in eye again.
“Plus one.. is something only the one who's meant to be will ever know and hold the answer to”.
end.
-
Some time Feb, I experimented writing in a different way.
I wrote a story.. 4+1.
It's a story that took me more than a month to 'finish' writing. It's a story that's personally very close to my heart - then and will always be.
Truth be told, it was a story written as a confession and answer.
To you who've followed and related to 4+1, I thank you for reading and allowing me to share this intimate chapter with you.
If you'd like to read my future writing, you can follow my facebook if you want to.
Love,
Matthew Zachary Liu
-