Просмотр исходного кода

[research/lotterysim] emulate slashing as random process with certain low probability

ertosns 3 лет назад
Родитель
Сommit
f20c88b2f1

+ 2 - 1
script/research/lotterysim/core/constants.py

@@ -40,4 +40,5 @@ BASE_L = 0.0001*L
 BASE_L_HP = Num(BASE_L)
 
 # HEADSTART AIRDROP period ~ 1 month
-HEADSTART_AIRDROP=28800
+HEADSTART_AIRDROP=2880
+SLASHING_RATIO = 0.0001

+ 8 - 6
script/research/lotterysim/core/lottery.py

@@ -5,7 +5,7 @@ from datetime import timedelta
 from core.darkie import *
 from pid.cascade import *
 from tqdm import tqdm
-
+import random
 class DarkfiTable:
     def __init__(self, airdrop, running_time, controller_type=CONTROLLER_TYPE_DISCRETE, kp=0, ki=0, kd=0, dt=1, kc=0, ti=0, td=0, ts=0, debug=False, r_kp=0, r_ki=0, r_kd=0):
         self.Sigma=airdrop
@@ -52,12 +52,10 @@ class DarkfiTable:
             total_stake = 0
             for i in range(len(self.darkies)):
                 self.darkies[i].set_sigma_feedback(self.Sigma, feedback, f, count, hp)
-                #self.darkies[i].update_vesting()
+                self.darkies[i].update_vesting()
                 self.darkies[i].run(hp)
                 total_stake += self.darkies[i].stake
-                #if self.darkies[i].stake>0:
-                    #print('darkie {} has stake {} for slot {}'.format(i, self.darkies[i].stake, count))
-            #print('reward: {}'.format(rewards[-1]))
+
             for i in range(len(self.darkies)):
                 winners += self.darkies[i].won_hist[-1]
                 ###
@@ -66,6 +64,10 @@ class DarkfiTable:
             if self.winners[-1]==1:
                 for i in range(len(self.darkies)):
                     if self.darkies[i].won_hist[-1]:
+                        if random.random() < SLASHING_RATIO:
+                            self.darkies.remove(self.darkies[i])
+                            print('stakeholder {} slashed'.format(i))
+                            break
                         self.darkies[i].update_stake(self.rewards[-1])
                         break
                 # resolve finalization
@@ -91,7 +93,7 @@ class DarkfiTable:
                             break
                     self.darkies[darkie_winning_idx].resync_stake(resync_reward)
                     self.Sigma += resync_reward
-            rt_range.set_description('issuance {} DRK, acc: {}, stake = {}%'.format(round(sum(self.rewards),2), round(acc,2), round(total_stake/self.Sigma*100 if self.Sigma>0 else 0,2)))
+            rt_range.set_description('issuance {} DRK, acc: {}, stake = {}%, sr: {}%, reward:{}'.format(round(sum(self.rewards),2), round(acc,2), round(total_stake/self.Sigma*100 if self.Sigma>0 else 0,2), self.avg_stake_ratio()*100, self.rewards[-1]))
             #print('[2]stake: {}, sigma: {}, reward: {}'.format(total_stake, self.Sigma, self.rewards[-1]))
             assert(round(total_stake,1) <= round(self.Sigma,1))
             count+=1

+ 2 - 2
script/research/lotterysim/discrete_instance_pi_headstart.py

@@ -10,11 +10,11 @@ from draw import draw
 os.system("rm log/*_feedback.hist; rm log/*_output.hist")
 
 RUNNING_TIME = int(input("running time:"))
-NODES=100
+NODES=1000
 
 if __name__ == "__main__":
     darkies = [Darkie(0, strategy=LinearStrategy(EPOCH_LENGTH)) for _ in range(NODES)]
-    dt = DarkfiTable(0, RUNNING_TIME, CONTROLLER_TYPE_DISCRETE, kp=-0.010399999999938556, ki=-0.0365999996461878, kd=0,  r_kp=-0.63, r_ki=3.35, r_kd=0)
+    dt = DarkfiTable(0, RUNNING_TIME, CONTROLLER_TYPE_DISCRETE, kp=-0.010399999999938556, ki=-0.0365999996461878, kd=0.03840000000000491,  r_kp=-2.53, r_ki=29.5, r_kd=53.77)
     for darkie in darkies:
         dt.add_darkie(darkie)
     acc, avg_apy, avg_reward, stake_ratio, avg_apr = dt.background(rand_running_time=False)