Skip to content
This repository has been archived by the owner on Nov 16, 2022. It is now read-only.

Commit

Permalink
fix struct validator and validators
Browse files Browse the repository at this point in the history
  • Loading branch information
Benzbeeb committed May 1, 2020
1 parent 13b1082 commit eee3eb5
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 44 deletions.
12 changes: 6 additions & 6 deletions chain/random/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,18 @@ func testRandom() (int64, int64) {
ids := []string{"000001E443FD237E4B616E2FA69DF4EE3D49A94F", "000AA5ABF590A815EBCBDAE070AFF50BE571EB8B", "019B9CA2944D3CC36C7C73283EF3D58E56C8A5D4", "099E2B09583331AFDE35E5FA96673D2CA7DEA316", "0D2186876D26D882F7BE50DED92BD3CB53838143", "18C78D135C9D81D74F6234DBD268C47F0F89E844", "1AE0BD432F9A5122474A646325D1AFA6068692E9", "1CED30733D1625C89AB698677606D0E37B3676A9", "1E20E074030FA93836CABAED6581D6C46AEF6471", "1E9CE94FD0BA5CFEB901F90BC658D64D85B134D2", "21223475CE86F3C7CD5E985AA88FC24A29C97813", "2199EAE894CA391FA82F01C2C614BFEB103D056C", "246808FF08F382EB00E125F5088B6FE32B978857", "24935D59FAA94E793652CBF4716C6041CD7AA400", "2745ECA0BACF8F7B1BF8B7B434629B4F18C7BA42", "2B9A55D3BF93D7375DD207B75C5ED4D2B91D9146", "2C528D2345ED6E953C1C0819E2C3A01ABFCBA557", "2C9CCC317FB283D54AC748838A64F29106039E51", "2CD6A3523F5D61573EF1E3654B421AD211CFE8DC", "31920F9BC3A39B66876CC7D6D5E589E10393BF0E", "3363E8F97B02ECC00289E72173D827543047ACDA", "33C99B2E79B887ADA2228E53FB6EA000AB983337", "34337FEEE36B03CC9D5C9F59B308C0E317DB607C", "399671C2FE4B2714EC6E87D4EE454EF15F33AA2A", "407F144D1C9DEA4EE6A8CBC2D4C022A657506B83", "412D552A7129C496AD4C3DAAA7CEF7089C73B140", "42D6705E716616B4A5442BDAA050B7C6E9FDDE43", "46A3F8B8393BAA153C40E5722EAE82EA0D48B32D", "4906F2A5334D906A4C63F9E9D61527A9F593C4EF", "49BBFB1BA1A75052E3226E8E1E0EFEB33918B8B2", "4AF69D6A5436C30E3584C1628433DE55E758BCCA", "4C92230FAC162303D981C06DD22663A4FC7622BC", "4E9CB39F4B1FA617339744A5600B62802652D69C", "51205659A717DFFB96E054F8BD1108730E17AEA7", "51DB2566204EE266427EA8A6CB719835AB170BE9", "52E1646134432BF9532B4881C6ED32E40AE5A2DD", "5731848E19257705AA28CC7EFAA8C708EE014D52", "57713BB7421C7FEB381B863FC87DED5E829AA961", "5AB353B748D45F20DFCE19D73BA89F26E1C34CF7", "671460930CCDC9B06C5D055E4D550EB8DAF2291E", "679B89785973BE94D4FDF8B66F84A929932E91C5", "68F5BBEACEF114C720EA9C98BFA2FFDE01C54FD1", "696ABC95186FD65A07050C28AB00C9358A315030", "6CB47D786B2F350C13A60BB77D398AC82E900985", "6F322BAF5D73D5C77271941901B1D866476D5C90", "708FDDCE121CDADA502F2B0252FEF13FDAA31E50", "70C5B4E6779C59A24CFD9146581E27021C2AEC26", "732CEEF54C374DDC6ADECBFD707AEFD07FEDC143", "75DAB316F4CA1367F532AB71A80B7FA65AB69039", "7674C7FE7960B486BA1052DA225F54119580EB74", "7A416D78E6C9AFCF115949CA092E61BCD9DB8A18", "7B3A2EFE5B3FCDF819FCF52607314CEFE4754BB6", "7B3D01F754DFF8474ED0E358812FD437E09389DC", "7CAB2B15C7F0238619A65D8833EEB53942552651", "7FCBACCB12563C8823E8EBEC8C0DE580DD8C7F04", "808D6B054A0B6D3FF5F5EAF0A65CFC64C543F833", "818964B4FB36D28109C3E853778B33231B27C5FC", "81965FE8A15FA8078C9202F32E4CFA72F85F2A22", "8332069BCA9D125E72BF87E4DA172C9E83B90FD4", "83F47D7747B0F633A6BA0DF49B7DCF61F90AA1B0", "846BE4F39E3122D2A2D3FE5454E2561073E95538", "874D6AA838384A79A3D4D062541F91BF7E31BDBA", "8C8802A921114169D2581CD46E3CA6853F6F2A7F", "8CE843E04C48B7864F8568FA39E90EA13FE6586F", "8E0EE37B7B1A038DD145E30F1EF97DF3619EF429", "8FA2380FA64B122427202970CF12BD4991B4C6D2", "8FE3CFFA6A07B093E441BB84DA1B6DABF53AFA2D", "91C823A744DE50F91C17A46B624EDF8F7150A7DD", "955A47C8AC8632825DD475E90913D40AB09D3FB4", "95E060D07713070FE9822F6C50BD76BCCBF9F17A", "99304AA9AEEC13FCEF0FF72DFC8953273FE559BC", "9C17C94F7313BB4D6E064287BEEDE5D3888E8855", "9D07B301D23C547266D55D1B6C5A78CA473383A1", "9DC4012099BE743189074B85E49891AE3B3FEE9B", "9DF8E338C85E879BC84B0AAA28A08B431BD5B548", "9E14352CB5293C6073D61280A197085C6748DAFA", "9EE94DBB86F72337192BF291B0E767FD2729F00A", "A03DC128D38DB0BC5F18AE1872F1CB2E1FD41157", "A4F1D5534F3FA905A4DA606E8A10834976511FF7", "A6935D877B9776C45B96EEAE526959A3B9A5AB1A", "AC2D56057CD84765E6FBE318979093E8E44AA18F", "AC885F3EE81E7ED07FE7B2E067443A855F997BA1", "B00A6323737F321EB0B8D59C6FD497A14B60938A", "B0155252D73B7EEB74D2A8CC814397E66970A839", "B0765A2F6FCC11D8AC46275FAC06DD35F54217C1", "B0C5370ED46641878800A518EB8335E42AE87673", "B1167D0437DB9DF0D533EE2ACDE48107139BDD2E", "B2BF68AD4CED6FE8F71AACAD01003436EBE0729F", "B34591DA79AAD0213534E2E915F50DE5CDBDF250", "B4999CD535E4CD32B590BEB47020A724F40B65E5", "B4E1085F1C9EBB0EA994452CB1B8124BA89BED1A", "B543A7DF48780AEFEF593A003CD060B593C4E6B5", "B61AA419909956354A25E26DDE9103B4C1A4D5CA", "B6D7360C27F1DC36DD9BFCF23037BE8B04429209", "B724CDAA69A47B90B18D0EA7FD5B046D537DA64A", "BAC33F340F3497751F124868F049EC2E8930AC2F", "BF4CB4D59D19D451CF5E7BC49349DF4AA222D78B", "C2356622B495725961B5B201A382DD57CD3305EC", "C2DDD9700CF5DEC0457DC423829B31EA8FD4F9D4", "C4903229B9EAD415C79E8FA69D2BBA6117617C41", "C52ACDB32057F5C731BBDD48460B93C3500DD324", "CA6696F5FE66A480BF21460319BE979930852DD0", "CC05882978FC5FDD6A7721687E14C0299AE004B8", "CC87F56B58621811E2B5A47F38C6166E295CE36E", "D14A542E8756C3A942D9FD8873DC2E9A7798A17F", "D3FA9465ED96B70797572D4D83678BC2699560C1", "D540AB022088612AC74B287D076DBFBC4A377A2E", "D7F7C79487C10A5CF1ABEB1DBD81E8D49757C422", "D8F0BEDE91D3FE4DD827619499EBA5CECC76FE21", "D9F8A41B782AA6A66ADC81F953923C7DCE7B6001", "DA6AAAA959C9EF88A3EB37B1F107CB2667EBBAAB", "E6A3801926BC5F83761C4ADF88263F88195FDD5B", "E800740C68C81B30345C3AE2BA638FA56FF67EEF", "E83BFC436D2CE8DCC9EC0589B2E5B735E37FB85C", "EB1DF22507B79CE700F86C4C8B13D7DF01DFDA9C", "EBED694E6CE1224FB1E8A2DD8EE63A38568B1E2B", "ED509E78097E1306A91FEDE8E85B75D06BDDF6E3", "EE73A19751D58C5EC044C11E3FB7AE685A10D2C1", "F4CAB410DE5567DB203BD56C694FB78D482479A1", "F55714243D32FB65B6D95A29D0350EA0CABBA8EA", "F59734A896A7689436BC3422244FD862AE189C5C", "F8C01C0681578AA700D736D675C9992065F65E3E", "F919902709B7482F01C030E8B57BF93B8D87043B", "FA0E5DFACCDCF74957A742144FE55BE61D433377", "FD5D54E0D9E4768FEA4C0DFFDC89FA96B6657F32"}
var vals Validators
for idx := range vps {
vals.validatorSet = append(vals.validatorSet,
vals.ValidatorSet = append(vals.ValidatorSet,
Validator{
Id: []byte(ids[idx]),
votingPower: vps[idx],
ID: []byte(ids[idx]),
VotingPower: vps[idx],
},
)
}

sort.Slice(vals.validatorSet, func(i, j int) bool {
return vals.validatorSet[i].votingPower > vals.validatorSet[j].votingPower
sort.Slice(vals.ValidatorSet, func(i, j int) bool {
return vals.ValidatorSet[i].VotingPower > vals.ValidatorSet[j].VotingPower
})
vals.validatorSet = vals.validatorSet[:100]
vals.ValidatorSet = vals.ValidatorSet[:100]
randString := fmt.Sprint(rand.Int())
luckyVal := randomValidators([]byte(randString), vals, 10, 0)
return luckyVal.GetVotingPower(), vals.GetVotingPower()
Expand Down
63 changes: 25 additions & 38 deletions chain/random/validators.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,39 +3,29 @@ package main
import (
"crypto/sha256"
"encoding/binary"
"math/rand"
)

type Validator struct {
Id []byte
votingPower int64
ID []byte
VotingPower int64
}

type Validators struct {
validatorSet []Validator
}

// range specification, note that min <= max
type RandomRange struct {
min, max int64
ValidatorSet []Validator
}

func (vals Validators) GetVotingPower() int64 {
sum := int64(0)
for _, val := range vals.validatorSet {
sum += val.votingPower
for _, val := range vals.ValidatorSet {
sum += val.VotingPower
}
return sum
}

func (vals Validators) Append(val Validator) {
vals.validatorSet = append(vals.validatorSet, val)
}

func createRandomSeed(seedByte []byte) int64 {
func nextSeed(seed []byte) []byte {
h := sha256.New()
h.Write(seedByte)
seed := h.Sum(nil)
h.Write(seed)
seed = h.Sum(nil)

h = sha256.New()
h.Write(seed[len(seed)-3:])
Expand All @@ -45,50 +35,47 @@ func createRandomSeed(seedByte []byte) int64 {
h.Write(seed[len(seed)-3:])
seed = h.Sum(nil)

return int64(binary.BigEndian.Uint64(seed))
return seed
}
func (rr *RandomRange) NextRandom(r *rand.Rand) int64 {
return r.Int63n(rr.max-rr.min+1) + rr.min
}

func luckyDraw(seedByte []byte, vals Validators, randomRange int64) (Validator, Validators) {
r := rand.New(rand.NewSource(createRandomSeed(seedByte)))
rr := RandomRange{0, randomRange}

luckyIdx := rr.NextRandom(r)
luckyVal := vals.validatorSet[int(luckyIdx)]
vals.validatorSet = append(vals.validatorSet[:luckyIdx], vals.validatorSet[luckyIdx+1:]...)
func luckyDraw(seed []byte, vals Validators, randomRange int64) (Validator, Validators) {
luckyIdx := int64(binary.BigEndian.Uint64(seed)) % randomRange
if luckyIdx <= 0 {
luckyIdx *= int64(-1)
}
luckyVal := vals.ValidatorSet[int(luckyIdx)]
vals.ValidatorSet = append(vals.ValidatorSet[:luckyIdx], vals.ValidatorSet[luckyIdx+1:]...)

return luckyVal, vals
}

func getRandomRage(vals Validators, round, algo int) int64 {

func getRandomRange(vals Validators, round, algo int) int64 {
var randomRange int64
switch algo {
case 0:
randomRange = int64(len(vals.validatorSet) - 10*round)
randomRange = int64(len(vals.ValidatorSet) - 10*round)
if randomRange < 0 {
randomRange = 0
}
if randomRange >= int64(len(vals.validatorSet)) {
randomRange = int64(len(vals.validatorSet)) - 1
if randomRange >= int64(len(vals.ValidatorSet)) {
randomRange = int64(len(vals.ValidatorSet)) - 1
}
default:
panic("ERROR")
}
return randomRange
}

func randomValidators(seedByte []byte, vals Validators, amount int, algo int) Validators {
func randomValidators(seed []byte, vals Validators, amount int, algo int) Validators {
vals.GetVotingPower()

var luckyVal Validators
var val Validator
for round := 0; round < amount; round++ {
randomRange := getRandomRage(vals, round, algo)
val, vals = luckyDraw(seedByte, vals, randomRange)
luckyVal.validatorSet = append(luckyVal.validatorSet, val)
seed = nextSeed(seed)
randomRange := getRandomRange(vals, round, algo)
val, vals = luckyDraw(seed, vals, randomRange)
luckyVal.ValidatorSet = append(luckyVal.ValidatorSet, val)
}

return luckyVal
Expand Down

0 comments on commit eee3eb5

Please sign in to comment.