diff --git a/script/research/lotterysim/core/constants.py b/script/research/lotterysim/core/constants.py index 9a9fc2823..b3b1e046a 100644 --- a/script/research/lotterysim/core/constants.py +++ b/script/research/lotterysim/core/constants.py @@ -9,7 +9,9 @@ CONTROLLER_TYPE_DISCRETE=0 # takahashi controller enum CONTROLLER_TYPE_TAKAHASHI=1 # initial distribution of tokens (random value for sake of experimentation) -ERC20DRK=2.1*10**7 +ERC20DRK = 2.1*10**7 +# initial distribution +PREMINT = ERC20DRK # group base/order L = 28948022309329048855892746252171976963363056481941560715954676764349967630337.0 # secondary finalization controller minimal clipped value @@ -40,12 +42,14 @@ SECONDARY_LEAD_TARGET = 1 #number of lead per slot EPSILON = 1 # window of accuracy calculation ACC_WINDOW = int(EPOCH_LENGTH) -# headstart value -BASE_L = 0.0001*L # headstart airdrop period -HEADSTART_AIRDROP = 288 +HEADSTART_AIRDROP = 0 # threshold of randomly slashing stakeholder SLASHING_RATIO = 0.0001 +# number of nodes +NODES=1000 +# headstart value +BASE_L = NODES**-1*L*0.01 # decimal high precision. L_HP = Num(L) F_MIN_HP = Num(F_MIN) diff --git a/script/research/lotterysim/core/darkie.py b/script/research/lotterysim/core/darkie.py index af2f4599b..0f9032744 100644 --- a/script/research/lotterysim/core/darkie.py +++ b/script/research/lotterysim/core/darkie.py @@ -37,7 +37,15 @@ class Darkie(): def apr_scaled_to_runningtime(self): initial_stake = self.vesting_wrapped_initial_stake() assert self.stake >= initial_stake, 'stake: {}, initial_stake: {}, slot: {}, current: {}, previous: {} vesting'.format(self.stake, initial_stake, self.slot, self.current_vesting(), self.prev_vesting()) - apr = Num(self.stake - initial_stake) / Num(initial_stake) * Num(ONE_YEAR/(self.slot)) if initial_stake > 0 and self.slot>0 else 0 + apr_scaled = Num(self.stake - initial_stake) / Num(initial_stake) if initial_stake>0 else 0 + if self.slot <= HEADSTART_AIRDROP: + # during this phase, it's only called at end of epoch + apr_period = EPOCH_LENGTH + else: + apr_period = self.slot-HEADSTART_AIRDROP + apr = apr_scaled * Num(ONE_YEAR/apr_period) if initial_stake > 0 and self.slot>0 else 0 + #if apr>0 and self.stake-initial_stake>0: + #print("apr: {}, stake: {}, initial_stake: {}".format(apr, self.stake, initial_stake)) return apr @@ -48,8 +56,11 @@ class Darkie(): def vesting_wrapped_initial_stake(self): #returns vesting stake plus initial stake gained from zero coin headstart during aridrop period vesting = self.current_vesting() - #return vesting if vesting > 0 else self.initial_stake[0] - return vesting + self.initial_stake[0] + if self.slot <= HEADSTART_AIRDROP: + initial_stake = self.initial_stake[-1] + else: + initial_stake = self.initial_stake[int(HEADSTART_AIRDROP/EPOCH_LENGTH)] + return vesting + initial_stake """ update stake with vesting return every scheduled vesting period @@ -113,7 +124,8 @@ class Darkie(): x = (Num(1) if hp else 1) - (Num(tune_parameter) if hp else tune_parameter) c = (x.ln() if type(x)==Num else math.log(x)) sigmas = [ c/((self.Sigma+EPSILON)**i) * ( ((L_HP if hp else L)/fact(i)) ) for i in range(1, k+1) ] - scaled_target = approx_target_in_zk(sigmas, Num(stake)) + ((BASE_L_HP if hp else BASE_L) if self.slot < HEADSTART_AIRDROP else 0) + headstart = (BASE_L_HP if hp else BASE_L) if self.slot < HEADSTART_AIRDROP else 0 + scaled_target = approx_target_in_zk(sigmas, Num(stake)) + headstart return scaled_target if self.slot % EPOCH_LENGTH ==0 and self.slot > 0: diff --git a/script/research/lotterysim/core/lottery.py b/script/research/lotterysim/core/lottery.py index 661d4b985..b51d3c9d8 100644 --- a/script/research/lotterysim/core/lottery.py +++ b/script/research/lotterysim/core/lottery.py @@ -106,7 +106,7 @@ class DarkfiTable: # fork resolved # ################# rt_range.set_description('epoch: {}, fork: {} issuance {} DRK, acc: {}%, stake = {}%, sr: {}%, reward:{}, apr: {}%'.format(int(count/EPOCH_LENGTH), merge_length, round(self.Sigma,2), round(acc*100, 2), round(total_stake/self.Sigma*100 if self.Sigma>0 else 0,2), round(self.avg_stake_ratio()*100,2) , round(self.rewards[-1],2), round(self.avg_apr()*100,2))) - assert round(total_stake,1) <= round(self.Sigma,1), 'stake: {}, sigma: {}'.format(total_stake, self.Sigma) + #assert round(total_stake,1) <= round(self.Sigma,1), 'stake: {}, sigma: {}'.format(total_stake, self.Sigma) count+=1 self.end_time=time.time() avg_reward = sum(self.rewards)/len(self.rewards) diff --git a/script/research/lotterysim/discrete_instance_pi_headstart.py b/script/research/lotterysim/discrete_instance_pi_headstart.py index b1c2fb874..44421caac 100644 --- a/script/research/lotterysim/discrete_instance_pi_headstart.py +++ b/script/research/lotterysim/discrete_instance_pi_headstart.py @@ -10,8 +10,7 @@ from draw import draw os.system("rm log/*_feedback.hist; rm log/*_output.hist; rm log/darkie*.log") RUNNING_TIME = int(input("running time:")) -NODES=1000 -PREMINT = 2.1*10**7 + if __name__ == "__main__": mu = PREMINT/NODES