Установка и использование платформы

Клиент для WE contract SDK (Java/Kotlin Contract SDK)

В этом разделе описан Клиент для WE contract SDK. Клиент для контрактов используется для взаимодействия с контрактами из бэкенд-кода Java/Kotlin-приложений.

Основные абстракции

  • ContractBlockingClientFactory – фабрика для создания клиента для контракта;

  • NodeBlockingServiceFactory – фабрика, которая создает сервисы для взаимодействия с нодой;

  • TxService – интерфейс для работы с транзакциями на ноде;

  • TxSigner – интерфейс для подписания транзакций на ноде;

  • ConverterFactory – фабрика для создания сервисов для преобразования значений при работе с состоянием;

  • ContractToDataValueConverter – интерфейс для преобразования значений в объекты DataValue;

  • ContractFromDataEntryConverter – интерфейс для преобразования значений Data Entry из состояния;

  • ContractClientParams – класс для настроек создаваемого клиента;

  • ContractSignRequestBuilder – конструктор SignRequest(transaction); создает объект создания контракта (103-я транзакция) или объект вызова контракта (104-я транзакция).

Быстрый старт

Для создания клиента для WE contract SDK выполните следующие шаги.

Примечание

Все примеры, приведённые ниже, доступны в GitHub-репозитории Конфидент. Помимо этого в GitHub-репозитории Конфидент представлены примеры

1. Создайте и настройте службы для работы с нодой:

val objectMapper = ObjectMapper()
 .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
 .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
 .registerModule(JavaTimeModule())
 .registerModule(
     KotlinModule.Builder()
         .configure(KotlinFeature.NullIsSameAsDefault, true)
         .build()
)
val converterFactory = JacksonConverterFactory(objectMapper)
val feignNodeClientParams = FeignNodeClientParams(
    url = "{node.url}",
    decode404 = true,
    connectTimeout = 5000L,
    readTimeout = 3000L,
    loggerLevel = Logger.Level.FULL,
)
val feignTxService = FeignTxService(
    weTxApiFeign = FeignWeApiFactory.createClient(
        clientClass = WeTxApiFeign::class.java,
        feignProperties = feignNodeClientParams,
    )
)
val feignNodeServiceFactory = FeignNodeServiceFactory(
    params = feignNodeClientParams
)
val contractProperties = ContractProperties(
    senderAddress = "",
    fee = 0L,
    contractId = "contractId",
    contractVersion = 1,
    version = 1,
    image = "image",
    imageHash = "imageHash",
    contractName = "contractName",
)
val contractClientParams = ContractClientParams(localValidationEnabled = true)
val contractSignRequestBuilder = ContractSignRequestBuilder()
    .senderAddress(Address.fromBase58(contractProperties.senderAddress))
    .fee(Fee(0L))
    .contractId(ContractId.fromBase58(contractProperties.contractId))
    .contractVersion(ContractVersion(contractProperties.contractVersion))
    .version(TxVersion(contractProperties.version))
    .image(ContractImage(contractProperties.image))
    .imageHash(Hash.fromHexString(contractProperties.imageHash))
    .contractName(ContractName(contractProperties.contractName))
val contractClientParams = ContractClientParams(localValidationEnabled = true)

2. Сформируйте данные транзакции:

 val contractSignRequestBuilder = ContractSignRequestBuilder()
.senderAddress(Address.fromBase58(contractProperties.senderAddress))
.fee(Fee(0L))
.contractId(ContractId.fromBase58(contractProperties.contractId))
.contractVersion(ContractVersion(contractProperties.contractVersion))
.version(TxVersion(contractProperties.version))
.image(ContractImage(contractProperties.image))
.imageHash(Hash.fromHexString(contractProperties.imageHash))
.contractName(ContractName(contractProperties.contractName))

3. Создайте фабрику клиента для контракта и настройте ее:

val contractFactory = ContractBlockingClientFactory(
   contractClass = TestContractImpl::class.java,
   contractInterface = TestContract::class.java,
   converterFactory = converterFactory,
   contractClientProperties = contractClientParams,
   contractSignRequestBuilder = contractSignRequestBuilder,
   nodeBlockingServiceFactory = nodeBlockingServiceFactory,
)

4. Создайте TxSigner

val txServiceTxSigner = TxServiceTxSignerFactory(
  txService = feignTxService,
)

5. Создайте и вызовите методы клиента

val executionContext: ExecutionContext = contractFactory.executeContract(
txSigner = txSigner) { contract ->
    contract.create()
}