ImportCryptocurrency
channe: cryptocurrencychannel chaincode: cryptocurrencyCC function: importCryptocurrency
Функции должны возращать ошибку, но не сообщение об ошибке, вместо:
// сохранение времени отработки шедулера func (t *CryptocurrencyChaincode) saveLastImportTime(invokeTime int64, stub ChaincodeStubInterfaceAdapter) string { invokeTimeByteArray := make([]byte, 8) binary.LittleEndian.PutUint64(invokeTimeByteArray, uint64(invokeTime)) err := stub.PutState(LAST_IMPORT_TIME, invokeTimeByteArray) if err != nil { return err.Error() } return ""; }
принято делать
// сохранение времени отработки шедулера func (t *CryptocurrencyChaincode) saveLastImportTime(invokeTime int64, stub ChaincodeStubInterfaceAdapter) err { invokeTimeByteArray := make([]byte, 8) binary.LittleEndian.PutUint64(invokeTimeByteArray, uint64(invokeTime)) err := stub.PutState(LAST_IMPORT_TIME, invokeTimeByteArray) if err != nil { return err } return nil; } ^^^^ Это только пример, все остальные функции тоже нужно поменять.
Я не до конца понимаю логику этого чейнкода пока, но следующая функция мне кажется не отработает так как задуманно:
// проверка времени отработки шедулера func (t *CryptocurrencyChaincode) checkLastImportTime(stub ChaincodeStubInterfaceAdapter) (int64, string) { lastImportTimeByteArray, err := stub.GetState(LAST_IMPORT_TIME) if err != nil { errMsg := fmt.Sprintf("Failed to retreive LAST_IMPORT_TIME. %s", err) logger.Error(errMsg) return -1, errMsg } invokeTime := time.Now().UnixNano() / 1000000 var lastImportTime int64 if lastImportTimeByteArray == nil { lastImportTime = invokeTime; } else { lastImportTime = int64(binary.LittleEndian.Uint64(lastImportTimeByteArray)) } if invokeTime > lastImportTime+WAITING_SECONDS { needToWait := invokeTime - (lastImportTime + WAITING_SECONDS) errMsg := fmt.Sprintf("You need to wait to %d seconds", needToWait) logger.Error(errMsg) return -1, errMsg } return invokeTime, ""; }
Я так понимаю функция проверяет прошло ли достаточно времени, для того чтобы заново загрузить/обновить данные о криптовалютах. Но
if invokeTime > lastImportTime+WAITING_SECONDS { needToWait := invokeTime - (lastImportTime + WAITING_SECONDS) errMsg := fmt.Sprintf("You need to wait to %d seconds", needToWait) logger.Error(errMsg) return -1, errMsg }
мне кажется должно быть
if invokeTime < lastImportTime+WAITING_SECONDS
чтобы убедиться, что еще не прошло достаточно времени между последним разом и вызовом, т.е. это должно бытьif (invokeTime - lastImportTime) < WAITING_SECONDS
если разница между текущим временем и предыдущим вызовом меньше чемWAITING_SECONDS
. Я что-то упускаю?Также мне кажется что
needToWait := invokeTime - (lastImportTime + WAITING_SECONDS)
Должно быть
needToWait := WAITING_SECONDS - (invokeTime - lastImportTime)
мы же считаем сколько нам осталось еще подождать, так?
- Resolved by Yury
- Resolved by Yury
- Resolved by Yury
- Resolved by Yury
- Resolved by Yury
- Resolved by Yury
added 1 commit
- 7b73571d - добавил InvokeChaincode: CheckAccountChaincode, CheckAndLoadExternalWalletFunction, AccountChannel
- Resolved by Yury
- Resolved by Yury
- Resolved by Yury
- Resolved by Yury
mentioned in commit f4e48127