From 20cdade151bc08ae1fb2dc44fe077ba31023303e Mon Sep 17 00:00:00 2001 From: "kenian.shi" <1035868500@qq.com> Date: Sat, 9 Nov 2019 23:59:53 +0800 Subject: [PATCH 1/4] Create verify.go --- nyancat/v0.16/verify.go | 269 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 nyancat/v0.16/verify.go diff --git a/nyancat/v0.16/verify.go b/nyancat/v0.16/verify.go new file mode 100644 index 00000000..ae9e17e9 --- /dev/null +++ b/nyancat/v0.16/verify.go @@ -0,0 +1,269 @@ +package main + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" +) + +const ( + task1URL = "https://lcd.nyancat.irisnet.org/txs?action=add_liquidity" + task2URL = "https://lcd.nyancat.irisnet.org/txs?action=remove_liquidity" + task3URL = "https://lcd.nyancat.irisnet.org/txs?action=swap_order" + task4URL = "https://lcd.nyancat.irisnet.org/txs?action=swap_order" + task3TP1 = "btc-iris" //task3的token-pairs对 + task3TP2 = "iris-btc" + task4TP1 = "eth-btc" //task4的token-pairs对 + task4TP2 = "btc-eth" +) + +type validator struct { + moniker string + operationAddress string + pgp string +} + +func fetch(url string) ([]byte, error) { + client := http.Client{} + request, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + request.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36") + resp, err := client.Do(request) + if err != nil { + return nil, err + } + defer resp.Body.Close() + return ioutil.ReadAll(resp.Body) +} + +var validatorSet = make(map[string]validator) + +func getOwnerKey(fva string) string { + data, err := fetch("https://nyancat.irisplorer.io/api/stake/validators/" + fva) + if err != nil { + panic(err) + } + m := make(map[string]interface{}) + err = json.Unmarshal(data, &m) + if err != nil { + panic(err) + } + ownerKey := m["owner_addr"].(string) + return ownerKey +} + +func init() { + data, err := fetch("https://lcd.nyancat.irisnet.org/stake/validators") + if err != nil { + panic(err) + } + m := []interface{}{} + err = json.Unmarshal(data, &m) + if err != nil { + panic(err) + } + for _, v := range m { + vali := validator{} + validatorAddress := fmt.Sprint(v.(map[string]interface{})["operator_address"]) + moniker := fmt.Sprint(v.(map[string]interface{})["description"].(map[string]interface{})["moniker"]) + pgp := fmt.Sprint(v.(map[string]interface{})["description"].(map[string]interface{})["identity"]) + ownerAddress := getOwnerKey(validatorAddress) + if _, ok := validatorSet[ownerAddress]; ok { + fmt.Printf("%s 对应多个validator,请管理员检查\n", ownerAddress) + } else { + vali.moniker = moniker + vali.pgp = pgp + vali.operationAddress = ownerAddress + validatorSet[ownerAddress] = vali + } + } +} + +type taskDetail struct { + sender string + hash string + height string + timestamp string +} + +func verifyTask12(url string) []taskDetail { + taskDetails := []taskDetail{} + data, err := fetch("https://lcd.nyancat.irisnet.org/txs?action=add_liquidity") + if err != nil { + panic(err) + } + m := make(map[string]interface{}) + err = json.Unmarshal(data, &m) + if err != nil { + panic(err) + } + txs := m["txs"].([]interface{}) + + for _, tx := range txs { + code := tx.(map[string]interface{})["result"].(map[string]interface{})["Code"].(float64) + if code != 0 { + continue + } + + hash := tx.(map[string]interface{})["hash"].(string) + height := tx.(map[string]interface{})["height"].(string) + timestamp := tx.(map[string]interface{})["timestamp"].(string) + + //tags := tx.(map[string]interface{})["result"].(map[string]interface{})["Tags"].([]interface{}) + tags := tx.(map[string]interface{})["result"].(map[string]interface{})["Tags"].([]interface{}) + tagsMap := make(map[string]string) + for _, tag := range tags { + key := tag.(map[string]interface{})["key"].(string) + value := tag.(map[string]interface{})["value"].(string) + tagsMap[key] = value + } + if sender, ok := tagsMap["sender"]; ok { + detail := taskDetail{ + hash: hash, + height: height, + sender: sender, + timestamp: timestamp, + } + //fmt.Println(detail) + taskDetails = append(taskDetails, detail) + } + } + return taskDetails +} + +func verifyTask34(url, tokenPairs1, tokenPairs2 string) []taskDetail { + taskDetails := []taskDetail{} + data, err := fetch(url) + if err != nil { + panic(err) + } + m := make(map[string]interface{}) + err = json.Unmarshal(data, &m) + if err != nil { + panic(err) + } + txs := m["txs"].([]interface{}) + for _, tx := range txs { + code := tx.(map[string]interface{})["result"].(map[string]interface{})["Code"].(float64) + if code != 0 { + continue + } + + hash := tx.(map[string]interface{})["hash"].(string) + height := tx.(map[string]interface{})["height"].(string) + timestamp := tx.(map[string]interface{})["timestamp"].(string) + + tags := tx.(map[string]interface{})["result"].(map[string]interface{})["Tags"].([]interface{}) + tagsMap := make(map[string]string) + for _, tag := range tags { + key := tag.(map[string]interface{})["key"].(string) + value := tag.(map[string]interface{})["value"].(string) + tagsMap[key] = value + } + + if tp, ok := tagsMap["token-pair"]; ok && (tp == tokenPairs1 || tp == tokenPairs2) { + if sender, ok := tagsMap["sender"]; ok { + detail := taskDetail{ + hash: hash, + height: height, + sender: sender, + timestamp: timestamp, + } + //fmt.Println(detail) + taskDetails = append(taskDetails, detail) + } + } + } + + return taskDetails + +} + +type taskStat struct { + task1 bool + task2 bool + task3 bool + task4 bool +} + +func main() { + + task1Details := verifyTask12(task1URL) + fmt.Printf("task1完成人数统计:%d \n", len(task1Details)) + + task2Details := verifyTask12(task2URL) + fmt.Printf("task2完成人数统计:%d \n", len(task2Details)) + task3Details := verifyTask34(task3URL, task3TP1, task3TP2) + fmt.Printf("task3完成人数统计:%d \n", len(task3Details)) + task4Details := verifyTask34(task4URL, task4TP1, task4TP2) + fmt.Printf("task4完成人数统计:%d \n", len(task4Details)) + taskTotal := make(map[string]taskStat) + notValidatorSender := make(map[string]taskStat) + + senderMatchPGP(1, task1Details, taskTotal, notValidatorSender) + senderMatchPGP(2, task2Details, taskTotal, notValidatorSender) + senderMatchPGP(3, task3Details, taskTotal, notValidatorSender) + senderMatchPGP(4, task4Details, taskTotal, notValidatorSender) + + fmt.Printf("验证人人数统计:%d 人完成任务\n", len(taskTotal)) + for k, v := range taskTotal { + fmt.Printf("%s %+v \n\n", k, v) + } + + fmt.Printf("为从验证人找到人数统计:%d 人完成任务\n", len(notValidatorSender)) + for k, v := range notValidatorSender { + fmt.Printf("%s %+v \n\n", k, v) + } + +} + +func senderMatchPGP(taskID int, taskdetails []taskDetail, taskTotal map[string]taskStat, notValidatorSender map[string]taskStat) { + i := 1 + okCount := 1 + failOunt := 1 + for _, taskdetail := range taskdetails { + fmt.Printf("task%d:%d times!\n", taskID, i) + i++ + ts := taskStat{} + if validator, ok := validatorSet[taskdetail.sender]; ok { + fmt.Printf("task%d:%d OKtimes!\n", taskID, okCount) + okCount++ + + pgp := validator.pgp + if _, ok := taskTotal[pgp]; ok { + ts = taskTotal[pgp] + } + switch taskID { + case 1: + ts.task1 = true + case 2: + ts.task2 = true + case 3: + ts.task3 = true + case 4: + ts.task4 = true + } + taskTotal[pgp] = ts + } else { + fmt.Printf("task%d:%d FAILtimes!\n", taskID, failOunt) + failOunt++ + if _, ok := notValidatorSender[taskdetail.sender]; ok { + ts = notValidatorSender[taskdetail.sender] + } + switch taskID { + case 1: + ts.task1 = true + case 2: + ts.task2 = true + case 3: + ts.task3 = true + case 4: + ts.task4 = true + } + notValidatorSender[taskdetail.sender] = ts + } + } +} From 3741cc7a798842cdf27cbd1b83a13048be50cf44 Mon Sep 17 00:00:00 2001 From: "kenian.shi" <1035868500@qq.com> Date: Sun, 10 Nov 2019 01:03:43 +0800 Subject: [PATCH 2/4] Update verify.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加一些注释 --- nyancat/v0.16/verify.go | 176 ++++++++++++++++++++++++---------------- 1 file changed, 104 insertions(+), 72 deletions(-) diff --git a/nyancat/v0.16/verify.go b/nyancat/v0.16/verify.go index ae9e17e9..512582aa 100644 --- a/nyancat/v0.16/verify.go +++ b/nyancat/v0.16/verify.go @@ -5,6 +5,7 @@ import ( "fmt" "io/ioutil" "net/http" + "strconv" ) const ( @@ -18,29 +19,32 @@ const ( task4TP2 = "btc-eth" ) -type validator struct { - moniker string - operationAddress string - pgp string +type validator struct { //用来将validator的pgp和ownkey进行匹配 + moniker string + ownKey string + pgp string } -func fetch(url string) ([]byte, error) { - client := http.Client{} - request, err := http.NewRequest("GET", url, nil) - if err != nil { - return nil, err - } - request.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36") - resp, err := client.Do(request) - if err != nil { - return nil, err - } - defer resp.Body.Close() - return ioutil.ReadAll(resp.Body) +type taskDetail struct { //每次任务查询后返回的原始结果 + hash string + sender string + height string + timestamp string } -var validatorSet = make(map[string]validator) +type taskStat struct { //某个验证人四个任务是否完成 + task1 bool + task2 bool + task3 bool + task4 bool +} +var validatorSet = make(map[string]validator) //验证人集合 +var taskTotal = make(map[string]taskStat) //总的任务汇总 +var notValidatorSender = make(map[string]taskStat) //记录一些交易的发送者在验证人列表中找不到的信息 +var repeatTxMap = make(map[string][]taskDetail) //记录一些相同任务重复做的交易 + +//根据验证人的operationAddress从浏览器上面查找相应的ownerKey数据 func getOwnerKey(fva string) string { data, err := fetch("https://nyancat.irisplorer.io/api/stake/validators/" + fva) if err != nil { @@ -55,6 +59,7 @@ func getOwnerKey(fva string) string { return ownerKey } +//初始化是将验证人信息保存到本地的validatorSet集合 func init() { data, err := fetch("https://lcd.nyancat.irisnet.org/stake/validators") if err != nil { @@ -76,22 +81,16 @@ func init() { } else { vali.moniker = moniker vali.pgp = pgp - vali.operationAddress = ownerAddress + vali.ownKey = ownerAddress validatorSet[ownerAddress] = vali } } } -type taskDetail struct { - sender string - hash string - height string - timestamp string -} - +//task1 task2的任务检查,输入url,返回为各个交易所需要的一些信息。 func verifyTask12(url string) []taskDetail { taskDetails := []taskDetail{} - data, err := fetch("https://lcd.nyancat.irisnet.org/txs?action=add_liquidity") + data, err := fetch(url) if err != nil { panic(err) } @@ -105,17 +104,15 @@ func verifyTask12(url string) []taskDetail { for _, tx := range txs { code := tx.(map[string]interface{})["result"].(map[string]interface{})["Code"].(float64) if code != 0 { - continue + continue //只记录成功的交易 } - hash := tx.(map[string]interface{})["hash"].(string) height := tx.(map[string]interface{})["height"].(string) timestamp := tx.(map[string]interface{})["timestamp"].(string) - //tags := tx.(map[string]interface{})["result"].(map[string]interface{})["Tags"].([]interface{}) tags := tx.(map[string]interface{})["result"].(map[string]interface{})["Tags"].([]interface{}) tagsMap := make(map[string]string) - for _, tag := range tags { + for _, tag := range tags { //将tags解析保存到缓存中,去除json文件格式中的属性名 key := tag.(map[string]interface{})["key"].(string) value := tag.(map[string]interface{})["value"].(string) tagsMap[key] = value @@ -125,7 +122,7 @@ func verifyTask12(url string) []taskDetail { hash: hash, height: height, sender: sender, - timestamp: timestamp, + timestamp: timestamp, //获取交易的sender } //fmt.Println(detail) taskDetails = append(taskDetails, detail) @@ -134,6 +131,8 @@ func verifyTask12(url string) []taskDetail { return taskDetails } + +//task3 task4 任务检查,输入url以及token-pairs名,由于可能存在btc-eth,或者eth-btc均可,返回完成任务交易的相关情况 func verifyTask34(url, tokenPairs1, tokenPairs2 string) []taskDetail { taskDetails := []taskDetail{} data, err := fetch(url) @@ -148,10 +147,9 @@ func verifyTask34(url, tokenPairs1, tokenPairs2 string) []taskDetail { txs := m["txs"].([]interface{}) for _, tx := range txs { code := tx.(map[string]interface{})["result"].(map[string]interface{})["Code"].(float64) - if code != 0 { + if code != 0 { //只记录成功的交易 continue } - hash := tx.(map[string]interface{})["hash"].(string) height := tx.(map[string]interface{})["height"].(string) timestamp := tx.(map[string]interface{})["timestamp"].(string) @@ -164,7 +162,7 @@ func verifyTask34(url, tokenPairs1, tokenPairs2 string) []taskDetail { tagsMap[key] = value } - if tp, ok := tagsMap["token-pair"]; ok && (tp == tokenPairs1 || tp == tokenPairs2) { + if tp, ok := tagsMap["token-pair"]; ok && (tp == tokenPairs1 || tp == tokenPairs2) { //需要核对token-pairs对是否正确 if sender, ok := tagsMap["sender"]; ok { detail := taskDetail{ hash: hash, @@ -172,84 +170,101 @@ func verifyTask34(url, tokenPairs1, tokenPairs2 string) []taskDetail { sender: sender, timestamp: timestamp, } - //fmt.Println(detail) taskDetails = append(taskDetails, detail) } } } - return taskDetails - } -type taskStat struct { - task1 bool - task2 bool - task3 bool - task4 bool -} + func main() { task1Details := verifyTask12(task1URL) fmt.Printf("task1完成人数统计:%d \n", len(task1Details)) - task2Details := verifyTask12(task2URL) fmt.Printf("task2完成人数统计:%d \n", len(task2Details)) task3Details := verifyTask34(task3URL, task3TP1, task3TP2) fmt.Printf("task3完成人数统计:%d \n", len(task3Details)) task4Details := verifyTask34(task4URL, task4TP1, task4TP2) fmt.Printf("task4完成人数统计:%d \n", len(task4Details)) - taskTotal := make(map[string]taskStat) - notValidatorSender := make(map[string]taskStat) - senderMatchPGP(1, task1Details, taskTotal, notValidatorSender) - senderMatchPGP(2, task2Details, taskTotal, notValidatorSender) - senderMatchPGP(3, task3Details, taskTotal, notValidatorSender) - senderMatchPGP(4, task4Details, taskTotal, notValidatorSender) + senderMatchPGP(1, task1Details) + senderMatchPGP(2, task2Details) + senderMatchPGP(3, task3Details) + senderMatchPGP(4, task4Details) - fmt.Printf("验证人人数统计:%d 人完成任务\n", len(taskTotal)) + fmt.Printf("从验证人人数统计:%d 人完成任务情况:\n", len(taskTotal)) for k, v := range taskTotal { fmt.Printf("%s %+v \n\n", k, v) } - fmt.Printf("为从验证人找到人数统计:%d 人完成任务\n", len(notValidatorSender)) + fmt.Printf("未从验证人中找到人数统计:%d 人完成任务\n", len(notValidatorSender)) for k, v := range notValidatorSender { fmt.Printf("%s %+v \n\n", k, v) } + for k,v := range repeatTxMap { + fmt.Printf("sender:%s 重复交易次数:%d\n",k,len(v)) + } + } -func senderMatchPGP(taskID int, taskdetails []taskDetail, taskTotal map[string]taskStat, notValidatorSender map[string]taskStat) { - i := 1 - okCount := 1 - failOunt := 1 - for _, taskdetail := range taskdetails { - fmt.Printf("task%d:%d times!\n", taskID, i) - i++ +//将交易sender和PGP进行匹配 +//如果能匹配上,则pgp:{true,true,false,true} ,其中分别代表task1,2,3,4是否完成 +//如果匹配不上,则sender:{true,true,false,true} +func senderMatchPGP(taskID int, taskdetails []taskDetail) { + repeatsender := []string{} + for _, taskdetail := range taskdetails { //遍历每次任务结果 ts := taskStat{} - if validator, ok := validatorSet[taskdetail.sender]; ok { - fmt.Printf("task%d:%d OKtimes!\n", taskID, okCount) - okCount++ - + if validator, ok := validatorSet[taskdetail.sender]; ok { //能够在validator集合中找到sender pgp := validator.pgp - if _, ok := taskTotal[pgp]; ok { + if _, ok := taskTotal[pgp]; ok { //task2,3,4统计的时候需要用到task1中已经构建好的map + repeatsender = append(repeatsender, taskdetail.sender) ts = taskTotal[pgp] } switch taskID { case 1: - ts.task1 = true + if !ts.task1 { + ts.task1 = true + } else { + key := "TASK" + strconv.Itoa(taskID) + ":" + taskdetail.sender //说明此sender已经发送过交易,本次交易重复了 + repeatTxArr := repeatTxMap[key] + repeatTxArr = append(repeatTxArr, taskdetail) + repeatTxMap[key] = repeatTxArr + } + case 2: - ts.task2 = true + if !ts.task2 { + ts.task2 = true + } else { + key := "TASK" + strconv.Itoa(taskID) + ":" + taskdetail.sender + repeatTxArr := repeatTxMap[key] + repeatTxArr = append(repeatTxArr, taskdetail) + repeatTxMap[key] = repeatTxArr + } case 3: - ts.task3 = true + if !ts.task3 { + ts.task3 = true + } else { + key := "TASK" + strconv.Itoa(taskID) + ":" + taskdetail.sender + repeatTxArr := repeatTxMap[key] + repeatTxArr = append(repeatTxArr, taskdetail) + repeatTxMap[key] = repeatTxArr + } case 4: - ts.task4 = true + if !ts.task4 { + ts.task4 = true + } else { + key := "TASK" + strconv.Itoa(taskID) + ":" + taskdetail.sender + repeatTxArr := repeatTxMap[key] + repeatTxArr = append(repeatTxArr, taskdetail) + repeatTxMap[key] = repeatTxArr + } } taskTotal[pgp] = ts } else { - fmt.Printf("task%d:%d FAILtimes!\n", taskID, failOunt) - failOunt++ if _, ok := notValidatorSender[taskdetail.sender]; ok { ts = notValidatorSender[taskdetail.sender] } @@ -263,7 +278,24 @@ func senderMatchPGP(taskID int, taskdetails []taskDetail, taskTotal map[string]t case 4: ts.task4 = true } - notValidatorSender[taskdetail.sender] = ts + notValidatorSender[taskdetail.sender] = ts //不再验证人中的找不到pgp,就用sender作为key } } } + + +//拉取网络资源 +func fetch(url string) ([]byte, error) { + client := http.Client{} + request, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + request.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36") + resp, err := client.Do(request) + if err != nil { + return nil, err + } + defer resp.Body.Close() + return ioutil.ReadAll(resp.Body) +} From ce23a808280542ef2d564a32396852d1e7ddd669 Mon Sep 17 00:00:00 2001 From: "kenian.shi" <1035868500@qq.com> Date: Sun, 10 Nov 2019 19:07:34 +0800 Subject: [PATCH 3/4] Update verify.go --- nyancat/v0.16/verify.go | 176 +++++++++++++++++----------------------- 1 file changed, 75 insertions(+), 101 deletions(-) diff --git a/nyancat/v0.16/verify.go b/nyancat/v0.16/verify.go index 512582aa..3159649f 100644 --- a/nyancat/v0.16/verify.go +++ b/nyancat/v0.16/verify.go @@ -5,6 +5,7 @@ import ( "fmt" "io/ioutil" "net/http" + "sort" "strconv" ) @@ -19,6 +20,8 @@ const ( task4TP2 = "btc-eth" ) + + type validator struct { //用来将validator的pgp和ownkey进行匹配 moniker string ownKey string @@ -26,12 +29,21 @@ type validator struct { //用来将validator的pgp和ownkey进行匹配 } type taskDetail struct { //每次任务查询后返回的原始结果 + moniker string + pgpID string hash string sender string height string timestamp string } +type taskDetails []taskDetail //实现sort接口,利用原生golang sort库 +func (td taskDetails) Len() int {return len(td)} +func (td taskDetails) Swap(i,j int){td[i],td[j] = td[j],td[i]} +func (td taskDetails) Less(i,j int)bool{ + return td[i].timestamp < td[j].timestamp +} + type taskStat struct { //某个验证人四个任务是否完成 task1 bool task2 bool @@ -88,8 +100,8 @@ func init() { } //task1 task2的任务检查,输入url,返回为各个交易所需要的一些信息。 -func verifyTask12(url string) []taskDetail { - taskDetails := []taskDetail{} +func verifyTask12(url string) taskDetails { + taskDetails := taskDetails{} data, err := fetch(url) if err != nil { panic(err) @@ -99,8 +111,23 @@ func verifyTask12(url string) []taskDetail { if err != nil { panic(err) } - txs := m["txs"].([]interface{}) - + txs := []interface{}{} + totalPages,_ := strconv.Atoi(m["page_total"].(string)) + size,_ := strconv.Atoi(m["size"].(string)) + for i := 1; i <= totalPages;i++{ + url := fmt.Sprintf("%s&search_request_page=%d&search_request_size=%d",url,i,size) + data, err := fetch(url) + if err != nil { + panic(err) + } + m := make(map[string]interface{}) + err = json.Unmarshal(data, &m) + if err != nil { + panic(err) + } + tx := m["txs"].([]interface{}) + txs = append(txs, tx...) + } for _, tx := range txs { code := tx.(map[string]interface{})["result"].(map[string]interface{})["Code"].(float64) if code != 0 { @@ -109,7 +136,6 @@ func verifyTask12(url string) []taskDetail { hash := tx.(map[string]interface{})["hash"].(string) height := tx.(map[string]interface{})["height"].(string) timestamp := tx.(map[string]interface{})["timestamp"].(string) - tags := tx.(map[string]interface{})["result"].(map[string]interface{})["Tags"].([]interface{}) tagsMap := make(map[string]string) for _, tag := range tags { //将tags解析保存到缓存中,去除json文件格式中的属性名 @@ -124,6 +150,10 @@ func verifyTask12(url string) []taskDetail { sender: sender, timestamp: timestamp, //获取交易的sender } + if validator,ok := validatorSet[sender];ok{ + detail.moniker = validator.moniker + detail.pgpID = validator.pgp + } //fmt.Println(detail) taskDetails = append(taskDetails, detail) } @@ -133,8 +163,8 @@ func verifyTask12(url string) []taskDetail { //task3 task4 任务检查,输入url以及token-pairs名,由于可能存在btc-eth,或者eth-btc均可,返回完成任务交易的相关情况 -func verifyTask34(url, tokenPairs1, tokenPairs2 string) []taskDetail { - taskDetails := []taskDetail{} +func verifyTask34(url, tokenPairs1, tokenPairs2 string) taskDetails { + taskDetails := taskDetails{} data, err := fetch(url) if err != nil { panic(err) @@ -144,7 +174,23 @@ func verifyTask34(url, tokenPairs1, tokenPairs2 string) []taskDetail { if err != nil { panic(err) } - txs := m["txs"].([]interface{}) + size,_ := strconv.Atoi(m["size"].(string)) + totalPages,_ := strconv.Atoi(m["page_total"].(string)) + txs := []interface{}{} + for i := 1; i <= totalPages;i++{ //分页load,将所有信息拉取下来 + url := fmt.Sprintf("%s&search_request_page=%d&search_request_size=%d",url,i,size) + data, err := fetch(url) + if err != nil { + panic(err) + } + m := make(map[string]interface{}) + err = json.Unmarshal(data, &m) + if err != nil { + panic(err) + } + tx := m["txs"].([]interface{}) + txs = append(txs, tx...) + } for _, tx := range txs { code := tx.(map[string]interface{})["result"].(map[string]interface{})["Code"].(float64) if code != 0 { //只记录成功的交易 @@ -170,6 +216,10 @@ func verifyTask34(url, tokenPairs1, tokenPairs2 string) []taskDetail { sender: sender, timestamp: timestamp, } + if validator,ok := validatorSet[sender];ok{ + detail.moniker = validator.moniker + detail.pgpID = validator.pgp + } taskDetails = append(taskDetails, detail) } } @@ -177,112 +227,36 @@ func verifyTask34(url, tokenPairs1, tokenPairs2 string) []taskDetail { return taskDetails } - - func main() { - task1Details := verifyTask12(task1URL) - fmt.Printf("task1完成人数统计:%d \n", len(task1Details)) task2Details := verifyTask12(task2URL) - fmt.Printf("task2完成人数统计:%d \n", len(task2Details)) task3Details := verifyTask34(task3URL, task3TP1, task3TP2) - fmt.Printf("task3完成人数统计:%d \n", len(task3Details)) task4Details := verifyTask34(task4URL, task4TP1, task4TP2) - fmt.Printf("task4完成人数统计:%d \n", len(task4Details)) - - senderMatchPGP(1, task1Details) - senderMatchPGP(2, task2Details) - senderMatchPGP(3, task3Details) - senderMatchPGP(4, task4Details) - - fmt.Printf("从验证人人数统计:%d 人完成任务情况:\n", len(taskTotal)) - for k, v := range taskTotal { - fmt.Printf("%s %+v \n\n", k, v) + sort.Sort(task1Details) + fmt.Printf("task1完成人数统计:%d \n", len(task1Details)) + for i,v := range task1Details{ + fmt.Printf("【task1】%d: %+v\n",i,v) } - fmt.Printf("未从验证人中找到人数统计:%d 人完成任务\n", len(notValidatorSender)) - for k, v := range notValidatorSender { - fmt.Printf("%s %+v \n\n", k, v) + sort.Sort(task2Details) + fmt.Printf("task2完成人数统计:%d \n", len(task2Details)) + for i,v := range task2Details{ + fmt.Printf("【task2】%d: %+v\n",i,v) } - for k,v := range repeatTxMap { - fmt.Printf("sender:%s 重复交易次数:%d\n",k,len(v)) + sort.Sort(task3Details) + fmt.Printf("task3完成人数统计:%d \n", len(task3Details)) + for i,v := range task3Details{ + fmt.Printf("【task3】%d: %+v\n",i,v) } -} - -//将交易sender和PGP进行匹配 -//如果能匹配上,则pgp:{true,true,false,true} ,其中分别代表task1,2,3,4是否完成 -//如果匹配不上,则sender:{true,true,false,true} -func senderMatchPGP(taskID int, taskdetails []taskDetail) { - repeatsender := []string{} - for _, taskdetail := range taskdetails { //遍历每次任务结果 - ts := taskStat{} - if validator, ok := validatorSet[taskdetail.sender]; ok { //能够在validator集合中找到sender - pgp := validator.pgp - if _, ok := taskTotal[pgp]; ok { //task2,3,4统计的时候需要用到task1中已经构建好的map - repeatsender = append(repeatsender, taskdetail.sender) - ts = taskTotal[pgp] - } - switch taskID { - case 1: - if !ts.task1 { - ts.task1 = true - } else { - key := "TASK" + strconv.Itoa(taskID) + ":" + taskdetail.sender //说明此sender已经发送过交易,本次交易重复了 - repeatTxArr := repeatTxMap[key] - repeatTxArr = append(repeatTxArr, taskdetail) - repeatTxMap[key] = repeatTxArr - } - - case 2: - if !ts.task2 { - ts.task2 = true - } else { - key := "TASK" + strconv.Itoa(taskID) + ":" + taskdetail.sender - repeatTxArr := repeatTxMap[key] - repeatTxArr = append(repeatTxArr, taskdetail) - repeatTxMap[key] = repeatTxArr - } - case 3: - if !ts.task3 { - ts.task3 = true - } else { - key := "TASK" + strconv.Itoa(taskID) + ":" + taskdetail.sender - repeatTxArr := repeatTxMap[key] - repeatTxArr = append(repeatTxArr, taskdetail) - repeatTxMap[key] = repeatTxArr - } - case 4: - if !ts.task4 { - ts.task4 = true - } else { - key := "TASK" + strconv.Itoa(taskID) + ":" + taskdetail.sender - repeatTxArr := repeatTxMap[key] - repeatTxArr = append(repeatTxArr, taskdetail) - repeatTxMap[key] = repeatTxArr - } - } - taskTotal[pgp] = ts - } else { - if _, ok := notValidatorSender[taskdetail.sender]; ok { - ts = notValidatorSender[taskdetail.sender] - } - switch taskID { - case 1: - ts.task1 = true - case 2: - ts.task2 = true - case 3: - ts.task3 = true - case 4: - ts.task4 = true - } - notValidatorSender[taskdetail.sender] = ts //不再验证人中的找不到pgp,就用sender作为key - } + sort.Sort(task4Details) + fmt.Printf("task4完成人数统计:%d \n", len(task4Details)) + for i,v := range task4Details{ + fmt.Printf("【task4】%d: %+v\n",i,v) } -} +} //拉取网络资源 func fetch(url string) ([]byte, error) { From 2f689bc04fcca8934e2da2e615b96cc6c438acd2 Mon Sep 17 00:00:00 2001 From: "kenian.shi" <1035868500@qq.com> Date: Sun, 10 Nov 2019 19:43:11 +0800 Subject: [PATCH 4/4] Update verify.go --- nyancat/v0.16/verify.go | 42 ++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/nyancat/v0.16/verify.go b/nyancat/v0.16/verify.go index 3159649f..cb5fefd5 100644 --- a/nyancat/v0.16/verify.go +++ b/nyancat/v0.16/verify.go @@ -133,6 +133,7 @@ func verifyTask12(url string) taskDetails { if code != 0 { continue //只记录成功的交易 } + hash := tx.(map[string]interface{})["hash"].(string) height := tx.(map[string]interface{})["height"].(string) timestamp := tx.(map[string]interface{})["timestamp"].(string) @@ -233,32 +234,55 @@ func main() { task3Details := verifyTask34(task3URL, task3TP1, task3TP2) task4Details := verifyTask34(task4URL, task4TP1, task4TP2) sort.Sort(task1Details) - fmt.Printf("task1完成人数统计:%d \n", len(task1Details)) - for i,v := range task1Details{ + removeRepeat(task1Details) + uniSortTask1Details := removeRepeat(task1Details) + fmt.Printf("task1完成人数统计:%d \n", len(uniSortTask1Details)) + for i,v := range uniSortTask1Details{ fmt.Printf("【task1】%d: %+v\n",i,v) } sort.Sort(task2Details) - fmt.Printf("task2完成人数统计:%d \n", len(task2Details)) - for i,v := range task2Details{ + removeRepeat(task2Details) + uniSortTask2Details := removeRepeat(task2Details) + fmt.Println() + fmt.Printf("task2完成人数统计:%d \n", len(uniSortTask2Details)) + for i,v := range uniSortTask2Details{ fmt.Printf("【task2】%d: %+v\n",i,v) } sort.Sort(task3Details) - fmt.Printf("task3完成人数统计:%d \n", len(task3Details)) - for i,v := range task3Details{ + removeRepeat(task3Details) + uniSortTask3Details := removeRepeat(task3Details) + fmt.Println() + fmt.Printf("task3完成人数统计:%d \n", len(uniSortTask3Details)) + for i,v := range uniSortTask3Details{ fmt.Printf("【task3】%d: %+v\n",i,v) } sort.Sort(task4Details) - fmt.Printf("task4完成人数统计:%d \n", len(task4Details)) - for i,v := range task4Details{ + removeRepeat(task4Details) + uniSortTask4Details := removeRepeat(task4Details) + fmt.Println() + fmt.Printf("task4完成人数统计:%d \n", len(uniSortTask4Details)) + for i,v := range uniSortTask4Details{ fmt.Printf("【task4】%d: %+v\n",i,v) } +} +func removeRepeat(details taskDetails)taskDetails{ + m := make(map[string]string) + uniTaskDetails := taskDetails{} + for _,detail := range details { + if _,ok := m[detail.sender]; !ok{ + uniTaskDetails = append(uniTaskDetails, detail) + m[detail.sender]="exit" + } + } + return uniTaskDetails } -//拉取网络资源 + +//拉去网络资源 func fetch(url string) ([]byte, error) { client := http.Client{} request, err := http.NewRequest("GET", url, nil)