테스트해본 결과, map의 0번 인덱스에 가까울수록 처음으로 iteration될 확률이 높습니다. 참고로 올려주신 map iterator초기화 코드에 보면, fastrand()함수를 이용하고 있는데요 코드를 보시면 알 수 있듯이 현재 나의 tx가 가진 인덱스를 알기도 힘들뿐 아니라 안다고 하여도 map의 키값인 address를 적절하게 조절하여 시작 인덱스로 만든다는 것은 더욱 어려워 보입니다.
다만 pending에서 tx를 가져올 때, flatten()을 이용하고 있는데 이는 nonce기반으로 정렬되어 가져옵니다. 따라서 nonce가 낮다면 pending에서 처음으로 꺼내올 가능성이 높아지고 이는 block에 먼저 들어갈 확률도 높아집니다. 말씀해주신 tx들을 보면 대부분 nonce가 0~3사이인 것을 확인 할 수 있습니다.
aidan께서 말씀해 주셨듯 이후 업데이트에서는 이러한 점들을 고민하여 반영하고 있으며, 보다 공정한 트랜잭션 분배를 기대할수 있을거라 생각합니다.
`package main
import (
"encoding/hex"
"fmt"
"os"
)
var addrs = []string{
"000001f41166f8fc328b8bee979f141871f07e7e",
"ea4fab048c46ebf29dbd48dd988599297a40d875",
"c90211f8a76cfe2711f94531a7274f2ddd6534e6",
"3625122aa684ffad36648d080c1c899108165857",
"5364f88213ccf65b1aa05baee7f9358bfe3898a5",
"349796f796a76dfe8f3670acf2cbc34430055796",
"1c7aa22e001a6b53f2b43325140c2899f0916333",
"100001f41166f8fc328b8bee979f141871f07e7e",
"2b10a43e2fd40f7797c5cbb2de1d1ffa4a9dbcf8",
"fa4fab048c46ebf29dbd48dd988599297a40d875",
"d90211f8a76cfe2711f94531a7274f2ddd6534e6",
"4625122aa684ffad36648d080c1c899108165857",
"6364f88213ccf65b1aa05baee7f9358bfe3898a5",
"449796f796a76dfe8f3670acf2cbc34430055796",
"2c7aa22e001a6b53f2b43325140c2899f0916333",
"449796f796a76dfe8f3670acf2cbc34430055797",
"2c7aa22e001a6b53f2b43325140c2899f0916334",
"1b10a43e2fd40f7797c5cbb2de1d1ffa4a9dbcf8",
"9c7aa22e001a6b53f2b43325140c2899f0916333",
"6b10a43e2fd40f7797c5cbb2de1d1ffa4a9dbcf2",
}
func main() {
mTestFile, err := os.OpenFile("csv file path", os.O_APPEND|os.O_WRONLY|os.O_CREATE, os.FileMode(644))
if err != nil {
panic(err)
}
const normalize = 1000000
for testCnt := 0; testCnt < 20; testCnt++ {
firstCnt := make([]int, len(addrs))
for i := 0; i < normalize; i++ {
j := 0
iterTest := newMap()
for _, v := range iterTest {
if j == 0 {
firstCnt[v] = firstCnt[v] + 1
}
j++
}
}
for _, n := range firstCnt {
// fmt.Printf("%f%%\t", float32(n)/float32(cnt)*100)
fmt.Fprintf(mTestFile, "%f%%,", float32(n)/float32(normalize)*100)
}
fmt.Fprintln(mTestFile, "")
}
fmt.Fprintln(mTestFile, "")
}
func newMap() map[[20]byte]int {
iterTest := map[[20]byte]int{}
i := 0
for _, addr := range addrs {
var decoded [20]byte
temp, err := hex.DecodeString(addr)
copy(decoded[:], temp[:20])
if err != nil {
panic(err)
}
iterTest[decoded] = i
i++
}
return iterTest
}
`
본 코드로 테스트해본결과 golang의 map자체가 낮은 index에 편향성을 갖도록 설계된 것 같습니다.