Установка и использование платформы
Клиент для 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()
}