Вот подробности:
Код смарт-контракта (Go):
У меня есть смарт-контракт, развернутый в моей сети Fabric. Функция CreateContract работает следующим образом:
Эта функция создает новый контракт с предоставленными параметрами или выдает ошибку, если контракт уже существует.
func (s *SmartContract) CreateContract(ctx contractapi.TransactionContextInterface, contractId string, client string, supplier string, description string) (string, error) {
if contractId == "" {
return "", fmt.Errorf("Contract Id cannot be empty.")
}
if client == "" {
return "", fmt.Errorf("Client field cannot be empty.")
}
if supplier == "" {
return "", fmt.Errorf("Supplier field cannot be empty.")
}
chatAsBytes, err := ctx.GetStub().GetState(contractId)
if err != nil {
return "", fmt.Errorf("Failed to read from world state. %s", err.Error())
}
if chatAsBytes == nil {
newContract := LegalContractSchema{
DocType: "Legal Contract",
Participants: []string{client, supplier},
Description: description,
}
newContractAsBytes, _ := json.Marshal(newContract)
err := ctx.GetStub().PutState(contractId, newContractAsBytes)
if err != nil {
return "", fmt.Errorf("Failed writing to world state. %s", err.Error())
}
return "Successfully created contract", nil
} else {
return "", fmt.Errorf("Failed to create contract schema, contract already exists.")
}
}
Код Java SDK:
Я использую Java SDK для взаимодействия со смарт-контрактом. Мой код для вызова функции CreateContract выглядит следующим образом:
Gateway.Builder builder = Gateway.createBuilder()
.identity(wallet, "admin")
.networkConfig(networkConfigFile)
.discovery(true)
.commitTimeout(60, TimeUnit.SECONDS);
try (Gateway gateway = builder.connect()) {
Network network = gateway.getNetwork("mychannel");
Contract contract = network.getContract("legalContract");
// Submit a create transaction
byte[] createResult = contract.createTransaction("CreateContract")
.submit("contractId123", "ClientName", "SupplierName", "This is a test description");
System.out.println("Create Transaction Result: " + new String(createResult, StandardCharsets.UTF_8));
}
Транзакция запроса:
Транзакция запроса (GetLegalContractCert) отлично работает с использованием той же структуры кода Java:
byte[] queryResult = contract.evaluateTransaction("GetLegalContractCert", "contractId123");
System.out.println("Query Result: " + new String(queryResult, StandardCharsets.UTF_8));
Проблема:
Когда я вызываю функцию CreateContract, я получаю следующую ошибку:
Invalid transaction Contract Exception
Транзакция запроса работает нормально, но транзакция создания завершается с ошибкой.
Что я пробовал:
- Проверены входные аргументы: проверено, что значения контракта, клиента, поставщика и описания передаются в виде строк в кодировке UTF-8.
- Проверено Политика одобрения: проверено, что политика одобрения соответствует одноранговые узлы, используемые в транзакции.
- Отладка смарт-контракта: добавлена регистрация в функцию CreateContract, но не обнаружено никаких запусков журналов, что позволяет предположить, что транзакция не достигает смарт-контракта.< /li>
Увеличенное время ожидания: установите более длительное время ожидания для фиксации и доставки.
- Hyperledger Fabric: v2.4
- Java SDK: v2.4
- Go Smart Contract: API контракта Fabric
- Сеть: одноканальная (mychannel) с двумя организациями и двумя одноранговыми узлами.
{
"name": "test-network-org1",
"version": "1.0.0",
"client": {
"organization": "Org1",
"connection": {
"timeout": {
"peer": {
"endorser": "300"
}
}
}
},
"organizations": {
"Org1": {
"mspid": "Org1MSP",
"peers": [
"peer0.org1.example.com"
],
"certificateAuthorities": [
"ca.org1.example.com"
]
}
},
"peers": {
"peer0.org1.example.com": {
"url": "grpcs://localhost:7051",
"tlsCACerts": {
"pem": "-----BEGIN CERTIFICATE-----\XYF\n-----END CERTIFICATE-----\n"
},
"grpcOptions": {
"ssl-target-name-override": "peer0.org1.example.com",
"hostnameOverride": "peer0.org1.example.com"
}
}
},
"certificateAuthorities": {
"ca.org1.example.com": {
"url": "https://localhost:7054",
"caName": "ca-org1",
"tlsCACerts": {
"pem": ["-----BEGIN CERTIFICATE-----\XYZ\n-----END CERTIFICATE-----\n"]
},
"httpOptions": {
"verify": false
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... action-fai