گو کا استعمال کرتے ہوئے انڈسٹری کے لیے بلاک چین کی ترقی۔ حصہ 1

اب میں چار مہینوں سے "بلاک چین کی بنیاد پر سرکاری اور صنعتی شعبوں میں ڈیٹا پروٹیکشن اور مینجمنٹ ٹولز کی ترقی" نامی پروجیکٹ پر کام کر رہا ہوں۔
اب میں آپ کو بتانا چاہوں گا کہ میں نے یہ پروجیکٹ کیسے شروع کیا، اور اب میں پروگرام کوڈ کو تفصیل سے بیان کروں گا۔

گو کا استعمال کرتے ہوئے انڈسٹری کے لیے بلاک چین کی ترقی۔ حصہ 1

مضامین کے سلسلے میں یہ پہلا مضمون ہے۔ یہاں میں سرور اور پروٹوکول کی وضاحت کرتا ہوں۔ درحقیقت، قاری ان بلاکچین عناصر کے اپنے ورژن بھی لکھ سکتا ہے۔

اور یہاں دوسرا حصہ ہے۔ - بلاکچین اور لین دین کے ڈیٹا ڈھانچے کے بارے میں، نیز اس پیکیج کے بارے میں جو ڈیٹا بیس کے ساتھ تعامل کو نافذ کرتا ہے۔

پچھلے سال، ڈیجیٹل بریک تھرو ہیکاتھون میں، انہوں نے ڈسٹری بیوٹڈ لیجر ٹیکنالوجی کا استعمال کرتے ہوئے صنعت اور ڈیجیٹل معیشت کے لیے ایک مفید نظام بنانے کا خیال پیش کیا؛ انوویشن اسسٹنس فنڈ کی طرف سے ترقی کے لیے ایک گرانٹ بھی جاری کیا گیا تھا (مجھے ایک الگ سے لکھنا چاہیے۔ گرانٹ کے بارے میں مضمون، ان لوگوں کے لیے جو ابھی اسٹارٹ اپ کرنا شروع کر رہے ہیں ) اور اب ترتیب سے۔

ترقی گو زبان میں ہوتی ہے، اور ڈیٹا بیس جس میں بلاکس کو محفوظ کیا جاتا ہے وہ لیول ڈی بی ہے۔
اہم حصے پروٹوکول ہیں، سرور (جو TCP اور WebSocket چلاتا ہے - پہلا بلاکچین کو سنکرونائز کرنے کے لیے، دوسرا کلائنٹس کو جوڑنے، لین دین اور جاوا اسکرپٹ سے کمانڈ بھیجنے کے لیے، مثال کے طور پر۔

جیسا کہ ذکر کیا گیا ہے، اس بلاکچین کی ضرورت بنیادی طور پر سپلائرز اور صارفین کے درمیان مصنوعات کے تبادلے کو خودکار اور تحفظ فراہم کرنے کے لیے ہے، یا دونوں ایک شخص میں۔ ان لوگوں کو ایک دوسرے پر بھروسہ کرنے کی کوئی جلدی نہیں ہے۔ لیکن کام نہ صرف بلٹ ان کیلکولیٹر کے ساتھ ایک "چیک بک" بنانا ہے، بلکہ ایک ایسا نظام ہے جو پروڈکٹ لائف سائیکل کے ساتھ کام کرتے وقت پیدا ہونے والے زیادہ تر معمول کے کاموں کو خودکار کرتا ہے۔ بائیک کوڈ جو اس معاملے کے لیے ذمہ دار ہے، جیسا کہ بلاک چینز کا رواج ہے، لین دین کے ان پٹ اور آؤٹ پٹس میں محفوظ کیا جاتا ہے (لین دین خود بلاکس میں محفوظ ہوتے ہیں، LevelDB میں بلاکس GOB فارمیٹ میں پہلے سے انکوڈ ہوتے ہیں)۔ سب سے پہلے، آئیے پروٹوکول اور سرور (عرف نوڈ) کے بارے میں بات کرتے ہیں۔

پروٹوکول پیچیدہ نہیں ہے، اس کا پورا نقطہ کچھ ڈیٹا لوڈ کرنے کے موڈ پر سوئچ کرنا ہے، عام طور پر ایک بلاک یا ٹرانزیکشن، ایک خاص کمانڈ لائن کے جواب میں، اور انوینٹری کے تبادلے کے لیے بھی اس کی ضرورت ہوتی ہے، تاکہ نوڈ کو معلوم ہو کہ یہ کون ہے۔ سے منسلک ہے اور ان کا کاروبار کیسے کرنا ہے (ہم وقت سازی کے سیشن کے لیے جڑے ہوئے نوڈس کو "پڑوسی" بھی کہا جاتا ہے کیونکہ ان کا IP معلوم ہوتا ہے اور ان کا اسٹیٹ ڈیٹا میموری میں محفوظ ہوتا ہے)۔

گو پروگرامرز کی سمجھ میں فولڈرز (ڈائریکٹریز جیسا کہ لینکس ان کو کہتے ہیں) کو پیکجز کہا جاتا ہے، اس لیے اس ڈائرکٹری کے گو کوڈ کے ساتھ ہر فائل کے شروع میں وہ پیکیج فولڈر_نام_where_this_file واقع ہے لکھتے ہیں۔ بصورت دیگر، آپ کمپائلر کو پیکج نہیں کھلا سکیں گے۔ ٹھیک ہے، یہ زبان جاننے والوں کے لیے کوئی راز نہیں ہے۔ یہ پیکیجز ہیں:

  • نیٹ ورک مواصلات (سرور، کلائنٹ، پروٹوکول)
  • ذخیرہ شدہ اور منتقل شدہ ڈیٹا کے ڈھانچے (بلاک، لین دین)
  • ڈیٹا بیس (بلاک چین)
  • اتفاق رائے
  • اسٹیکڈ ورچوئل مشین (xvm)
  • معاون (کرپٹو، اقسام) ابھی کے لیے بس۔

گیتھب کا لنک یہ ہے۔

یہ ایک تعلیمی ورژن ہے، اس میں بین العمل تعامل اور کئی تجرباتی اجزاء کی کمی ہے، لیکن ڈھانچہ اس سے مطابقت رکھتا ہے جس پر ترقی کی جا رہی ہے۔ اگر آپ کے پاس تبصرے میں تجویز کرنے کے لئے کچھ ہے تو، مجھے مزید ترقی میں اس کا خیال رکھنے میں خوشی ہوگی۔ اور اب سرور کی وضاحت کے لیے اور پروٹوکول.

آئیے پہلے سرور کو دیکھتے ہیں۔

سرور سب روٹین ایک ڈیٹا سرور کے طور پر کام کرتا ہے جو پروٹوکول پیکیج سے ڈیٹا ڈھانچے کا استعمال کرتے ہوئے TCP پروٹوکول کے اوپر چلتا ہے۔

روٹین مندرجہ ذیل پیکیجز کا استعمال کرتی ہے: سرور, پروٹوکول, اقسام. پیکج میں ہی tcp_server.go ڈیٹا ڈھانچہ پر مشتمل ہے۔ خدمت.

type Serve struct {
	Port string
	BufSize int
	ST *types.Settings
}

یہ مندرجہ ذیل پیرامیٹرز کو قبول کر سکتا ہے:

  • نیٹ ورک پورٹ جس کے ذریعے ڈیٹا کا تبادلہ کیا جائے گا۔
  • JSON فارمیٹ میں سرور کنفیگریشن فائل
  • ڈیبگ موڈ میں چلنے کے لیے جھنڈا لگائیں (نجی بلاکچین)

پیش رفت:

  • JSON فائل سے کنفیگریشن پڑھتا ہے۔
  • ڈیبگ موڈ کا جھنڈا چیک کیا جاتا ہے: اگر یہ سیٹ ہے تو، نیٹ ورک سنکرونائزیشن شیڈیولر لانچ نہیں ہوتا ہے اور بلاکچین لوڈ نہیں ہوتا ہے۔
  • کنفیگریشن ڈیٹا سٹرکچر کو شروع کرنا اور سرور کو شروع کرنا

سرور

  • پروٹوکول کے مطابق TCP سرور اور نیٹ ورک کے تعامل کا آغاز کرتا ہے۔
  • اس میں ایک سرو ڈیٹا ڈھانچہ ہے جس میں ایک پورٹ نمبر، ایک بفر سائز اور ڈھانچے کا ایک پوائنٹر ہوتا ہے۔ اقسام۔ ترتیبات
  • رن کا طریقہ نیٹ ورک کا تعامل شروع کرتا ہے (دیئے گئے پورٹ پر آنے والے کنکشن کو سننا، جب نیا کنکشن موصول ہوتا ہے، تو اس کی پروسیسنگ کو نئے تھریڈ میں پرائیویٹ ہینڈل کے طریقہ کار میں منتقل کر دیا جاتا ہے)
  • В ہینڈل کنکشن سے ڈیٹا کو بفر میں پڑھا جاتا ہے، سٹرنگ کی نمائندگی میں تبدیل کیا جاتا ہے اور پاس کیا جاتا ہے۔ protocol.Choice
  • protocol.Choice واپسی نتیجہ یا غلطی کا سبب بنتا ہے۔ نتیجہ پھر منتقل کر دیا protocol.Interpreteجو واپس آتا ہے انٹر پی آر - قسم کی چیز انٹرپریٹ ڈیٹا، یا انتخاب کے نتیجے پر کارروائی کرنے میں غلطی کا سبب بنتا ہے۔
  • پھر سوئچ پر عمل درآمد کیا جاتا ہے۔ intrpr.Commands[0] جس میں سے ایک چیک کرتا ہے: نتیجہ، inv، غلطی اور ایک سیکشن ہے پہلے سے طے شدہ
  • سیکشن میں نتیجہ سوئچ قدر کے لحاظ سے پایا جاتا ہے۔ intrpr.Commands[1] جو اقدار کو چیک کرتا ہے۔ بفر کی لمبائی и ورژن (ہر صورت میں متعلقہ فنکشن کہا جاتا ہے)

افعال گیٹ ورژن и بفر لینتھ فائل میں ہیں۔ srvlib.go سرور پیکج

GetVersion(conn net.Conn, version string)

یہ آسانی سے کنسول پر پرنٹ کرتا ہے اور پیرامیٹر میں پاس کردہ ورژن کلائنٹ کو بھیجتا ہے:

conn.Write([]byte("result:" + version))

.
فنکشن

BufferLength(conn net.Conn, intrpr *protocol.InterpreteData)

مندرجہ ذیل طور پر ایک بلاک، ٹرانزیکشن، یا دیگر مخصوص ڈیٹا لوڈ کرتا ہے:

  • کنسول پر پروٹوکول میں بیان کردہ ڈیٹا کی قسم پرنٹ کرتا ہے جسے قبول کرنے کی ضرورت ہے:
    fmt.Println("DataType:", intrpr.Commands[2])
  • قدر پڑھتا ہے۔ intrpr.Body ایک عددی متغیر تک buf_len
  • ایک بفر بناتا ہے۔ newbuf مخصوص سائز:
    make([]byte, buf_len)
  • ایک ٹھیک جواب بھیجتا ہے:
    conn.Write([]byte("result:ok"))
  • پڑھنے والی ندی سے بفر کو مکمل طور پر بھرتا ہے:
    io.ReadFull(conn, newbuf)

    .

  • بفر کے مواد کو کنسول پر پرنٹ کرتا ہے۔
    fmt.Println(string(newbuf))

    اور پڑھنے والے بائٹس کی تعداد

    fmt.Println("Bytes length:", n)
  • ایک ٹھیک جواب بھیجتا ہے:
    conn.Write([]byte("result:ok"))

سرور پیکج کے طریقوں کو پیکیج سے فنکشنز کا استعمال کرتے ہوئے موصولہ ڈیٹا پر کارروائی کرنے کے لیے ترتیب دیا گیا ہے۔ پروٹوکول.

پروٹوکول

پروٹوکول ایک ذریعہ کے طور پر کام کرتا ہے جو نیٹ ورک ایکسچینج میں ڈیٹا کی نمائندگی کرتا ہے۔

چوائس (سٹرنگ) (سٹرنگ، ایرر) سرور کے ذریعہ موصول ہونے والے ڈیٹا کی بنیادی پروسیسنگ انجام دیتا ہے، ان پٹ کے طور پر ڈیٹا کی سٹرنگ نمائندگی حاصل کرتا ہے اور اس کے لیے تیار کردہ سٹرنگ واپس کرتا ہے۔ تشریح کرنا:

  • ان پٹ سٹرنگ کا استعمال کرتے ہوئے سر اور جسم میں تقسیم کیا جاتا ہے ReqParseN2(str)
  • ہیڈ کو عناصر میں تقسیم کیا جاتا ہے اور ReqParseHead (head) کا استعمال کرتے ہوئے کمانڈ سلائس میں رکھا جاتا ہے۔
  • В سوئچ (کمانڈز[0]) موصولہ کمانڈ کو منتخب کریں (cmd، کلید، پتہ یا سیکشن کو متحرک کیا گیا ہے۔ پہلے سے طے شدہ)
  • cmd میں 2 کمانڈز چیک کیے گئے ہیں۔ سوئچ (کمانڈز[1]) - لمبائی и حاصل کرنا.
  • لمبائی ڈیٹا کی قسم کو چیک کرتا ہے۔ احکام[2] اور اسے محفوظ کرتا ہے ڈیٹا کی قسم
  • اسے چیک کرتا ہے۔ جسم اسٹرنگ ویلیو پر مشتمل ہے۔
    len(body) < 1
  • جوابی سٹرنگ لوٹاتا ہے:
    "result:bufferlength:" + datatype + "/" + body
  • حاصل کرنا ایک تار واپس کرتا ہے۔
    return "result:version/auto"

تشریح کرنا

InterpreteData ڈھانچہ پر مشتمل ہے اور اس سے واپس کیے گئے ڈیٹا کی ثانوی پروسیسنگ کرتا ہے۔ چوائس تار اور آبجیکٹ کی تشکیل انٹرپریٹ ڈیٹا.

type InterpreteData struct {
	Head string
	Commands []string
	Body string
	IsErr bool
	ErrCode int 
	ErrMessage string
}

فنکشن

Interprete(str string) (*InterpreteData, error)

ایک تار کو قبول کرتا ہے۔ نتیجہ اور تخلیق کرتا ہے اور آبجیکٹ کا حوالہ دیتا ہے۔ انٹرپریٹ ڈیٹا.

پیش رفت:

  • اسی طرح چوائس سر اور جسم کا استعمال کرتے ہوئے نکالا جاتا ہے ReqParseN2(str)
  • سر کا استعمال کرتے ہوئے عناصر میں تقسیم کیا جاتا ہے ReqParseHead(سر)
  • آبجیکٹ کو شروع کیا گیا ہے۔ انٹرپریٹ ڈیٹا اور اس کی طرف ایک اشارہ واپس کیا جاتا ہے:

res := &InterpreteData{
	Head: head,
	Commands: commands,
	Body: body,
}
return res, nil

یہ اعتراض میں استعمال ہوتا ہے۔ server.go اہم پیکیج.

کلائنٹ

کلائنٹ پیکیج میں افعال شامل ہیں۔ ٹی سی پی کنیکٹ и TCPresponseData.

فنکشن

TCPConnect(s *types.Settings, data []byte, payload []byte)

اس طرح کام کرتا ہے:

  • پاس کردہ سیٹنگ آبجیکٹ میں بیان کردہ کنکشن سے کنکشن بنایا جاتا ہے۔
    net.Dial("tcp", s.Host + ":" + s.Port)
  • ڈیٹا پیرامیٹر میں پاس کردہ ڈیٹا منتقل کیا جاتا ہے:
    conn.Write(data)
  • جواب پڑھا جاتا ہے۔
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    اور کنسول پر پرنٹ کیا جاتا ہے۔

    fmt.Println(string(resp[:n]))
  • اگر منتقل کیا جاتا ہے۔ پاؤ لوڈ پھر اسے منتقل کرتا ہے
    conn.Write(payload)

    اور سرور کے جواب کو بھی پڑھتا ہے، اسے کنسول پر پرنٹ کرتا ہے۔

فنکشن

 TCPResponseData(conn net.Conn, bufsiz int) ([]byte, int, error)

مخصوص سائز کا ایک بفر بناتا ہے، وہاں سرور کا جواب پڑھتا ہے اور اس بفر اور پڑھے جانے والے بائٹس کی تعداد کے ساتھ ساتھ ایک ایرر آبجیکٹ واپس کرتا ہے۔

کلائنٹ سب روٹین

نوڈ سرورز کو کمانڈ بھیجنے کے ساتھ ساتھ مختصر اعدادوشمار اور جانچ حاصل کرنے کا کام کرتا ہے۔

مندرجہ ذیل پیرامیٹرز کو قبول کر سکتے ہیں: JSON فارمیٹ میں کنفیگریشن فائل، سرور کو سٹرنگ کے طور پر بھیجے جانے والے ڈیٹا، پے لوڈ پر بھیجی جانے والی فائل کا راستہ، نوڈ شیڈیولر ایمولیشن پرچم، عددی قدر کے طور پر منتقل کردہ ڈیٹا کی قسم۔

  • ترتیب حاصل کرنا
    st := types.ParseConfig(*config)
  • اگر ایمو کا جھنڈا گزر جاتا ہے تو یہ شروع ہو جاتا ہے۔ شیڈیولر
  • اگر فائل کے راستے کی نشاندہی کرنے والا f جھنڈا فراہم کیا جاتا ہے، تو ہم اس کا ڈیٹا لوڈ کرتے ہیں۔ ایف ڈی بی اور مواد سرور کو بھیجا جاتا ہے۔
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • اگر فائل کی وضاحت نہیں کی گئی ہے، تو جھنڈے سے ڈیٹا آسانی سے بھیجا جاتا ہے۔ -d:
    client.TCPConnect(st, []byte(*data), nil)

یہ سب پروٹوکول کی ساخت کو ظاہر کرنے والی ایک آسان نمائندگی ہے۔ ترقی کے دوران، ضروری فعالیت کو اس کی ساخت میں شامل کیا جاتا ہے.

دوسرے حصے میں میں بلاکس اور ٹرانزیکشنز کے ڈیٹا سٹرکچر کے بارے میں بات کروں گا، 3 میں جاوا اسکرپٹ سے منسلک ہونے کے لیے WebSocket سرور کے بارے میں، 4 میں میں سنکرونائزیشن شیڈیولر کو دیکھوں گا، پھر ایک اسٹیک مشین جو ان پٹس اور آؤٹ پٹس سے بائیک کوڈ پر کارروائی کرتی ہے، کرپٹوگرافی اور آؤٹ پٹ کے لئے پول.

ماخذ: www.habr.com

نیا تبصرہ شامل کریں