📜 [專欄新文章] 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.
👏 歡迎轉載分享鼓掌
同時也有1部Youtube影片,追蹤數超過5,140的網紅寶博士,也在其Youtube影片中提到,阿亂王新仁 - 臺灣首個登上 ArtBlocks 拍賣 Good Vibrations 台灣時間 8/22(日)凌晨 0 點 開賣(也就是週六深夜) https://artblocks.io/project/140 起價: 1.559 ETH (荷蘭拍賣) 價格曲線:每十分鐘降價一次,依序為 1.5...
generative art nft 在 寶博士 Youtube 的精選貼文
阿亂王新仁 - 臺灣首個登上 ArtBlocks 拍賣
Good Vibrations
台灣時間 8/22(日)凌晨 0 點 開賣(也就是週六深夜)
https://artblocks.io/project/140
起價: 1.559 ETH (荷蘭拍賣)
價格曲線:每十分鐘降價一次,依序為 1.559Ξ, 1.259Ξ, 0.959Ξ, 0.659Ξ, 0.359Ξ, 0.159Ξ
限量 1024 張,售完即止
科普一下,ArtBlocks 是現在最熱門也最有價值的 NFT 系列藏品,由 ArtBlocks 創辦人 Jeff Davis 為首的多位知名藝術家作審查小組,嚴選全球各地藝術家上架演算生成藝術作品(Generative Art),上線半年目前是整個 NFT 市場排名前五大,總成交量 2 億 3 千萬美金,約新台幣 60 億元,總計 9 萬顆以太幣;單一作品最高成交價為 Chromie Squiggle 編號 #3784 以 244 萬美金(750 ETH)售出,原始擁有者是個名為「0x79」的藏家,其初始購入價格僅 25 美元!
ArtBlocks 作品最好玩的地方就是它像個由演算法藝術家打造出來的,一個又一個的隨機藝術盲盒,你可以用相對低的價格,購買一個作品,透過公正公平公開的演算法,在天時地利人和下,創造出萬中選一的絕美作品(連藝術家本人都無法知道該作品可能長什麼樣!)這次阿亂的作品若最後在 0.159 ETH 完售,那麼相當於你有可能用新台幣 1 萬 5 千元的價格,買到台灣一級數位藝術家的首批以太坊 NFT 作品,也是台灣首位藝術家登上 ArtBlocks 的作品,有其歷史意義,甚至有可能在未來以更高的價位販售給廣大的 ArtBlocks 作品全球藏家。如果你還在觀望 NFT 的,這是個好的機會,一邊可以學習如何購買,一邊可以支持台灣藝術家。
即時查詢 ArtBlocks 合約交易狀況 https://etherscan.io/address/0x47e312d99c09ce61a866c83cbbbbed5a4b9d33e7
ArtBlocks Curated 底價即時查詢 https://opensea.io/collection/art-blocks?search[sortAscending]=true&search[sortBy]=PRICE&search[toggles][0]=BUY_NOW
generative art nft 在 Generative Art NFTs Fans Must Know About - YouTube 的必吃
Generative art NFTs don't need a use case, roadmap, airdrops, or even a community. They're fun to collect and are an increasingly popular ... ... <看更多>