نسيج Hyperledger الجديد: Go SDK Software Model



في مقال سابق ، تحدثنا عن نموذج البرمجة الجديد لكود الترميز في نسيج Hyperledger. على الرغم من أن إصدار Go SDK الجديد لم يتم بعد ، إلا أنه لا يوجد شيء يمنعنا الآن من رؤية ما ينتظرنا في المستقبل ، وحتى اختباره على مجموعة اختبار. لا يتم تنفيذ كل شيء (مثل معالجات الالتزام ) ، ولكن التصميم المخطط لنموذج البرنامج واضح بالفعل ، لذلك دعونا نلقي نظرة فاحصة عليه.

في هذا المستودع ، قمت بتعديل طفيف لشبكة العينة بحيث تبدأ برمز السلسلة الذي رأيناه في المقالة السابقة وأضفت عميلًا بسيطًا مكتوبًا باستخدام واجهة برمجة التطبيقات الجديدة. يحتوي المستودع على تعليمات بسيطة لبدء وتكوين الشبكة.

كما ترى في go.mod ، لاستخدام واجهة برمجة التطبيقات الجديدة ، لا نأخذ إصدارًا (لا يوجد إصدار حتى الآن) ، ولكن جميع التغييرات على التزام معين (هذا إجراء مؤقت قبل إصدار الإصدار): في تطبيقنا ، نستورد حزمة البوابة في app.go. جوهر واجهة برمجة التطبيقات الجديدة في تقديم ملخصات مشتركة لجميع حزم SDK (go ، node ، java) وتقليل الصفيحة المنقولة بواسطة المطور من مشروع إلى مشروع. أحد التجريد هو محفظة.

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



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

. تبدو تهيئة المحفظة كما يلي:

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
}

كما ترى ، تصف هذه الواجهة العمليات الأساسية مع مستودع هوية المستخدم. بالإضافة إلى نظام الملفات ، يمكن تخزين الهوية في الذاكرة ، فقط استخدم مصنعًا مدمجًا آخر - 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 - خيار وظيفي لوضع استراتيجية لانتظار أحداث الالتزام. حتى الآن لم يتم تنفيذ أي إستراتيجية (وهذا يعني أن الإستراتيجية الافتراضية لـ "القديمة" SDK "انتظار الالتزامات من جميع المؤيدين" سيتم استخدامها ) ، ولكن تم التخطيط لما يلي:

  • 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")

أولاً ، نحصل من القناة على مجموعة فرعية من الأقران الذين سنتفاعل معهم ، ثم مؤشر العقد ، الذي تسمح لنا طرقه بالتفاعل مع السلسلة.

الآن لدينا الفرصة لتحديد ما إذا كان سيتم استخدام نوع من الإستراتيجية في انتظار الالتزام. أولاً ، دعنا نلقي نظرة على معاملة تنتظر الالتزام:

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


هنا نبدأ محاكاة المعاملة على الأقران ، ونحصل على الجواب ، ونرسل استجابة الاقتراح إلى الطالب ، وننتظر التحقق من الصحة ونلتزم وفقًا للاستراتيجية المذكورة أعلاه لانتظار الالتزام. السلوك القياسي والمألوف. نحن ننظر إلى أبعد من ذلك.

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

في هذه الحالة ، يتلقى العميل ردًا على الاقتراح ولا يفعل أي شيء آخر. نحن لا نتوقع أي ارتكاب . يجب استخدام هذا لقراءة الحالة.

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)
}

العقد. إنشاء التحويل يعطي تحكمًا أكبر قليلاً في المعاملة ، أي القدرة على تمرير الخيارات الوظيفية:

  • gateway.WithTransient (عابر) - لإرسال البيانات الخاصة
  • gateway.WithEndorsingPeers ("peer0.org1.example.com") - لتحديد الأهداف يدويًا


حاول الاتصال app.go ، واستبدال المفاتيح والقيم والخيارات المختلفة في طرق المعاملات لمعرفة كيفية عمل ذلك.

وبهذا تنتهي مراجعة API الجديدة. بالمناسبة ، من السهل جدًا تنفيذ محفظتك الخاصة ، والالتزام بالمعالجات ، والهوية ، حتى تتمكن من إضافة عمليات التنفيذ القياسية إلى تلك التي تلبي أهدافك ، أو تقدم أفكارك ورمزك الخاص إلى المجتمع.

شكرا للانتباه.

All Articles