坚实的循环

时间:2018-11-08 01:05:06

标签: solidity

我通过此循环计算价格

uint tokenPrice = 1e15;
uint tokenPriceStep = 1e11;//
uint sendValue = 3e18; //3 ETH
uint balance = 0;
do {    
    balance += 1e18;
    sendValue -= tokenPrice;
    tokenPrice += tokenPriceStep;
} while (sendValue > tokenPrice);
if(sendValue > 0){
    balance += sendValue *  1e18 / tokenPrice;
    tokenPrice += (sendValue *  1e18 / tokenPrice) * tokenPriceStep / 1e18;
    sendValue = 0;
}

但这是耗费大量汽油的成本。当我运行此程序时,REMIX刚崩溃。我该怎么办?我需要这样的循环才能像这样计算价格:
例如,逻辑看起来像这样:

第一位是数字
第二柱是我的价值(我的钱)
第三是我的代币余额
第四列是价格(增长1或其他值)

0 - 3000.00000 -> 0.00000 -> 100.00000
1 - 2900.00000 -> 1.00000 -> 101.00000
2 - 2799.00000 -> 2.00000 -> 102.00000
3 - 2697.00000 -> 3.00000 -> 103.00000
4 - 2594.00000 -> 4.00000 -> 104.00000
5 - 2490.00000 -> 5.00000 -> 105.00000
6 - 2385.00000 -> 6.00000 -> 106.00000
7 - 2279.00000 -> 7.00000 -> 107.00000
8 - 2172.00000 -> 8.00000 -> 108.00000
9 - 2064.00000 -> 9.00000 -> 109.00000
10 - 1955.00000 -> 10.00000 -> 110.00000
11 - 1845.00000 -> 11.00000 -> 111.00000
12 - 1734.00000 -> 12.00000 -> 112.00000
13 - 1622.00000 -> 13.00000 -> 113.00000
14 - 1509.00000 -> 14.00000 -> 114.00000
15 - 1395.00000 -> 15.00000 -> 115.00000
16 - 1280.00000 -> 16.00000 -> 116.00000
17 - 1164.00000 -> 17.00000 -> 117.00000
18 - 1047.00000 -> 18.00000 -> 118.00000
19 - 929.00000 -> 19.00000 -> 119.00000
20 - 810.00000 -> 20.00000 -> 120.00000
21 - 690.00000 -> 21.00000 -> 121.00000
22 - 569.00000 -> 22.00000 -> 122.00000
23 - 447.00000 -> 23.00000 -> 123.00000
24 - 324.00000 -> 24.00000 -> 124.00000
25 - 200.00000 -> 25.00000 -> 125.00000
26 - 75.00000 -> 26.00000 -> 126.00000
27 - 0.00000 -> 26.59524 -> 126.59524

请帮助,我不知道该怎么办!

1 个答案:

答案 0 :(得分:0)

我认为您可以像这样无循环运行

uint times = sendValue / tokenPrice; // this is how many time the loop would run
balance += times * (1e18);
tokenPrice += times * tokePriceStep;
sendValue -= times * tokenPrice;

之后,其余部分相同。 您应该始终尝试避免合同中出现循环,因为用完所有气体非常容易,有时甚至超过区块的气体限制。