Как сохранить закрытый ключ в государственной книге Hyperledger Fabric

У меня возникла проблема с сохранением сгенерированного закрытого ключа ecdsa в базе данных Hyperledger Fabric.

Я использую функцию ecdsa.GenerateKey(elliptic.P224(), rand.Reader), которую предоставляет ecdsa, и пытаюсь сохранить этот ключ в леджере с помощью функции shim PutState(). Тип переменной, находящейся в структуре, — ecdsa.PrivateKey, но когда я пытаюсь, кажется, что цепной код останавливается и появляется следующая ошибка:

Ошибка: не удалось собрать транзакцию: ProposalResponsePayloads не совпадают — ответ предложения: версия: 1 ответ:

Конечно, это указывает на то, что чейнкод не установлен в обоих одноранговых узлах Организации. Но у меня есть. Затем я попытался преобразовать ecdsa.PrivateKey в байты, а затем в строку, но, похоже, ничего не работает. Я прикреплю код ниже.

    type UserDetails struct {
ObjectType string          `json:"docType"`
FirstName  string          `json:"firstName"`
LastName   string          `json:"lastName"`
PublicKey  ecdsa.PublicKey `json:"publicKey"`
PrivateKey []byte          `json:"privateKey"`
    }

Это выше моя структура

    priv, err := ecdsa.GenerateKey(elliptic.P224(), rand.Reader)
if err != nil {
    fmt.Println(err)
}

enc_key := priv.D.Bytes()
fmt.Println(enc_key)

bytesPrivK := string(enc_key)



objectType := "userDetails"
userDetailsReg := &UserDetails{objectType, firstName, lastName, *ecdsaPublicKey, enc_key}
userDetailsJSONasBytes, err := json.Marshal(userDetailsReg)
if err != nil {
    return shim.Error(err.Error())
}
fmt.Println(userDetailsReg)
// === Save userDetails to state ===
err = stub.PutState(lastName, userDetailsJSONasBytes)
if err != nil {
    return shim.Error(err.Error())
}

Я также попытался с помощью пакета ecies сгенерировать закрытый ключ ecies, затем преобразовать его в ecdsa и сохранить, но все равно такая же ошибка. Я использовал ecies, потому что мне нужно зашифровать сообщение с помощью шифрования ecies.

prv, err := ecies.GenerateKey(rand.Reader, ecies.DefaultCurve, nil)
if err != nil {
    fmt.Println(err.Error())
}

eciesPrivatePem, err1 := ecies.MarshalPrivate(prv)
if err1 != nil {
    fmt.Println(err1)
}
encodedToStr := string(eciesPrivatePem)

ecdsaPrivate := prv.ExportECDSA()

Здесь я пытался либо сохранить тип ecies.PrivateKey, либо строку, либо даже ecdsa.PrivateKey, но всегда получал одну и ту же ошибку.

Для этого я использую Hyperledger Fabric и CouchDB. Кто-нибудь знает, почему я не могу сохранить это даже в виде строки? Кажется действительно странным, что даже в виде строки ее нельзя сохранить, хотя две другие переменные являются строками и 1 типами ecdsa.PublicKey. Я не могу найти какую-либо другую ошибку в журналах, которая указывает здесь на что-то большее.

Любая помощь или рекомендация будут оценены.

Спасибо


person user3882720    schedule 13.08.2019    source источник


Ответы (1)


Я узнал, что проблема действительно была создана от сверстников. Ошибка политики одобрения, которую я получал, связана с коллегами, и мне было трудно найти решение.

Итак, проблема заключалась в том, что в моем чейнкоде я хранил ключ в леджере, который был сгенерирован с помощью функции, которой я должен был передать в качестве параметра случайную переменную: rand io.Reader

Эта случайная переменная создавалась каждый раз в каждом узле по-разному, что вызывало конфликт между узлами.

В заключение, имейте в виду, что каждый раз, когда вы создаете чейнкод и запускаете его, вы устанавливаете его на двух или более пирах, и каждый пир запускает чейнкод по-разному! Очень важно.

Спасибо.

person user3882720    schedule 14.08.2019