📜 [專欄新文章] 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.
👏 歡迎轉載分享鼓掌
同時也有478部Youtube影片,追蹤數超過20萬的網紅なつばやし natsubayashi,也在其Youtube影片中提到,KYSERアコースティックギター用カポ https://amzn.to/38XoV1g JIM DUNLOP 83CDN トリガーカポ アコースティック ニッケル https://amzn.to/39aijNb G7TH PERFORMANCE 3 ART CAPO 6弦アコ-スティック/エレクトリ...
「performance art」的推薦目錄:
- 關於performance art 在 Taipei Ethereum Meetup Facebook 的最佳解答
- 關於performance art 在 StoryTeller 說故事 Facebook 的最讚貼文
- 關於performance art 在 Facebook 的最佳貼文
- 關於performance art 在 なつばやし natsubayashi Youtube 的精選貼文
- 關於performance art 在 なつばやし natsubayashi Youtube 的最讚貼文
- 關於performance art 在 なつばやし natsubayashi Youtube 的最讚貼文
- 關於performance art 在 An Introduction to Performance Art | TateShots - YouTube 的評價
- 關於performance art 在 【藝術英文】你吃香蕉了沒?(performance art VS... 的評價
performance art 在 StoryTeller 說故事 Facebook 的最讚貼文
貧窮說 EP2:【急急子:保安與蕃茄】
👉 重温上回故事【 #StoryTeller貧窮說林家謙說故事 】
你知道嗎?現今的基層家庭小朋友,都有偏食問題。背後原因並不是單單因為小朋友的偏執,亦有可能是家長不懂得怎樣配搭出營養均衡的菜式。有些小朋友只吃雞翼和雞蛋,還有些小朋友只吃豉油撈飯⋯⋯久而久之,小朋友容易變得太瘦或太肥。
今次故事的主角,是一位爸爸和他只肯食蕃茄的兒子。今晚,我們邀請了關心社會的叱咤903 DJ急急子來為大家說故事,就讓我們隨著急急子的聲音,聽聽這位爸爸到底有甚麼辦法,讓兒子嘗試蕃茄以外的食物吧。
Storyteller: Oxfam Hong Kong 樂施會
Voice performance:急急Touch
Art direction and creative: StoryTeller 說故事
Illustration & Animation:Sasha Lind 蝦頭 @SashaLind
Audio editing:Melody
Acknowledgement:民社服務中心 People Service Centre
〖故事改編自真人真事〗
「貧窮有話説,你願意聽嗎?」
10月17日是國際滅貧日,樂施會希望藉着這別具意義的日子,喚起公眾對貧窮的關注,加入扶貧的行列。樂施會與「StoryTeller說故事」合作,製作4個與貧窮有關的故事,邀請唱作音樂人林家謙、關心社會的叱咤903 DJ急急子、關注氣候變化的唱作歌手Manson張進翹,以及聲音甜美的女歌手Cloud雲浩影,用聲音演繹這4個發生在不同地方、不同背景的貧窮故事,希望讓公眾對「貧窮」有多一份新的理解。
了解更多:https://bit.ly/OxfamRethinkPoverty
#貧窮說 #RethinkPoverty #各家自訴貧窮說 #樂施會 #OxfamHongKong
#EveryoneisStoryteller #急急子 #StoryTeller貧窮說急急子說故事
performance art 在 Facebook 的最佳貼文
謝謝邀請!💕
今晚展開了「往大馬士革之路」🙏🏻
感謝毛sir帶來這個很有深度的劇作
特別喜歡美儀姐的點睛演出🤩
🎉喜訊🎉聞說會加場
未能購票嘅朋友,
密切留意 @hkrep 嘅公布
#art #drama #performance #actor #actress #theatre #show #hk #hkrep #hongkong #performer #director #artdirector
performance art 在 なつばやし natsubayashi Youtube 的精選貼文
KYSERアコースティックギター用カポ
https://amzn.to/38XoV1g
JIM DUNLOP 83CDN トリガーカポ アコースティック ニッケル
https://amzn.to/39aijNb
G7TH PERFORMANCE 3 ART CAPO 6弦アコ-スティック/エレクトリック用
https://amzn.to/3hgDwte
SHUBB シャブ カポタスト アコースティックギター用 ニッケル C-1
https://amzn.to/2XbmtBU
KORG(コルグ) ギター/ベース用 クリップチューナー PitchCrow-G AW-4G
https://amzn.to/3hkS4Yz
著書「なつばやしのギター初心者お悩み相談室」
https://amzn.to/3dKi6DO
(amazonアソシエイト)
なつばやしギター小学校webサイト
https://knatsubrand81.com
なつばやしくんオリジナルグッズ
https://natsubayashi.booth.pm
なつばやしくんLINEスタンプ
https://store.line.me/stickershop/author/110555/ja
なつばやしメンバーシップ
https://www.youtube.com/channel/UCu0Wgd4wOSGBiDHL8WJ9UWw/join
夏林一彰(なつばやしかずあき)プロフィール
1975年生まれ。岩手県在住。28歳から独学でギターを始める。
YouTube NextUpプログラム2012年選抜メンバー。
夏林一彰(なつばやし)Twitter
https://twitter.com/knatsubayashi
夏林サブチャンネル 夏林一彰
https://www.youtube.com/channel/UCtUNXlZfdTMq3KBw8WFtxQA
performance art 在 なつばやし natsubayashi Youtube 的最讚貼文
KYSERアコースティックギター用カポ
https://amzn.to/38XoV1g
JIM DUNLOP 83CDN トリガーカポ アコースティック ニッケル
https://amzn.to/39aijNb
G7TH PERFORMANCE 3 ART CAPO 6弦アコ-スティック/エレクトリック用
https://amzn.to/3hgDwte
SHUBB シャブ カポタスト アコースティックギター用 ニッケル C-1
https://amzn.to/2XbmtBU
KORG(コルグ) ギター/ベース用 クリップチューナー PitchCrow-G AW-4G
https://amzn.to/3hkS4Yz
著書「なつばやしのギター初心者お悩み相談室」
https://amzn.to/3dKi6DO
(amazonアソシエイト)
なつばやしギター小学校webサイト
https://knatsubrand81.com
なつばやしくんオリジナルグッズ
https://natsubayashi.booth.pm
なつばやしくんLINEスタンプ
https://store.line.me/stickershop/author/110555/ja
なつばやしメンバーシップ
https://www.youtube.com/channel/UCu0Wgd4wOSGBiDHL8WJ9UWw/join
夏林一彰(なつばやしかずあき)プロフィール
1975年生まれ。岩手県在住。28歳から独学でギターを始める。
YouTube NextUpプログラム2012年選抜メンバー。
夏林一彰(なつばやし)Twitter
https://twitter.com/knatsubayashi
夏林サブチャンネル 夏林一彰
https://www.youtube.com/channel/UCtUNXlZfdTMq3KBw8WFtxQA
performance art 在 なつばやし natsubayashi Youtube 的最讚貼文
KYSERアコースティックギター用カポ
https://amzn.to/38XoV1g
JIM DUNLOP 83CDN トリガーカポ アコースティック ニッケル
https://amzn.to/39aijNb
G7TH PERFORMANCE 3 ART CAPO 6弦アコ-スティック/エレクトリック用
https://amzn.to/3hgDwte
SHUBB シャブ カポタスト アコースティックギター用 ニッケル C-1
https://amzn.to/2XbmtBU
KORG(コルグ) ギター/ベース用 クリップチューナー PitchCrow-G AW-4G
https://amzn.to/3hkS4Yz
(Amazonアソシエイトリンク)
なつばやしギター小学校webサイト
https://knatsubrand81.com
なつばやしくんオリジナルグッズ
https://natsubayashi.booth.pm
なつばやしくんLINEスタンプ
https://store.line.me/stickershop/author/110555/ja
なつばやしメンバーシップ
https://www.youtube.com/channel/UCu0Wgd4wOSGBiDHL8WJ9UWw/join
夏林一彰(なつばやしかずあき)プロフィール
1975年生まれ。岩手県在住。28歳から独学でギターを始める。
YouTube NextUpプログラム2012年選抜メンバー。
夏林一彰(なつばやし)Twitter
https://twitter.com/knatsubayashi
夏林サブチャンネル 夏林一彰
https://www.youtube.com/channel/UCtUNXlZfdTMq3KBw8WFtxQA
performance art 在 【藝術英文】你吃香蕉了沒?(performance art VS... 的推薦與評價
【藝術英文】你吃香蕉了沒?(performance art VS performing arts) . 首先要理清兩個長得很像、容易混淆的英文單詞: performance art 是「行為藝術」 ... ... <看更多>
performance art 在 An Introduction to Performance Art | TateShots - YouTube 的推薦與評價
Performance art relates to artworks that are created through actions performed by the artist or other participants, which may be live or ... ... <看更多>