- Регистрация
- 23.09.18
- Сообщения
- 12.347
- Реакции
- 176
- Репутация
- 0

В
You must be registered for see links
мы говорили о новой программной модели чейнкода в Hyperledger Fabric. И хотя релиз нового Go SDK ещё не состоялся, ничто не мешает нам уже сейчас посмотреть, что нас ждет в следующем релизе, и даже протестить это на тестовой сборке. Не всё ещё реализовано (как, например,
You must be registered for see links
), но планируемый дизайн программной модели уже ясен, так что давайте взглянем на него ближе.
You must be registered for see links
я немного изменил семпловую сетку, чтобы она запускалась с чейнкодом, который мы видели в предыдущей статье, и добавил простого клиента, написанного с использованием нового API. В репозитории есть простая инструкция по запуску и настройке сети.Как можно видеть в
You must be registered for see links
, для использования нового API мы берем не релиз (релиза ещё нет), а все изменения до конкретного коммита (это временная мера до выпуска релиза):require github.com/hyperledger/fabric-sdk-go v1.0.0-beta1.0.20200404205634-0e550fc1a918
В нашем приложении в
You must be registered for see links
импортируем пакет gateway"github.com/hyperledger/fabric-sdk-go/pkg/gateway"
Суть нового API в предоставлении единых для всех SDK (go, node, java) абстракций и уменьшение бойлерплейта, переносимого разработчиком из проекта в проект. Одна из таких абстракций — Wallet. Инициализация wallet'a выглядит так:
wallet, err := gateway.NewFileSystemWallet("wallet")
if err != nil {
fmt.Errorf(err.Error())
}
err = wallet.Put("admin", gateway.NewX509Identity("Org1MSP", string(cert), string(privKey)))
if err != nil {
fmt.Errorf(err.Error())
}
Wallet — это реализация интерфейса WalletStore:
type WalletStore interface {
Put(label string, stream []byte) error
Get(label string) ([]byte, error)
List() ([]string, error)
Exists(label string) bool
Remove(label string) error
}
Как видно, этот интерфейс описывает базовые операции с хранилищем
You must be registered for see links
пользователей. Кроме файловой системы identity можно хранить в памяти, просто используйте другую встроенную фабрику — NewInMemoryWallet().Подключаемся к сети:
gw, err := gateway.Connect(gateway.WithConfig(config.FromFile("./../connection-org1.yaml")),
gateway.WithIdentity(wallet, "admin"),
gateway.WithDiscovery(true),
gateway.WithCommitHandler(gateway.DefaultCommitHandlers.OrgAny))
gateway.Connect() возвращает указатель на Gateway — объект, предоставляющий подключение к сети. gateway.WithCommitHandler — функциональная опция для задания стратегии ожидания событий коммита. Пока не реализована никакая стратегия (значит будет использоваться
You must be registered for see links
стратегия «старого» SDK
You must be registered for see links
), но планируется следующее:- `gateway.DefaultCommitHandlers.OrgAll` — ожидание коммита на всех пирах организации (по умолчанию)
- `gateway.DefaultCommitHandlers.OrgAny` — ожидание коммита на любом пире организации
- `gateway.DefaultCommitHandlers.NetworkAll` — ожидание коммита на всех пирах всех организаций в канале
- `gateway.DefaultCommitHandlers.NetworkAny` — ожидание коммита на любом пире в канале
Можно даже не ждать вообще никаких коммитов, об этом далее, но сначала обратите внимание на это:
network, err := gw.GetNetwork("mychannel")
if err != nil {
panic(err)
}
contract := network.GetContract("mycc")
Здесь мы сначала получаем из канала подмножество пиров, с которыми будем взаимодействовать, а затем указатель на Contract, методы которого позволят нам взаимодействовать с чейнкодом.
Здесь у нас есть возможность определить, стоит ли вообще использовать какую-то стратегию ожидания коммита.
result, err := contract.SubmitTransaction("Create", "b", "50")
Здесь мы запускаем симуляцию транзакции на пире, получаем ответ, отправляем proposal response на orderer, дожидаемся валидации и коммита в соответствии с вышеопределенной стратегией ожидания коммита. Стандартное и знакомое поведение. Смотрим далее.
result, err := contract.EvaluateTransaction("Read", "b")
if err != nil {
panic(err)
}
fmt.Println(string(result))
Здесь клиент получает proposal response и не делает больше ничего. Следует использовать для чтения состояния.
transient := make(map[string][]byte)
transient["someTransient"] = []byte("mytransientdata")
txn, err := contract.CreateTransaction("Update", gateway.WithTransient(transient))
if err != nil {
panic(err)
}
result, err = txn.Submit("b", "100")
if err != nil {
panic(err)
}
contract.CreateTransaction дает чуть больше контроля над транзакцией, а именно возможность передать функциональные опции:
- gateway.WithTransient(transient) — для отправки приватных данных
- gateway.WithEndorsingPeers(«peer0.org1.example.com») — для ручного определения targets
На этом обзор нового API заканчивается. Кстати, имплементировать собственный wallet, commit handlers, identity достаточно легко, поэтому вы можете дополнить стандартные реализации тем, что соответствует вашим задачам, или предложить сообществу собственные идеи и код.
Спасибо за внимание.