[Four Insights on Building a Marketplace]
The Marketplace business model has been the poster child in the startup scene for well over a decade: AirBnb, Uber, Lyft, Thumbtack, OpenTable, just to name a few. And some like Craigslist, eBay, and Alibaba are old enough to buy a drink in most places around the world. Why are marketplace a good business? And how does one go about starting a marketplace? If you want to learn more about marketplace or eventually start your own, this is the post for you:
- The Pros of a Marketplace Business: because you host a place for supply to meet demand, the tech barrier is very low, one can essentially run a marketplace business just with a simple website. Moreover, the nature of connecting supply with demand means you don’t have to carry any inventory, this in exchange gives you the ability to scale faster. Lastly, Network effect is the key to marketplace business. Once you start the flywheel of supply or demand, with some form of moderation, the next supplier will bring in more demand that’ll bring in more supply or vice versa.
- Cracking the Infamous Chicken or Egg Problem: So do we start with supply first or demand? Eight out of ten times a marketplace begins with onboarding the supply end first. Simply because the supply side has nothing to lose by being on the marketplace. But if there was an abundance of demand and a lack of supply, by not being able to make ends meet will lead to loss of demand and create a negative network effect.
- Building a Healthy Supply Side to Start Your Marketplace: First thing to do is to limit the size of your marketplace. It might seem counterintuitive but by limiting your market size to say “Taipei city only”,“XX district only”, or even “XX category only”, you will have a much easier time creating a solid stream of supply for customers to tap into. The goal here is to make sure when the demand side comes to your marketplace, there is plenty of supply for them to stick around. Your can onboard your supply side like most customer acquisition channels: direct sales, referral program, word of mouth, subsidization/discount, marketing, offline events etc.. you get the idea.
- You’ve Got the Supply Side Sorted, it’s Time to Bring in Demand: the key here is to execute, test, measure, and repeat. There are multiple channels to test for the Demand side but don’t expect them to work on the first try. You can start off with paid channels, but what you are really looking for is organic growth within these channels. This is a sign that your marketplace is indeed solving a problem and providing value. Again, you want to keep iterating until this happens.
If you are trying to build a fast growing marketplace and want to learn how, AppWorks Accelerator is now accepting applications for its next AI/blockchain only batch (AW#20). Final round deadline is 12/16 >>>http://bit.ly/2DSbpMB
--
by Jack An
Analyst
[Photo description: Craigslist while being one of the oldest marketplace on the internet, was pulled apart by multiple marketplace startups that bought users a better experience and service.]
同時也有1部Youtube影片,追蹤數超過11萬的網紅Lukas Engström,也在其Youtube影片中提到,Although I only started making YouTube videos in Taiwan 1 year ago (and boy, what a journey it has been!), the story behind my videos is much longer t...
why go on exchange program 在 Taipei Ethereum Meetup Facebook 的精選貼文
📜 [專欄新文章] 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.
👏 歡迎轉載分享鼓掌
why go on exchange program 在 Lakoi DOTA2 Facebook 的最佳貼文
สัมภาษณ์โค้ช Cty Coach Cty ผู้เล่นคนที่ 6 เบื้องหลังทีม Buriram United Dota 2 หลังคว้าแชมป์ ESL Thailand
Thank you Chris Ian Francis Maldo!!
ช่วงนี้วงการแข่งขัน Dota 2 บ้านเรากำลังร้อนแรง ทั้งทีมหน้าใหม่หน้าเก่าเต็มไปหมด การแข่งขันก็เริ่มมีมากขึ้น ล่าสุดรายการที่เพิ่งจบไปคือ ESL Thailand Championship Season 1 โดยแชมป์เปี้ยนคือทีม Buriram United นั่นเอง ผมได้มีโอกาสพูดคุยกับ Cty ซึ่งเป็นโค้ชของทีม เอามาแชร์ให้ทุกคนได้อ่านกันครับ
...Continue ReadingInterview Coach Cty @[306043956730585:274:Coach Cty], the 6TH PLAYER BEHIND BURIRAM UNITED DOTA 2 TEAM AFTER ESL THAILAND CHAMPIONSHIP.
Thank you @[746861111:2048:Chris Ian Francis Maldo]!!
Recently, our DOTA 2 competition is hot. The whole team is full of old faces. The competition is getting more. Recently, the program that just finished is ESL THAILAND CHAMPIONSHIP SEASON 1, the champion is buriram united. I had a chance to talk to cty. I am the coach of the team. Let's share it for everyone to read.
Q: introduce yourself a short time
A: my name is Chris from Philippines aka cty. I have now coached buriram united for a while. I have coached other teams in sea zone.
Q: why does DOTA 2 team need coaches and what are the skills, talents of people to coach?
A: because DOTA 2 is a high focus game and focus, coach is like the third eye of the team. I will notice a few details in the game and plan the game for the team.
Being a coach is necessary for you to have the patience and discipline to control your team work. Whether it's good days or bad days. and for me, it's also important to create a positive atmosphere for the team at all the time. Care, understand team members. This is what I am Think it's my style that special is easy access that makes players reach and open minded with me.
Q: how is buriram united team prepared for each game, each tournament?
A: first of all, we will have a sit and talk after practice. That day, we will offer ideas, talk about what we missed, what we do better.
In my part, I will keep the record of each team watching our replay and replay of the opponent. Draft Hero for me is not easy because we have to put the team play style depending on the way of thinking of the opponent like we have to think ahead. Let's go first. One step.
Q: what are the main factors that make buriram united team stand out and do good work during this period. Beat Alpha Red Team (now change to 2 be) in the final 3-0 games.
A: for the msc team in the semifinals, I think we are a little lucky by his just had a mid player change and it seems to need time to adapt. Alpha Red, we have studied replay and find their weaknesses and played along our strengths.
And finally, I think it's the practice and hard work we've been doing all the time. It's been a long battle for me.
I want to thank my parents for supporting who I am.
Thank you buriram united sponsors including our manager natt for believing in us.
Including as a Catholic, I start and end the day with prayer. I thank god for guiding me through this battle.
Q: what do you want to leave, including what do you want to leave for players or DOTA 2 teams who want to improve, including competing.
A: I strongly believe that attitude comes first. Come later. Act like a glass of water. Think positive. Create a team sharing atmosphere where everyone is relaxed, free to try and talk to exchange ideas.
Study the replay of pro a lot. Trust in yourself. Create the best attitude. Success will come. If you don't quit and try wrong, try right will definitely help you.
Thank you for this interview and I want to leave another thing.
Stop the hate, let's support each other and we should stregthen Thailand Dota Community!
Stop the hate. Let's support cuddle am and we will make the THAI DOTA 2 society stronger!
-------------------------------------------------
A little bit of a bit of a bit of a
What is the most highlight of the 5 players on the team?
Luzify - leadership
Neah - skillplay skills
Lionax - game reading
Mel m - hard working hard
Masaros - good at eatingTranslated
why go on exchange program 在 Lukas Engström Youtube 的精選貼文
Although I only started making YouTube videos in Taiwan 1 year ago (and boy, what a journey it has been!), the story behind my videos is much longer than that.... Actually, it all started around 10 years ago!
Thank you all so much for watching this video! If it’s not too much to ask, please help me out by sharing this video and channel so everything get to see all the beauty of Taiwan! ❤️台灣
Business inquiries:
中文/English
創作者經紀人/Contact person: - Maggie
Line ID: @rog8149u
Email: lukas@ruredi.co
Want to see photos from our adventures before everyone else and/or suggest what I should check out next?!
Please follow me on:
Facebook: www.facebook.com/LukasTaiwan
Instagram: www.instagram.com/LukasEngstrom
The following is the gear I’m using when making my videos. I’m part of Amazon Services LLC Associates Program which means that I will get a small commission if you purchase anything via my links. Any commission I’ll be getting will go straight back into buying new gear for my future videos, so any sort of support is highly appreciated!
MAIN GEAR:
Camera: Canon EOS R: https://amzn.to/2CAybbh
Lens: Canon RF 24-70mm F2.8 L IS USM: https://amzn.to/34RDy1V
Insta360 One X: https://amzn.to/2KfwBjd
Tripod: JOBY GorillaPod 5K Kit: https://amzn.to/36VxMhy
Microphone: RØDE VideoMic Pro+: https://amzn.to/2Tg9mbx
Drone: DJI Mavic 2 Zoom: https://amzn.to/2Sak4CX
Mavic 2 Fly More Kit: https://amzn.to/2TlpLLT
Gimbal: DJI Ronin-S Handheld 3-Axis Gimbal:https://amzn.to/2NG4L20
2x SanDisk Extreme Pro Memory Card (128GB): https://amzn.to/2Oi0CQX
Bag: Lowepro ProTactic BP 450 AW II:https://amzn.to/2NDbCsN
BACK-UP GEAR:
Camera: Canon M50: https://amzn.to/2Tf998r
Lens: Canon EF 24mm f/1.4L II USM: https://amzn.to/2O0a62Y
Lens: Canon EF 50mm f/1.8 STM https://amzn.to/2O5DJA0
Lens: Canon EF-S 10-18mm f/4.5-5.6 IS STM: https://amzn.to/2X88oR7
Canon EOS M Mount Adapter: https://amzn.to/2O1jH9I
Canon EF-EOS R Mount Adapter: https://amzn.to/2NDak0V
JOBY Gorillapod 3K: https://amzn.to/2S3GQfR
OTHER GEAR:
ADATA SD600Q SSD (240GB): https://amzn.to/2Wp28Tf
ADATA D8000L LED Power Bank: https://amzn.to/34MrlLY
Transcend ESD240C Portable SSD (480GB): https://amzn.to/2X5L7xW
Transcend ESD350C Portable SSD (480GB): https://amzn.to/32LBzeg
Transcend StoreJet 25MC HDD (1TB): https://amzn.to/2KekmUd
Transcend 128GB microSD: https://amzn.to/2tCkOmw
MacBook Pro 15” - TouchBar: https://amzn.to/2p7rSsy
Asus VP28UQG 28" 4K/UHD monitor: https://amzn.to/2CE5eeI
Special thanks to STC for helping me out with filters:
STC website:https://stcoptics.com/en/
STC Facebook:https://www.facebook.com/STCOptics/
CPL:https://stcoptics.com/en/shvcpl/
VND:https://stcoptics.com/en/vnd/
ICELAVA:https://stcoptics.com/en/icelava/
E-shop:https://shop.stcoptics.com/
![post-title](https://i.ytimg.com/vi/3ywbZeQuJM4/hqdefault.jpg)