Fabric Hyperledger Baru: Go SDK Software Model



Dalam artikel sebelumnya, kami berbicara tentang model pemrograman baru dari codecode di Hyperledger Fabric. Meskipun rilis Go SDK baru belum terjadi, tidak ada yang menghalangi kita sekarang untuk melihat apa yang menanti kita di masa depan, dan bahkan mengujinya pada uji coba. Tidak semuanya masih dilaksanakan (seperti komit penangan ), tetapi desain yang direncanakan dari model perangkat lunak sudah jelas, jadi mari kita lihat lebih dekat.

Dalam repositori ini, saya sedikit memodifikasi kisi sampel sehingga dimulai dengan chaincode yang kami lihat di artikel sebelumnya dan menambahkan klien sederhana yang ditulis menggunakan API baru. Repositori memiliki instruksi sederhana untuk memulai dan mengkonfigurasi jaringan.

Seperti yang Anda lihat di go.mod , untuk menggunakan API baru, kami tidak mengambil rilis (belum ada rilis), tetapi semua perubahan pada komit tertentu (ini adalah tindakan sementara sebelum rilis rilis): Dalam aplikasi kami, kami mengimpor paket gateway di app.go Inti dari API baru dalam memberikan abstraksi umum untuk semua SDK (go, node, java) dan mengurangi pelat-pelat yang ditransfer oleh pengembang dari proyek ke proyek. Salah satu abstraksi tersebut adalah Wallet.

require github.com/hyperledger/fabric-sdk-go v1.0.0-beta1.0.20200404205634-0e550fc1a918



"github.com/hyperledger/fabric-sdk-go/pkg/gateway"

. Inisialisasi dompet terlihat seperti ini:

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 adalah implementasi dari antarmuka 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
}

Seperti yang Anda lihat, antarmuka ini menjelaskan operasi dasar dengan repositori identitas pengguna. Selain sistem file, identitas dapat disimpan dalam memori, cukup gunakan pabrik bawaan lain - NewInMemoryWallet () .

Terhubung ke jaringan:

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 () mengembalikan pointer ke Gateway , objek yang menyediakan konektivitas jaringan. gateway.DenganCommitHandler - opsi fungsional untuk menetapkan strategi untuk menunggu acara komit. Sejauh ini, belum ada strategi yang diterapkan (yang berarti bahwa strategi default dari "SDK" lama "menunggu komit dari semua endorser" akan digunakan ), tetapi berikut ini direncanakan:

  • gateway.DefaultCommitHandlers.OrgAll - tunggu komit di semua rekan organisasi (secara default)
  • gateway.DefaultCommitHandlers.OrgAny - menunggu komit di rekan organisasi mana pun
  • gateway.DefaultCommitHandlers.NetworkAll - menunggu komitmen di semua rekan semua organisasi di saluran
  • gateway.DefaultCommitHandlers.NetworkAny - menunggu komit di rekan mana pun di saluran

Anda bahkan tidak bisa menunggu sama sekali untuk komitmen apa pun, lebih dari itu nanti, tetapi pertama-tama perhatikan ini:

network, err := gw.GetNetwork("mychannel")
if err != nil {
	panic(err)
}

contract := network.GetContract("mycc")

Pertama, kita dapatkan dari saluran subset dari rekan-rekan yang dengannya kita akan berinteraksi, dan kemudian sebuah pointer ke Contract, yang metodenya akan memungkinkan kita untuk berinteraksi dengan chaincode.

Sekarang kita memiliki kesempatan untuk menentukan apakah akan menggunakan semacam strategi untuk menunggu komitmen atau tidak. Pertama, mari kita lihat transaksi dengan menunggu komit:

result, err := contract.SubmitTransaction("Create", "b", "50")


Di sini kita mulai simulasi transaksi di rekan, dapatkan jawabannya, kirim tanggapan proposal kepada pemesan, tunggu validasi dan komit sesuai dengan strategi di atas untuk menunggu komit. Perilaku standar dan akrab. Kami melihat lebih jauh.

result, err := contract.EvaluateTransaction("Read", "b")
	if err != nil {
		panic(err)
	}
fmt.Println(string(result))

Dalam hal ini, klien menerima respons proposal dan tidak melakukan apa pun. Kami tidak mengharapkan komitmen apa pun . Ini harus digunakan untuk membaca keadaan.

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 memberikan sedikit kontrol lebih besar atas transaksi, yaitu kemampuan untuk melewati opsi fungsional:

  • gateway.Dengan Transien (sementara) - untuk mengirim data pribadi
  • gateway.DenganEndorsingPeers ("peer0.org1.example.com") - untuk menentukan target secara manual


Coba panggil app.go , gantikan berbagai kunci, nilai, dan opsi menjadi metode transaksional untuk melihat cara kerjanya.

Ini menyimpulkan ulasan dari API baru. Ngomong-ngomong, sangat mudah untuk mengimplementasikan dompet Anda sendiri, melakukan penangan, identitas, sehingga Anda dapat menambahkan implementasi standar kepada orang-orang yang memenuhi tujuan Anda, atau menawarkan ide dan kode Anda sendiri kepada komunitas Anda.

Terimakasih atas perhatiannya.

All Articles