قم ببناء Blockchain في Golang من Scratch

في هذه المقالة ، سنركز على تطوير Go blockchain من البداية. ومع ذلك ، قبل أن نبدأ ، يجب أن تتأكد من أنك على دراية بالمفاهيم الأساسية في Golang. إذا لم يكن الأمر كذلك ، فمن الحكمة أن تذهب من خلال المفاهيم الأولية ثم تعود إلى blockchain. 

لذا ، دعونا ننتقل مباشرة إلى الموضوع. 

البدء بدليل جديد 

سنقوم ببناء دليل جديد لتبدأ به. لنفترض أن هذا الدليل يحمل الاسم "blockchain". سنقوم بكتابة الكود في موجه الأوامر (أو إذا كنت تستخدم macOS أو Linux ، فيجب عليك استخدام Terminal). وهكذا نكتب:

مساحة عمل القرص المضغوط 

مكدير بلوكشين 

بلوكشين cd 

الشفرة .

عند فتح رمز VS ، سننشئ وحدة Go في موجه الأوامر. كيف نفعل ذلك؟ حسنًا ، نكتب:

انتقل إلى mod init github.com/golang-company/blockchain

الترميز في main.go 

بعد ذلك ، سننشئ ملف Go المصدر باسم "main.go" وسنكتب الكود فيه. لكن أولاً ، دعونا نفهم ما هو blockchain. أ سلسلة كتلة يمكن تعريفها على أنها قاعدة بيانات عامة لا مركزية ويتم توزيعها بين العديد من الأقران. يسمح Blockchain لقاعدة البيانات بالتصحيح الذاتي ، حتى إذا كانت العقدة تنتج بيانات غير دقيقة. 

عادةً ما تتكون الكتلة الموجودة على blockchain من البيانات التي نشاركها في قاعدة البيانات ، والتجزئة ، وتجزئة التشفير السابقة. 

 لذا ، هل أنت مستعد ل انتقل إلى تطوير blockchain؟ رائعة! هيا بنا نبدأ. 

جزء البرمجة 

في هذا القسم ، سننظر في ملف main.go. 

الحزمة الرئيسية

يستورد (

"بايت"

"crypto / sha256" 

"Fmt" 

)

اكتب Cryptoblock Struct {

تجزئة [] بايت 

البيانات [] بايت 

الهاش [] بايت 

}

  • كما ترى ، تم إنشاء الهيكل فقط. 

func (c * Cryptoblock) BuildHash () {

التفاصيل: = bytes.Join ([] [] بايت {c.Data، c.PrevHash} ، [] بايت {}) 

التجزئة: = sha256.Sum256 (تفاصيل)

c.Hash = التجزئة [:]

}

  • سنقوم الآن ببناء طريقة تمكننا من إنشاء تجزئة اعتمادًا على البيانات والتجزئة السابقة. سنقوم باستيراد مكتبة "بايت" لأننا سنستخدمها.
  • الخطوة التالية هي إنشاء متغير يسمى التفاصيل واستخدام نوع البيانات بايت. سنستخدم Join () لتوصيل شرائح البايت.

التفاصيل: = bytes.Join ([] [] بايت {c.Data، c.PrevHash} ، [] بايت {}) 

هنا ، نأخذ شريحة ثنائية الأبعاد من البايتات ، وننقل c.Data والتجزئة السابقة. ثم سنجمع شريحة البايت الفارغة. 

  • بعد ذلك ، نقوم بإنشاء التجزئة الفعلية بمساعدة دالة التجزئة sum256 على التفاصيل. يمكننا استخدام هذا لأننا سنستورد مكتبة sha256. 
  • بعد ذلك ، ندفع التجزئة التي تم إنشاؤها إلى حقل التجزئة الخاص بالكتلة. 

func BuildBlock (سلسلة بيانات ، prevHash [] بايت) * Cryptoblock {

block: = & Cryptoblock {[] بايت {} ، [] بايت (بيانات) ، prevHash}

block.BuildHash ()

كتلة العودة

  • سنقوم الآن ببناء وظيفة تمكن من إنشاء Block. تقبل الوظيفة سلسلة من البيانات كمدخلات ، prevHash من الكتلة السابقة كمدخلات ، ثم تُخرج مرجعًا إلى Cryptoblock. سنقوم ببناء الكتلة باستخدام مُنشئ الكتلة. 
  • يعمل & Cryptoblock كمرجع للكتلة. بالنسبة إلى حقل التجزئة ، نقوم بدمج شريحة فارغة من البايت. بالنسبة لحقل البيانات ، نأخذ سلسلة البيانات ونحولها إلى شريحة من البايت. ونقوم بدمج prevHash في حقل PrevHash. 
  • أخيرًا ، نسمي BuildHash () على الكتلة ونعيد الكتلة. 

اكتب بنية BlockChain {

كتل [] * Cryptoblock

}

  • مطلوب نوع يساعد في التعبير عن blockchain. وقمنا بتنفيذ هيكل لتحقيق ذلك. تتكون بنية BlockChain من مجموعة من المؤشرات إلى Cryptoblock.

func (chain * BlockChain) AddBlock (سلسلة بيانات) {

prevBlock: = chain.blocks [لين (chain.blocks] -1]

الجديد: = BuildBlock (data، prevBlock.Hash)

chain.blocks = append (chain.blocks ، new)

}

  • هنا ، نقوم بإنشاء طريقة تمكننا من ضم كتلة إلى السلسلة. تسترد الطريقة مؤشر blockchain. بعد ذلك ، فإنه يقبل سلسلة البيانات. 
  • استدعاء chain.blocks ، نصل إلى الكتلة السابقة في blockchain. بعد ذلك ، مررنا طول blockchain [len (chain.blocks) -1].
  • في المتغير الجديد ، نستدعي وظيفة BuildBlock ونمرر سلسلة البيانات و prevBlock.Hash.
  • من خلال استخدام وظيفة الإلحاق ، وإضافتها إلى chain.blocks ، نقوم بعد ذلك بإرفاق الكتلة الجديدة بـ blockchain.

func Inception () * Cryptoblock {

إرجاع BuildBlock ("Inception" ، [] بايت {})

}

  • الخطوة التالية هي إنشاء وظيفة تسمى Inception تصف الكتلة الأولى من blockchain. وسنعيد BuildBlock جديدًا في الوظيفة ، جنبًا إلى جنب مع البيانات الموجودة في الكتلة الأولى. هنا. لقد قمت بدمج "Inception" وشريحة بايت تمثل تجزئة سابقة فارغة. 

func InitBlockChain () * BlockChain {

إرجاع & BlockChain {[] * Cryptoblock {Inception ()}}

}

  • من أجل إنشاء أول blockchain ، قمت بإدخال وظيفة InitBlockChain. هنا ، سأعيد فقط الإشارة المحددة إلى BlockChain. بعد ذلك ، نقوم ببناء مجموعة من Cryptoblock ، حيث نقوم بإجراء استدعاء لوظيفة Inception. 

func main () {

السلسلة: = InitBlockChain ()

chain.AddBlock ("الكتلة الأولى بعد التأسيس")

chain.AddBlock ("الكتلة الثانية بعد التأسيس")

chain.AddBlock ("الكتلة الثالثة بعد التأسيس")

لـ _ ، block: = range chain.blocks {

fmt.Printf ("التجزئة السابقة:٪ x \ n"، block.PrevHash)

fmt.Printf ("البيانات الموجودة في الكتلة:٪ s \ n" ، block.Data)

fmt.Printf ("التجزئة:٪ x \ n"، block.Hash)

}

}

  • أخيرًا ، وصلنا إلى الوظيفة الرئيسية. كما ترى ، أطلقنا على InitBlockChain () وقمنا بتعيينه لمتغير السلسلة. 
  • بعد ذلك ، نضيف الكتل إلى السلسلة عبر السلسلة AddBlock ، ونمرر البيانات اللازمة. 
  • بعد ذلك ، نقوم بتشغيل حلقة for للتحقق من blockchain. ثم نفرد كل كتلة ونطبع الحقول داخل كل كتلة. نحن فقط نكتب:

fmt.Printf ("التجزئة السابقة:٪ x \ n"، block.PrevHash)

fmt.Printf ("البيانات الموجودة في الكتلة:٪ s \ n" ، block.Data)

fmt.Printf ("التجزئة:٪ x \ n"، block.Hash)

الإخراج: 

لذلك يمكننا القول إن البرنامج ناجح. أتمنى أن تكون قادرًا على فهم تطبيق مفهوم blockchain في Golang. فقط استمر في التدريب وستكون قادرًا على التعامل مع المشاريع المعقدة. 

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

المصدر: https://coinfomania.com/build-a-blockchain-in-golang/