X2Y2: 必須修改的中心化NFT掛單獎勵機制
By ChainNode·

原文釋出在 https://github.com/33357/smartcontract-apps這是一個面向中文社羣,分析市面上智慧合約應用的架構與實現的倉庫。歡迎關注開源知識專案!
x2y2: 必須修改的中心化nft掛單獎勵機制
x2y2 的爆發與沉沒
2022年2月15日,x2y2 正式開啟空投、nft掛單獎勵和質押挖礦,隨後的十幾天內其幣價一瀉千里。最低到0.25 u/x2y2,相比最高點跌了90%以上。直到官方宣佈修改nft掛單獎勵,大幅減少產出,幣價才重新穩定在0.35 u/x2y2左右。
中心化 nft 掛單獎勵是不可持續的
x2y2 幣價的下跌是多重因素的共同作用,其相比 opensea 新創的交易手續費返還 x2y2 持有者和 nft 掛單獎勵是具有相當程度先進性的。但是我認為:中心化、不透明、無法預測的 nft 掛單獎勵機制在區塊鏈乃至整個 web3 世界都是不可持續的,主要問題有以下幾點:
nft掛單獎勵演算法會被隨意修改,使用者無法做長期決策(之前團隊為了穩定幣價修改演算法的決策值得肯定,但嚴重削弱了掛單使用者對專案的信任)。
使用者無法對掛單獎勵進行預測,因此無法對是否掛單做理性決策(具體來說就是無法在掛單之前對掛單獎勵做預測,這會導致很多人要麼抱著賭一把的心態來掛單,要麼抱著不信任的態度走人)。
團隊有持幣跑路的風險(區塊鏈世界裡程式碼才是法律,甚至高於法律,達到了物理規則的高度。團隊跑路的成本和收益相比不值一提,因此永遠不要高估人性)。
之前我在專案方群裡討論這個問題時,有很多人認為 nft 掛單獎勵對 nft 掛單者是一種 “恩惠”,而不是一種商業模式:你在 opensea 掛單啥都沒有,來這裡還有可能獲得獎勵,因此中心化的 nft 掛單獎勵機制的這些弊病是沒有問題的。我覺得如果真是這樣,那麼這個專案就不足以對 opensea 在商業模式上進行創新,而大多數使用者沒有足夠多確定的利益是懶得去換平臺的。
如何設計去中心化的 nft 掛單獎勵
這是一個區塊鏈技術方向的社群,因此討論不會僅涉及於提出問題而沒有解決方案。在去中心化的代幣獎勵方面,早有前人為我們指明瞭一條道路,那就是目前普遍用於代幣質押的挖礦獎勵演算法(篇幅所限,我就不去解釋這個演算法了)。我們只需要知道,這個演算法實現了隨時間和質押代幣數量成正比的獎勵。在個條件下,時間是不需要改變的,而 nft 不是代幣。因此只要實現從 nft 到代幣的轉換,就完全可以實現去中心化的 nft 掛單獎勵。
這是一個簡單的演算法,使用掛單價格作為唯一引數,實現從 nft 到代幣的轉換
// 最大價格
uint256 constant max_price = 10**26;
// 最小价格
uint256 constant min_price = 10**10;
// 預估分數
function predictpoint(uint256 price) public pure override returns (uint256) {
// 價格不能超過範圍
require(price <= max_price && price >= min_price, "nft: price is too high or too low");
// 計算分數
return (max_price * min_price) / price;
}
在這裡,我把從 nft 到代幣的轉換過程抽象為給每個 nft 打分的過程。nft 作為非同質化代幣,想要準確地給每個 nft 打分,只有從掛單價格入手:價格越高的 nft 其分數越低。
要點1: (10**26 * 10**10) / 10**18 = 10**18
要點2: (10**26 * 10**10) / (2 * 10**18) = 10**18 / 2
要點3: (10**26 * 10**10) / (3 * 10**18) = 10**18 / 3
第4點: (10**26 * 10**10) / (4 * 10**18) = 10**18 / 4
第5點: (10**26 * 10**10) / (5 * 10**18) = 10**18 / 5
第6點: (10**26 * 10**10) / (6 * 10**18) = 10**18 / 6
點7: (10**26 * 10**10) / (7 * 10**18) = 10**18 / 7
第8點: (10**26 * 10**10) / (8 * 10**18) = 10**18 / 8
第 9 點: (10**26 * 10**10) / (9 * 10**18) = 10**18 / 9
第 10 點: (10**26 * 10**10) / (10 * 10**18) = 10**18 / 10
令牌1: 2520/7381
令牌2: 1260/7381
令牌3: 840/7381
令牌4: 630/7381
令牌5: 504/7381
令牌6: 420/7381
令牌7: 360/7381
令牌8: 315/7381
令牌9: 280/7381
令牌10: 252/7381
在這裡我們可以演算一下:如果一共有10個 nft,其價格分別是 1、2、3、4、5、6、7、8、9、10 eth,那麼打分的情況會是什麼?
point 總數為 10**18 * (7381/2520),每個 nft 代幣可以分到獎勵的份額如下:
可以看到,隨著 nft 掛單價格的升高,其分數會下降,獎勵份額也會下降。
一般而言nft的掛單價格不會如此平均,一般會呈現中間多,兩頭少的“橄欖球”形狀,這意味著掛單價格低的使用者會擁有比這個演算更多的獎勵。
對於不同型別的nft,需要給予不同的掛單獎勵。
由於不同型別的 nft 之間價格差異巨大,因此不可能對所有種類的 nft 給予相同的獎勵池。實際上每種 nft 的獎勵池額度需要單獨計算,對此又可以衍生出好幾種不同的演算法:
使用中心化的演算法
實際上目前 x2y2 就是使用的這種演算法,其效果只能說是差強人意。
使用去中心化的演算法
可以使用每種 nft 的交易手續費作為引數,對獎勵額度在鏈上進行動態調整。我預計是可行的,但是在沒有手續費時,專案如何啟動是一個問題。
使用 dao 進行管理
對上述的方案進行中和,使用 dao 讓社羣成員投票決定給某種 nft 多少獎勵池。這種方案依賴良好的社群使用者。
對掛單獎勵進行預測
經典的挖礦獎勵演算法已經實現了對獎勵的預測,還可以計算 apy。由於 nft 難確定標準的市場價格,因此我估計只能在使用者輸入掛單價格後,預測每天獲得多少獎勵。
對掛買單進行獎勵
實際上對上述的掛單 nft 獎勵演算法反過來,就可以對掛 nft 買單進行獎勵。也許可以藉此做出一個 nft 的公允市場價。
目前的問題
這套方案裡掛單需要上鍊,改價格也需要上鍊,因此和 opensea 目前的模式並不完全相容。
掛單需要將 nft 的所有權轉移到合約,因此不能同時掛在 opensea 上。
總結
x2y2 在 opensea 的基礎上進行了創新,卻無法給 opensea 使用者足夠的利益讓他們改換門庭。但無論如何,opensea 再不改革把自己的利益分享出來,下個四年就看不到它的身影了。
目前實現的程式碼,有很多問題,並不完善
//spdx-license-identifier: unlicense
pragma solidity ^ 0.8 .12 ;
匯入 “./interfaces/inft.sol”;
匯入 “@openzeppelin/contracts/token/erc20/ierc20.sol”;
匯入 “@openzeppelin/contracts/token/erc20/utils/safeerc20.sol”;
匯入 “@openzeppelin/contracts/token/erc721/ierc721.sol”;
匯入 “@openzeppelin/contracts/security/reentrancyguard.sol”;
合約 nft 是 inft,reentrancyguard {
使用 safeerc20用於ierc20;
對映(地址=> uint256)blockmint;
=> uint256) 總點;
對映(地址=> uint256)perpointminted;
對映(地址=> uint256)lastupdateblock;
對映(地址=>對映(uint256 => uint256))令牌點;
對映(地址=>對映(uint256 =>地址))tokenowner;
對映(地址=>對映(uint256 => uint256))tokenprice;
對映(地址=>對映(uint256 =>uint256)) 代幣鑄造;
對映(地址=>對映(uint256 => uint256))tokenperpointpaid;
uint256 常量 max_price = 10 ** 26 ;
uint256 常量 min_price = 10 ** 10;
uint256 費用 = 200 ;
地址費用到;
建構函式() {}
/* ================ util functions ================*/
函式 safetransfereth (地址到, uint256 value ) internal {
(bool success, ) = to.call{ value : value}(新位元組(0));
require (success, "nft: eth transfer failed" );
}
function perpointmint ( address nft ) internal view returns ( uint256 ) {
if (totalpoint[nft] != 0 ) {
return perpointminted[nft] + ((block.number - lastupdateblock[nft]) * blockmint[nft]) / totalpoint [nft];
} else {
返回perpointminted[nft];#資訊
免責聲明:
- 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
- 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
- 鏈報僅提供相關項目信息,不構成任何投資建議。
推荐阅读