یک بلاک چین در Golang از ابتدا بسازید

در این مقاله، ما بر روی توسعه بلاک چین Go از ابتدا تمرکز خواهیم کرد. با این حال، قبل از شروع، باید مطمئن شوید که با مفاهیم اولیه در Golang آشنا هستید. اگر نه، پس عاقلانه است که مفاهیم اولیه را مرور کنید و سپس به بلاک چین بازگردید. 

بنابراین، اجازه دهید مستقیماً به موضوع بپردازیم. 

شروع با یک فهرست جدید 

برای شروع یک دایرکتوری جدید می سازیم. اجازه دهید فرض کنیم که این فهرست دارای نام "blockchain" است. ما کد را در Command Prompt تایپ می کنیم (یا اگر از macOS یا Linux استفاده می کنید، باید از ترمینال استفاده کنید). بنابراین، ما تایپ می کنیم:

سی دی برو فضای کار 

بلاک چین mkdir 

بلاک چین سی دی 

کد .

با باز شدن کد VS، یک ماژول Go در Command Prompt ایجاد می کنیم. چگونه این کار را انجام دهیم؟ خوب، ما تایپ می کنیم:

برو مود init github.com/golang-company/blockchain

کد نویسی در main.go 

در مرحله بعد، یک فایل منبع Go به نام "main.go" ایجاد می کنیم و کد را در آن تایپ می کنیم. اما ابتدا اجازه دهید بفهمیم که بلاک چین چیست. آ بلاکچین ممکن است به عنوان یک پایگاه داده عمومی تعریف شود که غیرمتمرکز و بین چندین همتا توزیع شده است. بلاک چین به پایگاه داده اجازه می دهد تا خود اصلاح شود، حتی اگر یک گره داده های نادرست تولید کند. 

معمولاً یک بلوک در بلاک چین شامل داده هایی است که در پایگاه داده به اشتراک می گذاریم، یک هش و هش رمزنگاری بلوک قبلی. 

 بنابراین، آیا شما آماده هستید به توسعه بلاک چین بروید? عالی! بیا شروع کنیم. 

بخش برنامه نویسی 

در این بخش به بررسی فایل main.go می پردازیم. 

بسته اصلی

وارد كردن (

"بایت"

“crypto/sha256” 

"fmt" 

)

ساختار Cryptoblock {

هش [] بایت 

داده [] بایت 

PrevHash [] بایت 

}

  • همانطور که می بینید، یک ساختار فقط ایجاد شده است. 

func (c *Cryptoblock) BuildHash() {

جزئیات := bytes. Join([][] byte{c.Data، c.PrevHash}، []byte{}) 

هش := sha256.Sum256 (جزئیات)

ج.هش = هش[ : ]

}

  • اکنون روشی را می سازیم که به ما امکان می دهد بسته به داده ها و هش قبلی، هش تولید کنیم. ما کتابخانه "bytes" را وارد خواهیم کرد زیرا از آن استفاده خواهیم کرد.
  • مرحله بعدی ایجاد متغیری به نام جزئیات و استفاده از نوع داده بایت است. ما از Join() برای اتصال برش های بایت استفاده می کنیم.

جزئیات := bytes. Join([][] byte{c.Data، c.PrevHash}، []byte{}) 

در اینجا، ما یک تکه دوبعدی از بایت ها را می گیریم، c.Data و هش قبلی را ارسال می کنیم. سپس تکه خالی بایت ها را با هم ترکیب می کنیم. 

  • به دنبال این، ما در حال ایجاد کمک هش گرفتن واقعی از تابع هش sum256 در جزئیات هستیم. ما می توانیم از این استفاده کنیم زیرا کتابخانه sha256 را وارد می کنیم. 
  • سپس، هش ایجاد شده را به فیلد Hash برای بلاک فشار می دهیم. 

func BuildBlock (رشته داده، prevHash [] بایت) *Cryptoblock {

block := &Cryptoblock{[]byte{}، []byte(data)، prevHash}

block.BuildHash()

بلوک برگشتی

  • اکنون تابعی خواهیم ساخت که امکان ایجاد Block را فراهم می کند. تابع رشته ای از داده ها را به عنوان ورودی می پذیرد، prevHash را از بلوک قبلی به عنوان ورودی می پذیرد و سپس یک مرجع به Cryptoblock را خروجی می دهد. ما بلوک را با استفاده از سازنده بلوک خواهیم ساخت. 
  • &Cryptoblock به عنوان مرجع بلوک عمل می کند. برای فیلد Hash، یک تکه خالی از بایت ها را اضافه می کنیم. برای فیلد Data، رشته داده را می گیریم و آن را به تکه ای از بایت تبدیل می کنیم. و ما prevHash را در قسمت PrevHash قرار می دهیم. 
  • در نهایت، BuildHash() را در بلوک فراخوانی می کنیم و بلوک را برمی گردانیم. 

ساختار BlockChain {

بلوک []*Cryptoblock

}

  • نوعی که به بیان بلاک چین کمک کند مورد نیاز است. و ما یک ساختار برای انجام این کار پیاده سازی کردیم. نوع ساختار BlockChain از آرایه ای از اشاره گرها به Cryptoblock تشکیل شده است.

func (زنجیره *BlockChain) AddBlock (رشته داده) {

prevBlock := chain.blocks[len(chain.blocks)-1]

جدید := BuildBlock (داده ها، prevBlock.Hash)

chain.blocks = ضمیمه (chain.block، جدید)

}

  • در اینجا، ما در حال ایجاد روشی هستیم که به ما امکان می دهد یک بلوک را به زنجیره بپیوندیم. این روش نشانگر بلاک چین را بازیابی می کند. به دنبال این، یک رشته داده را می پذیرد. 
  • با فراخوانی chain.block به بلوک قبلی در بلاک چین می رسیم. بعد، طول بلاک چین [len(chain.blocks)-1] را رد کردیم.
  • در متغیر جدید، تابع BuildBlock را فراخوانی می کنیم و رشته داده و prevBlock.Hash را ارسال می کنیم.
  • با استفاده از تابع append، اضافه کردن آن به chain.block، سپس بلوک جدید را به بلاک چین متصل می کنیم.

Func Inception() *Cryptoblock {

بازگشت BuildBlock ("Inception"، []byte{})

}

  • مرحله بعدی ایجاد تابعی به نام Inception است که اولین بلوک بلاک چین را توصیف می کند. و یک BuildBlock جدید به همراه داده های بلوک اول را در تابع برمی گردانیم. اینجا. من "Inception" و تکه ای از بایت ها را وارد کرده ام که نشان دهنده هش خالی قبلی است. 

func InitBlockChain() *BlockChain {

بازگشت &BlockChain{[]*Cryptoblock{Inception()}}

}

  • برای ایجاد اولین بلاک چین، تابع InitBlockChain را معرفی کردم. در اینجا، من فقط مرجع خاص را به BlockChain برمی گردم. در مرحله بعد، یک آرایه از Cryptoblock ایجاد می کنیم، جایی که ما با تابع Inception تماس می گیریم. 

func main () {

زنجیره:= InitBlockChain()

chain.AddBlock ("اولین بلوک پس از شروع")

chain.AddBlock ("بلاک دوم پس از شروع")

chain.AddBlock ("بلاک سوم پس از آغاز")

برای _، block := range chain.blocks {

fmt.Printf("Hash قبلی: %x\n"، block.PrevHash)

fmt.Printf("داده در بلوک: %s\n"، block.Data)

fmt.Printf("Hash: %x\n"، block.Hash)

}

}

  • بالاخره به تابع اصلی رسیدیم. همانطور که می بینید ما InitBlockChain() را فراخوانی کرده ایم و آن را به متغیر chain اختصاص داده ایم. 
  • بعد از طریق chain.AddBlock بلوک ها را به زنجیره اضافه می کنیم و داده های لازم را ارسال می کنیم. 
  • پس از این، ما یک حلقه for را برای بررسی بلاک چین اجرا می کنیم. سپس هر بلوک را جدا می کنیم و فیلدهای داخل هر بلوک را چاپ می کنیم. ما فقط تایپ می کنیم:

fmt.Printf("Hash قبلی: %x\n"، block.PrevHash)

fmt.Printf("داده در بلوک: %s\n"، block.Data)

fmt.Printf("Hash: %x\n"، block.Hash)

خروجی: 

بنابراین، می توان گفت که برنامه موفق است. امیدوارم توانسته باشید اجرای مفهوم بلاک چین در Golang را درک کنید. فقط به تمرین ادامه دهید و می توانید پروژه های پیچیده را مدیریت کنید. 

رمز ارز شما شایسته بهترین امنیت است. گرفتن یک کیف پول سخت افزاری لجر فقط ۷۹ دلار!

منبع: https://coinfomania.com/build-a-blockchain-in-golang/