📜 [專欄新文章] Gas Efficient Card Drawing in Solidity
✍️ Ping Chen
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
Assign random numbers as the index of newly minted NFTs
Scenario
The fun of generative art NFT projects depends on randomness. The industry standard is “blind box”, where both the images’ serial number and the NFTs’ index are predetermined but will be shifted randomly when the selling period ends. (They call it “reveal”) This approach effectively solves the randomness issue. However, it also requires buyers to wait until the campaign terminates. What if buyers want to know the exact card right away? We’ll need a reliable onchain card drawing solution.
The creator of Astrogator🐊 isn’t a fan of blind boxes; instead, it thinks unpacking cards right after purchase is more interesting.
Spec
When initializing this NFT contract, the creator will determine the total supply of it. And there will be an iterable function that is randomly picking a number from the remaining pool. The number must be in range and must not collide with any existing ones.
Our top priority is accessibility/gas efficiency. Given that gas cost on Ethereum is damn high nowadays, we need an elegant algorithm to control gas expanse at an acceptable range.
Achieving robust randomness isn’t the primary goal here. We assume there’s no strong financial incentive to cheat, so the RNG isn’t specified. Implementers can bring their own source of randomness that they think is good enough.
Implementation
Overview
The implementation is pretty short and straightforward. Imagine there’s an array that contains all remaining(unsold) cards. When drawIndex() is called, it generates a (uniform) random seed to draw a card from the array, shortens the array, and returns the selected card.
Algorithm
Drawing X cards from a deck with the same X amount of cards is equal to shuffling the deck and dealing them sequentially. It’s not a surprise that our algorithm is similar to random shuffling, and the only difference is turning that classic algo into an interactive version.
A typical random shuffle looks like this: for an array with N elements, you randomly pick a number i in (0,N), swap array[0] and array[i], then choose another number i in (1,N), swap array[1] and array[i], and so on. Eventually, you’ll get a mathematically random array in O(N) time.
So, the concept of our random card dealing is the same. When a user mints a new card, the smart contract picks a number in the array as NFT index, then grabs a number from the tail to fill the vacancy, in order to keep the array continuous.
Tweak
Furthermore, as long as the space of the NFT index is known, we don’t need to declare/initialize an array(which is super gas-intensive). Instead, assume there’s such an array that the n-th element is n, we don’t actually initialize it (so it is an array only contains “0”) until the rule is broken.
For the convenience of explanation, let’s call that mapping cache. If cache[i] is empty, it should be interpreted as i instead of 0. On the other hand, when a number is chosen and used, we’ll need to fill it up with another unused number. An intuitive method is to pick a number from the end of the array, since the length of the array is going to decrease by 1.
By doing so, the gas cost in the worst-case scenario is bound to be constant.
Performance and limitation
Comparing with the normal ascending index NFT minting, our random NFT implementation requires two extra SSTORE and one extra SLOAD, which cost 12600 ~ 27600 (5000+20000+2600) excess gas per token minted.
Theoretically, any instantly generated onchain random number is vulnerable. We can restrict contract interaction to mitigate risk. The mitigation is far from perfect, but it is the tradeoff that we have to accept.
ping.eth
Gas Efficient Card Drawing in Solidity was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
同時也有6部Youtube影片,追蹤數超過379萬的網紅Jannine Weigel,也在其Youtube影片中提到,อยากเจาะสนตะพายมานานละแต่ไม่กล้าเจาะสักที...คิดๆไป ชีวิตคนเรามันก็สั้นเน้อะ เลยคิดว่าลองดูไม่ชอบก็เอาออกแค่นั้น! ก็ไม่ค่อยชอบเท่าไหร่หรอก แต่ถ่ายรูปเย...
worst-case 在 เกี้ยแซ่บบ Facebook 的最佳貼文
Worst case ถ้าช่อง เกี้ยแซ่บบ มันไม่กลับมาแล้ว เราจะทำยังไงต่อไปดี!? 😳😳
.
จากที่โดนแฮกเมื่อศุกร์ค่ำๆ ที่ผ่านมา จนเมื่อเช้านี้เข้าไปดู เหมือนช่องจะปลิวไปเป็นที่เรียบร้อยแล้ว หาช่องไม่เจอแล้วจ้าาา!! 😭 แต่ทางกูเกิ้ล ก็แจ้งกลับมาแล้วแหละ ว่ากำลังแก้ไขให้อยู่นะ ให้เราใจเย็นๆ 😅
.
ตอนนี้ยังคิดไม่ออกจิงๆ ว่าถ้ามันไม่กลับมาอีกแล้วจริงๆ เราจะกลับมาทำช่องใหม่ดีไหม หรือจะเลิก หรือหยุดทำไปเลย 🙄
.
บอกเลยว่าเมื่อเช้านอยมากนะ น้ำตาไหลเลยตอนที่รู้ว่าช่องหายไปแล้ว มันก็ต้องมีท้อแหละ เสียดายมากนะ เพราะอยู่กับมันมา 3 ปีกว่าๆ มันเป็นส่วนนึงในชีวิตไปแล้ว
.
แต่สุดท้าย ถ้ามันไม่ใช่ของเรา มันก็คือไม่ใช่ของเรา มันเป็นแค่หัวโขนที่ทำให้คนรู้จักเรามากขึ้นแค่นั้นเอง ท้ายที่สุดก็แค่พี่เกี้ยจะกลับมาเป็นคนที่ไม่มีใครจำได้ เป็นคนทั่วๆไป ใช้ชีวิตปกติ เรียบง่าย
.
นี่คิดไปไกลมากละนะ 😅 เพราะถึงจะพยายามไม่คิด ไม่เครียด แต่มันก็ต้องมีบ้างแหละ
.
แฮกเกอร์แมร่งโคตรใจร้าย เราตั้งใจทำเพื่อช่วยร้านค้าจริงๆ ยิ่งสถานการณ์โควิด อยากแค่เป็นกระบอกเสียง ช่วยร้านค้าเท่าที่เราจะทำได้ แต่ก็ไม่รู้ว่าจะมีโอกาสได้ช่วยใครได้อีกไหม เฮ้อออ!! คงต้องปลงสินะ
.
ก็ยังต้องรอความช่วยเหลือจากทางกูเกิ้ลต่อไป หวังว่ามันจะกลับมานะ เราจะรอคอยแบบมีความหวัง แต่เราต้องไม่คาดหวังเนอะ
worst-case 在 Dr. Kayla Teh Facebook 的最佳解答
Fiber-reinforced Bridge…do you know what that is?🤔
When you lost a tooth or teeth, you have a few options to replace it: denture, bridge, implant, braces or more.
She first came in with loose denture replacing her two front teeth. Denture is a good replacement option for missing teeth but with time, it tend to become loosen due to bone resorption (“bone thinning”). Loose denture can be troublesome as it falls out easily (no one wants their teeth falling out during a presentation!😱) and food often get stuck underneath it.
If you ask me, implant is the best option to replace this patient’s missing teeth. However, implants (and not forgetting bone graft) placement can be costly and she is not financially ready for it. Having the option for a new denture or a fiber-reinforced bridge, she decided to choose the latter whilst preparing for her implant budget.
The challenge in this case is the total buildup of the tooth with composite, estimating it’s size/shape/shade and not forgetting occlusion. This is a non-prep case as the patient is biting rather incisally on the anteriors while having good posterior occlusion(thus made her a good candidate for this long span FRB case).
Most of it has to be done chair-side, thus a lot of clinical time has been spent. Note that the 11,21 are shortened as well although I would LOVE to give her a perfect smile arch, due to concerns of her anterior guidance.
Patient was super happy she has semi-permanent teeth inside her mouth and don’t have to worry about her denture falling out anymore. (We both still look forward to the day implants can be placed tho!🙈)
Case selection is important in FRB treatment. It is not for patients who want an easy way out, but for patients who clearly understand ALL the pros and cons of their treatment options and are willing to accept the worst-case scenario.
Okay that’s all, I know I talk a lot but I just wanted to share some of the stuff I’ve learned through this case. 😆 Have a great day y’all!
worst-case 在 Jannine Weigel Youtube 的最讚貼文
อยากเจาะสนตะพายมานานละแต่ไม่กล้าเจาะสักที...คิดๆไป ชีวิตคนเรามันก็สั้นเน้อะ เลยคิดว่าลองดูไม่ชอบก็เอาออกแค่นั้น! ก็ไม่ค่อยชอบเท่าไหร่หรอก แต่ถ่ายรูปเยอะมากกก555555?
I’ve been wanting to get a septum piercing for the longest time...and since I realized that life is so short, I thought I might as well do it while I’m still young & can pull it off lol.
“worst case is it looks bad and I’ll just take it off”.
No regrets tho?
![post-title](https://i.ytimg.com/vi/iyXaNBZWFBk/hqdefault.jpg)
worst-case 在 Fun hunting Youtube 的精選貼文
Bills' worst case = Patriots' best case = 9 win: That's the story! | Nick Wright
![post-title](https://i.ytimg.com/vi/LZ-WNTHEeEg/hqdefault.jpg)
worst-case 在 Vince ヴィンス Youtube 的最佳貼文
Mein(en) Traum Leben - Realtalk
Hier findet Ihr mich auf Social Media:
Instagram: https://www.instagram.com/vincenthansing
Twitter: https://twitter.com/VincentHansing
Discord: https://discord.gg/nzWVRuG
Hauke: https://www.youtube.com/channel/UCiVWZEm9WglksVbGAtcW1Ew
Mein Equipment
Kamera: http://amzn.to/2B1CoBI
Micro: http://amzn.to/2B1Hy0h
Stativ: http://amzn.to/2DesvGM
Schnittprogramm: http://amzn.to/2mvbpJB
Alle Amazon-Links sind Ref-Links! Solltet ihr mit diesen Links auf Amazon etwas kaufen, unterstützt ihr mich ohne mehr zu bezahlen :)
![post-title](https://i.ytimg.com/vi/qAKX_eFPylE/hqdefault.jpg)