Skip to content

Commit

Permalink
update public data mine
Browse files Browse the repository at this point in the history
  • Loading branch information
waterflier committed Jun 1, 2024
1 parent d32a789 commit 3b4d29e
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 14 deletions.
70 changes: 70 additions & 0 deletions contracts/public_data_storage.sol
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ contract PublicDataStorage is Initializable, UUPSUpgradeable, OwnableUpgradeable
uint256 maxDeposit;
uint256 dataBalance;
uint64 depositRatio;

mapping(address => uint256) show_records;//miner address - > last show time
//uint64 point;
}

Expand Down Expand Up @@ -78,13 +80,15 @@ contract PublicDataStorage is Initializable, UUPSUpgradeable, OwnableUpgradeable
address[] lastShowers;
uint64 score;// score = 0表示已经提现过了
uint8 showerIndex;
uint64 showCount;//在这个周期里的总show次数,
}

struct CycleInfo {
mapping(bytes32 => CycleDataInfo) dataInfos;

SortedScoreList.List scoreList;
uint256 totalAward; // 记录这个cycle的总奖励
uint256 totalShowPower;//记录这个cycle的总算力
}

struct CycleOutputInfo {
Expand Down Expand Up @@ -449,6 +453,37 @@ contract PublicDataStorage is Initializable, UUPSUpgradeable, OwnableUpgradeable
}

}
function _getGWTDifficultRatio() private view returns(uint256) {
//这个函数本质上,返回的是周利率
//1)根据总算力计算基础难度值,算力每次翻倍,基础难度值都会下降 从<= 1PB 开始, 2PB,4PB,8PB,16PB,32PB,64PB,128PB,256PB,512PB .. 都会调整基础难度值
// 倍率结果为8x - 1x,当总算力是1PB(GWT)时, 倍率为8x,随后算力每增加一倍,倍率下降10%。 倍率 = 0.9^(log2(总算力/1PB)),每次总算力翻倍,倍率为上一档倍率的90%
// 约21次难度调整后会变成1x,此时系统容量已经是 1PB * 2^21 = 2EB
//2)根据算力增速x计算基准GWT利率(增发速度),y = f(x),x的值域是从[0,正无穷] y的取值范围最小值是 0.2%, 最大值是 2%

//根据上述规则,一周的GWT挖矿比例最大,是抵押总数的 16%(周回报16%)。即矿工在公共数据挖矿中质押了100个GWT,在1周后,能挖出16个GWT,接近6.25周回本
//如果早期算力总量低,但没什么人挖,则周回报为 1.6%(周回报1.6%),即矿工在公共数据挖矿中质押了100个GWT,在1周后,能挖出1.6个GWT,接近62.5周回本

uint256 lastCyclePower = _cycleInfos[_currectCycle - 2].totalShowPower;
uint256 curCyclePower = _cycleInfos[_currectCycle - 1].totalShowPower;
uint256 base_r = 0.002; //基础利率
if(curCyclePower == 0) {
base_r = 0.01;
} else {
//给我一个数学函数,满足:y = f(x),x的含义是增长率的值域是从[0,正无穷] y的取值范围最小值是 0.2%, 最大值是 2%。 我希望在x在200%(2倍前),y能快速的增长到1%
if(curCyclePower > lastCyclePower) {
base_r = 0.002 + 0.008 * (curCyclePower - lastCyclePower) / lastCyclePower;
if(base_r > 0.02) {
base_r = 0.02;
}
}
}
// 8 * 0.9^(log2((curCyclePower / 1PB)));
uint256 ratio = 8 * 0.9^(log2((curCyclePower / 1024*1024)));
if(ratio < 1) {
ratio = 1;
}
return ratio * base_r;
}

function _onProofSuccess(DataProof storage proof,PublicData storage publicDataInfo,bytes32 dataMixedHash) private {
uint256 reward = publicDataInfo.dataBalance / 10;
Expand Down Expand Up @@ -482,6 +517,41 @@ contract PublicDataStorage is Initializable, UUPSUpgradeable, OwnableUpgradeable
}
cycleInfo.scoreList.updateScore(dataMixedHash, dataInfo.score);
}

//获得gwt 挖矿奖励
lastRecordShowTime = publicDataInfo.show_records[msg.sender];
if(lastRecordShowTime ==0) {
publicDataInfo.show_records[msg.sender] = block.timestamp;
} else {
if(block.timestamp - lastRecordShowTime > 1 weeks) {
//获得有效算力!
// reward = 文件大小* T * 存储质量比率(含质押率) * 公共数据挖矿难度比
// T = 当前时间 - 上次show时间,T必须大于1周,最长为4周
publicDataInfo.show_records[msg.sender] = block.timestamp;
uint32 storageWeeks = (block.timestamp - lastRecordShowTime) / 1 weeks;
if(storageWeeks > 4) {
storageWeeks = 4;
}
uint256 size = PublicDataProof.lengthFromMixedHash(dataMixedHash) >> 30;
if (size == 0) {
// 1GB以下算1G
return 1;
}

uint256 storagePower = size * storageWeeks ;
//更新当前周期的总算力,公共数据的算力是私有数据的3倍
cycleInfo.totalShowPower += storagePower* 3;

//计算挖矿奖励,难度和当前算力总量,上一个周期的算力总量有关
uint256 gwtReward = storagePower * publicDataInfo.depositRatio * _getGWTDifficultRatio();

//更新奖励,80%给矿工,20%给当前数据的余额
gwtToken.mint(msg.sender, gwtReward*0.8);
//TODO:是否需要留一部分挖矿奖励给基金会?目前思考是不需要的
gwtToken.mint(this, gwtReward*0.2);
publicDataInfo.dataBalance += gwtReward*0.2;
}
}
}

function getDataProof(bytes32 dataMixedHash, uint256 nonce_blocks) public view returns(DataProof memory) {
Expand Down
28 changes: 28 additions & 0 deletions doc/DMC20 经济模型.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,20 @@ def reward(self, capacity, duration,is_supply,order):

```

## 公共数据存储的算力奖励
1. 每次成功Public Data Show都能获得算力奖励,奖励的一部分给到矿工,一部分打入公共数据的余额
2. 每次Show都会更新这一周期内公共数据的总Show次数,并根据Show次数决定挖矿奖励系数(超过5次后,Show奖励会减少)
奖励 = 时长(最长为2周)* 公共数据大小 * 公告数据挖矿基础奖励比例 *该公共数据奖励调整系数
因此,一个用户的首次SHOW不会得到GWT算力奖励

3. 每次Show后会增加本周期的总算力
4. 切换周期后,会统计本周期的算力增长率(最小0),并根据 算力增长率 与 总公共数据大小 得到公共数据系统挖矿基础奖励比率。(0.2-2.4附近)
算力增长率越大,挖矿奖励比率越高
总公共数据大小约小,挖矿奖励比率越高




## 挂单奖励

目前的供需机制并未涉及挂单奖励。因此要的到算力奖励,核心就是要成交。(哪怕自己用小号去成交)
Expand All @@ -122,6 +136,20 @@ def reward(self, capacity, duration,is_supply,order):

提现周期是指存储订单开始后的最小周期。目前定义为12周(最小周期的一半)。

## GWT模型的基本理念介绍
1)GWT的基本逻辑来源于传统的央行货币增发理论(无上限)
首先有一个合理的基础CPI设定,可以理解成存100块钱定期在银行,每年的利息就是一个合理增发量。考虑到Web3属性,我们是每半年的利息为4%,全年8%

2) 如果经济体很小,或在高速增长,那么增发率会进一步提高以增加货币供给的速度
最终世界基础利率的值,就是在年化8%的基础上,根据现在的总算力规模,和算力规模增长速度,进行修正。修正比例通常在50% - 600%,也就是说,早期的利率最高可以到年化48%

放到矿工身上,就是在挖矿的时候如果质押了1000个GWT 24周(6个月),那么得到的总算力奖励GWT大概就是 1000 * (0.04*修正比例),
但由于1000个GWT是 空间*时间*质押率算出来的,会有一个公式对这个进行修正,在我们鼓励的区间范围合内时,还有进一步膨胀的空间(鼓励大家将质押率拉到合适的值)

3)公共数据挖矿和私有数据挖矿还有一些自己的业务逻辑,来对GWT的产出效率进行修正,其根本目的是规范让矿工的行为更常规

4)DMC是每周期固定释放的,因此GWT挖的再多,一个周期能兑换的DMC也是固定的。GWT产出快时,DMC能兑换的GWT就越多

## DMC20矿工的基本策略

1. 根据自己的存储能力,决定存储的价格和质押率
Expand Down
28 changes: 14 additions & 14 deletions doc/dmc20 介绍.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@

## Token的基本概念与时间线
DMC20由一系列Token组成,充分利用了L2的技术和比特币Ordinal协议。
DMC(2.0):发行在 X Layer(由OKX构建的ETH L2)上的标准ERC20 Token,总量为7.9亿,其中50%可挖。,可以通过 X Layer的L2<->L1桥转换到ETH主链上,进而可以使用整个ETH生态。DMC2.0主合约部署在L2上,手续费使用OKB支付,比L1便宜很多。今天的DMC(1.0)将能通过中心化跨链桥转换成DMC2.0. DMC2.0的合约为Token Holder提供了更多的权益,其中最重要
GWT(Gb per Week Token) : DMC体系的存储稳定币,代表1GB数据保存1周,无发行上限。首发在 XLayer上,未来计划在所有的EVM兼容链上发行。我们会和合作伙伴一起构建大量的垮链桥,以帮助GWT在所有的链之间流通。所有的存储挖矿的核心逻辑都是质押GWT获得有效空间,保存数据提交存储证明后获得有效存储算力,根据当前链的总存储算力的增长情况的到算力奖励的GWT。GWT我们希望能有更大量的交易,其价格也应该更稳定。
DMCs:基于Ordinal 协议发行在BTC上,总量2.1亿。DMCs的目标是将更有价值的数据铭刻在BTC网络上,其经济模型独立与EVM兼容链体系。(已基本完成实现,具体实现本文未介绍)
- DMC(2.0):发行在 X Layer(由OKX构建的ETH L2)上的标准ERC20 Token,总量为10亿,其中50%可挖。,可以通过 X Layer的L2<->L1桥转换到ETH主链上,进而可以使用整个ETH生态。DMC2.0主合约部署在L2上,手续费使用OKB支付,比L1便宜很多。今天的DMC(1.0)将能通过中心化跨链桥转换成DMC2.0. DMC2.0的合约为Token Holder提供了更多的权益,其中最重要是质押DMC获得GWT分红。
- GWT(Gb per Week Token) : DMC体系的存储稳定币,代表1GB数据保存1周,无发行上限。首发在 XLayer上,未来计划在所有的EVM兼容链上发行。我们会和合作伙伴一起构建大量的垮链桥,以帮助GWT在所有的链之间流通。所有的存储挖矿的核心逻辑都是质押GWT获得有效空间,保存数据提交存储证明后获得有效存储算力,根据当前链的总存储算力的增长情况的到算力奖励的GWT。GWT我们希望能有更大量的交易,其价格也应该更稳定。
- DMCs(DMCsp):基于Ordinal 协议发行在BTC上,总量2.1亿。DMCs的目标是将更有价值的数据铭刻在BTC网络上,其经济模型独立与EVM兼容链体系。(已基本完成实现,具体实现本文未介绍)


### 时间线
第一期:在XLayer上线4个关键合约,完成DMC20的体系的框架构建。(本周)
- DMC20主合约(ERC20)
- GWT@ETH合约(ERC20)
- DMC20主合约(ERC20@XLayer)
- GWT合约(ERC20@XLayer)
- DMC<->GWT合约,又可看作DMC20的挖矿合约。这个合约里包含早期的,测试用的限量free mint,用户可以花费很少的手续费得到GWT。
- DMC分红合约,展现DMC的关键权益
- DMC分红合约。通过质押DMC可以获得DMC生态手续费收入的分红
(上述均为有限可升级合约,当关闭升级能力后,这些合约的实现都会稳定下来不可修改)

第二期:如果第一期的合约没有重大问题会部署2个重要的合约 (2周后)
Expand All @@ -32,20 +32,20 @@ DMC20体系将Token分成了两大类。一大类是算力稳定币,我们计

继承自DMC1.0的白皮书,待挖矿(待释放的)DMC20有一个确定的释放曲线:
```
从2024年X月开始一共有420个周期,每个周期大概是现实世界的1周。每21个周期进行一次难度调整。难度调整后的周期释放的Token是上一个周期的80%。总释放是5*0.79 = 3.95亿DMC
第1-21周,每周最多释放768242枚DMC。随后的第21-42周,每周最多释放768242*0.8枚DMC
从2024年X月开始一共有420个周期,每个周期大概是现实世界的1周。每21个周期进行一次难度调整。难度调整后的周期释放的Token是上一个周期的80%。总释放是=5亿DMC
第1-21周,每周最多释放480万枚DMC。随后的第21-42周,每周最多释放480万*0.8枚DMC
```
每周开始,系统都会计算一次DMC:GWT的比例。在这个周期里,任何人都可以用这个比例将GWT换成DMC,直到换完。下个周期会根据上个周期的DMC兑换情况调整比例:
```
上个周期的DMC都兑换完成了,则兑换比例提高:需要更多的GWT才能换到1个DMC
上个周期的DMC未兑换完成,则兑换比例下降:需要更少的GWT能换到1个DMC。
如果上个周期的DMC都兑换完成了,则兑换比例提高:需要更多的GWT才能换到1个DMC
如果上个周期的DMC未兑换完成,则兑换比例下降:需要更少的GWT能换到1个DMC。
兑换比例的提高和下降,不能超过20%,兑换比例的下限是210(至少需要210个GWT才能换1个DMC)
```
用户用于兑换DMC的GWT不会销毁,而是成为DMC组织的收入并进入DMC的可分红利润池
用户用于兑换DMC的GWT不会销毁,而是成为DMC组织的收入并进入DMC分红合约的利润池

### 销毁DMC20得到GWT
用户销毁1个DMC,可以得到 兑换比例*1.2个GWT。
这种机制形成了一个初看有利可图的套利盘:用户将GWT兑换成DMC,然后再销毁DMC得到GWT。这种套利操作是我刻意引导(鼓励)的早期用户行为。至少可以在挖矿未上线的情况下,用传统的DeFi流动性挖矿逻辑,能让一部分金融爱好者先互相博弈起来。
这种机制形成了一个初看有利可图的套利盘:用户将GWT兑换成DMC,然后再销毁DMC得到GWT。这种套利操作是刻意引导(鼓励)的早期用户行为。至少可以在挖矿未上线的情况下,用传统的DeFi流动性挖矿逻辑,能让一部分金融爱好者先互相博弈起来。


## 基于DMC20的分红
Expand All @@ -61,7 +61,7 @@ DMC20分红池的主要的收入来源是我们的一些重要的合约,这些
## DMC20 流动性挖矿的博弈
是否需要销毁DMC20来获得GWT?早期GWT挖矿难度低,有更多的GWT质押能更快的获得更多算力,但是早期销毁DMC20得到的GWT相对较少。
是否需要接触DMC20质押:用户手头的DMC20肯定会去进行质押挖矿(不然就白拿着了),但接触质押需要消耗手续费,而且会损失一个周期的分红权。会让用户犹豫,这种犹豫能潜在的减少DMC20的卖盘。
是否需要将GWT换成DMC?早期兑换比例低,用更少的GWT就有机会换到DMC,但早期GWT的挖矿难度也低,更多的质押币能更快的获得竞争优势。G
是否需要将GWT换成DMC?早期兑换比例低,用更少的GWT就有机会换到DMC,但早期GWT的挖矿难度也低,更多的质押币能更快的获得竞争优势。

## GWT的挖矿

Expand Down Expand Up @@ -126,7 +126,7 @@ DApp提供了一系列API,可以让有技术的玩家制定更符合自己需
11. 使用官方的挖矿软件不会碰到其它异常情况,因此本文不讨论存储挑战等情况下的经济模型


## MST的挖矿:传输挖矿
## MST的挖矿:传输挖矿 (下一个大的规划)
MST 是 Mb per Sec Token的缩写。代表1秒1MB的数据传输。

### 用torrent发布公共数据
Expand Down

0 comments on commit 3b4d29e

Please sign in to comment.