Go استعمال ڪندي انڊسٽري لاءِ بلاڪچين ڊولپمينٽ. حصو 1

ھاڻي چار مھينن لاءِ مان ھڪڙي منصوبي تي ڪم ڪري رھيو آھيان جنھن کي سڏيو ويندو آھي ”ڊولپمينٽ آف ڊيٽا تحفظ ۽ انتظامي اوزار سرڪاري ۽ صنعتي شعبن ۾ بلاڪ چين جي بنياد تي.
هاڻي مان توهان کي ٻڌائڻ چاهيان ٿو ته مون هن پروجيڪٽ جي شروعات ڪيئن ڪئي، ۽ هاڻي آئون تفصيل سان پروگرام ڪوڊ بيان ڪندس.

Go استعمال ڪندي انڊسٽري لاءِ بلاڪچين ڊولپمينٽ. حصو 1

هي مضمونن جي سلسلي ۾ پهريون مضمون آهي. هتي آئون بيان ڪريان ٿو سرور ۽ پروٽوڪول. حقيقت ۾، پڙهندڙ انهن بلاڪچين عناصر جا پنهنجا نسخا به لکي سگهن ٿا.

۽ هتي ٻيو حصو آهي - بلاڪچين ۽ ٽرانزيڪشن ڊيٽا جي جوڙجڪ بابت، انهي سان گڏ پيڪيج بابت جيڪو ڊيٽابيس سان رابطي کي لاڳو ڪري ٿو.

گذريل سال، ڊجيٽل بريڪٿرو هيڪاٿون ۾، انهن کي هڪ خيال آيو ته صنعت ۽ ڊجيٽل معيشت لاءِ هڪ ڪارائتو نظام ٺاهڻ لاءِ ورهايل ليجر ٽيڪنالاجي استعمال ڪندي؛ هڪ گرانٽ پڻ جاري ڪئي وئي ترقي لاءِ انوويشن اسسٽنس فنڊ (مون کي هڪ الڳ لکڻ گهرجي. گرانٽ جي باري ۾ آرٽيڪل، انهن لاء جيڪي صرف شروعات شروع ڪري رهيا آهن ) ۽ هاڻي ترتيب سان.

ترقي گو ٻولي ۾ ٿيندي آهي، ۽ ڊيٽابيس جنهن ۾ بلاڪ محفوظ ٿيل آهن LevelDB آهي.
مکيه حصا آهن پروٽوڪول، سرور (جيڪو هلندو آهي TCP ۽ WebSocket - پهريون بلاڪ چين کي هم وقت سازي ڪرڻ لاءِ، ٻيو ڪلائنٽ کي ڳنڍڻ لاءِ، جاوا اسڪرپٽ کان ٽرانزيڪشن ۽ حڪم موڪلڻ، مثال طور.

جيئن ذڪر ڪيو ويو، هي بلاڪچين جي ضرورت آهي بنيادي طور تي خودڪار ۽ تحفظ فراهم ڪرڻ وارن ۽ گراهڪن جي وچ ۾ مصنوعات جي مٽاسٽا کي، يا ٻئي هڪ شخص ۾. اهي ماڻهو هڪ ٻئي تي ڀروسو ڪرڻ جي جلدي ۾ نه آهن. پر اهو ڪم نه رڳو هڪ بلٽ ان ڪيلڪيوليٽر سان ”چڪ بڪ“ ٺاهڻ آهي، پر هڪ سسٽم جيڪو خودڪار ڪري ٿو اڪثر معمولي ڪمن کي جيڪي پيدا ٿين ٿا جڏهن پيداوار جي زندگي جي چڪر سان ڪم ڪري رهيا آهن. بائيٽ ڪوڊ جيڪو هن معاملي جو ذميوار آهي، جيئن ته بلاڪچين سان رواج آهي، ٽرانزيڪشن جي انپٽس ۽ آئوٽ پُٽ ۾ ذخيرو ٿيل آهي (ٽرانزيڪشن پاڻ کي بلاڪن ۾ محفوظ ڪيو ويندو آهي، ليول ڊي بي ۾ بلاڪ GOB فارميٽ ۾ اڳ-انڪوڊ ٿيل آهن). پهرين، اچو ته پروٽوڪول ۽ سرور بابت ڳالهايون (اڪا نوڊ).

پروٽوڪول پيچيده نه آهي، ان جو سڄو نقطو ڪجهه ڊيٽا کي لوڊ ڪرڻ جي موڊ تي سوئچ ڪرڻ آهي، عام طور تي هڪ بلاڪ يا ٽرانزيڪشن، خاص ڪمانڊ لائن جي جواب ۾، ۽ ان کي انوینٽري جي تبادلي لاء پڻ گهربل آهي، انهي ڪري ته نوڊ ڄاڻي ٿو ته اهو ڪير آهي. سان ڳنڍيل آهي ۽ انهن جو ڪاروبار ڪيئن ڪرڻو آهي (هڪ هم وقت سازي جي سيشن لاءِ جڙيل نوڊس کي ”پاڙيسري“ به چئبو آهي ڇاڪاڻ ته انهن جو IP معلوم ٿئي ٿو ۽ انهن جي رياستي ڊيٽا ياداشت ۾ محفوظ ٿيل آهي).

گو پروگرامرز جي سمجھ ۾ فولڊر (ڊائريڪٽريز جيئن ته لينڪس انهن کي سڏين ٿا) کي پيڪيجز چئبو آهي، ان ڪري هر فائل جي شروعات ۾ هن ڊاريڪٽري مان Go ڪوڊ سان پيڪيج فولڊر_name_where_this_file واقع آهي لکندا آهن. ٻي صورت ۾، توهان ڪمپيلر کي پيڪيج کي کارائڻ جي قابل نه هوندا. خير، اهو انهن لاءِ ڪو راز ناهي جيڪي هن ٻولي کي ڄاڻن ٿا. اهي پيڪيجز آهن:

  • نيٽ ورڪ ڪميونيڪيشن (سرور، ڪلائنٽ، پروٽوڪول)
  • ذخيرو ۽ منتقل ٿيل ڊيٽا جي جوڙجڪ (بلاڪ، ٽرانزيڪشن)
  • ڊيٽابيس (blockchain)
  • اتفاق
  • اسٽيڪ ٿيل ورچوئل مشين (xvm)
  • معاون (crypto، قسمون) اهو سڀ ڪجهه هاڻي لاءِ آهي.

هتي github جي لنڪ آهي

هي هڪ تعليمي نسخو آهي، ان ۾ هڪ ٻئي جي عمل جي وچ ۾ رابطي ۽ ڪيترن ئي تجرباتي اجزاء جو فقدان آهي، پر ساخت هڪ جهڙي آهي جنهن تي ترقي ڪئي پئي وڃي. جيڪڏھن توھان وٽ ڪجھھ آھي تجويز ڪرڻ لاءِ راين ۾، مان خوش ٿيندس ان کي وڌيڪ ترقي ۾ حساب ۾ رکڻ لاءِ. ۽ هاڻي سرور جي وضاحت لاء ۽ پروٽوڪول.

اچو ته پهرين سرور کي ڏسو.

سرور سبروٽين هڪ ڊيٽا سرور جي طور تي ڪم ڪري ٿو جيڪو TCP پروٽوڪول جي مٿان هلندو آهي پروٽوڪول پيڪيج مان ڊيٽا جي جوڙجڪ استعمال ڪندي.

معمول هيٺ ڏنل پيڪيجز استعمال ڪري ٿو: سرور, پروٽوڪول, قسم. پاڻ پيڪيج ۾ tcp_server.go ڊيٽا جي جوڙجڪ تي مشتمل آهي خدمت ڪريو.

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

اهو هيٺين پيراگراف کي قبول ڪري سگهي ٿو:

  • نيٽ ورڪ پورٽ جنهن ذريعي ڊيٽا مٽائي ويندي
  • JSON فارميٽ ۾ سرور ترتيب ڏيڻ واري فائل
  • ڊيبگ موڊ ۾ هلڻ لاءِ پرچم (نجي بلاڪچين)

ترقي:

  • JSON فائل مان ترتيب پڙھي ٿو
  • ڊيبگ موڊ پرچم چيڪ ڪيو ويو آهي: جيڪڏهن اهو سيٽ ڪيو ويو آهي، نيٽ ورڪ هم وقت سازي جي شيڊول شروع نه ڪئي وئي آهي ۽ بلاڪچين لوڊ نه ڪيو ويو آهي
  • ترتيب ڏيڻ واري ڊيٽا جي جوڙجڪ کي شروع ڪرڻ ۽ سرور کي شروع ڪرڻ

سرور

  • پروٽوڪول جي مطابق TCP سرور ۽ نيٽ ورڪ رابطي جي لانچ کي انجام ڏئي ٿو.
  • ان ۾ هڪ سرور ڊيٽا جو ڍانچو آهي جنهن ۾ پورٽ نمبر، بفر سائيز ۽ ڍانچي ڏانهن اشارو آهي. قسمن. سيٽنگون
  • رن جو طريقو نيٽ ورڪ رابطي کي شروع ڪري ٿو (ڏسندڙ بندرگاهن تي ايندڙ ڪنيڪشن ٻڌڻ لاءِ، جڏهن ڪو نئون ڪنيڪشن ملي ٿو، ته ان جي پروسيسنگ کي نئين ٿريڊ ۾ پرائيويٽ هينڊل طريقي ۾ منتقل ڪيو وڃي ٿو)
  • В منهن ڏيڻ ڪنيڪشن مان ڊيٽا هڪ بفر ۾ پڙهي ويندي آهي، هڪ اسٽرنگ نمائندگي ۾ تبديل ڪيو ويو آهي ۽ ڏانهن گذري ٿو پروٽوڪول. چونڊ
  • پروٽوڪول. چونڊ واپسي نتيجو يا غلطي جو سبب بڻجندو. نتيجو پوء منتقل ڪيو ويو protocol. تشريحجيڪو واپس اچي ٿو intrpr - قسم جو اعتراض تفسير ڊيٽا، يا چونڊ نتيجن جي پروسيسنگ ۾ غلطي جو سبب بڻجندو
  • پوء سوئچ تي عمل ڪيو ويندو آهي intrpr.commands[0] جنهن مان هڪ چيڪ ڪري ٿو: نتيجو، غلطي، غلطي ۽ هڪ سيڪشن آهي رٿيل
  • سيڪشن ۾ نتيجو سوئچ قدر سان ملي ٿو intrpr.commands[1] جيڪو قدرن جي جانچ ڪري ٿو بفر ڊگھائي и نسخو (هر صورت ۾ لاڳاپيل فنڪشن سڏيو ويندو آهي)

ڪارڪن GetVersion и بفر ڊگھائي فائل ۾ آهن 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
  • بفر ٺاهي ٿو نئون بف مخصوص ماپ:
    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"))

سرور پيڪيج مان طريقا ترتيب ڏنل آھن وصول ڪيل ڊيٽا کي پروسيس ڪرڻ لاءِ پيڪيج مان افعال استعمال ڪندي پروٽوڪول.

پروٽوڪول

هڪ پروٽوڪول هڪ وسيلو طور ڪم ڪري ٿو جيڪو نيٽ ورڪ جي بدلي ۾ ڊيٽا جي نمائندگي ڪري ٿو.

چوائس (string string) (string, error) سرور پاران حاصل ڪيل ڊيٽا جي بنيادي پروسيسنگ کي انجام ڏئي ٿو، ڊيٽا جي هڪ اسٽرنگ نمائندگي حاصل ڪري ٿو جيئن ان پٽ ۽ واپسي لاء تيار ڪيل اسٽرنگ مترجم:

  • ان پٽ اسٽرنگ استعمال ڪندي سر ۽ جسم ۾ ورهايل آھي ReqParseN2(str)
  • هيڊ کي عناصر ۾ ورهايو ويو آهي ۽ ReqParseHead (head) استعمال ڪندي ڪمانڊ سلائس ۾ رکيل آهي.
  • В سوئچ (حڪم[0]) حاصل ڪيل حڪم کي منتخب ڪريو (cmd, key, address يا سيڪشن شروع ڪيو ويو آهي رٿيل)
  • 2 حڪم cmd ۾ چيڪ ڪيا ويا آهن سوئچ (ڪمانڊس[1]) - ڊگھائي и حاصل ڪرڻ.
  • ڊيگهه ڊيٽا جي قسم کي چيڪ ڪري ٿو حڪم[2] ۽ ان ۾ محفوظ ڪري ٿو ڊائوٽس ٽائپ
  • چيڪ ڪري ٿو ته جسم string value تي مشتمل آهي
    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 بنيادي پيڪيج.

مختاران مائي

ڪلائنٽ پيڪيج ۾ افعال شامل آهن TCPConnect и 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 جھنڊو ڏيکاري ٿو ته فائل ڏانهن رستو فراهم ڪيو وڃي، پوء اسان ان جي ڊيٽا کي لوڊ ڪريون ٿا fdb ۽ مواد سرور ڏانهن موڪليو ويو آهي
    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

تبصرو شامل ڪريو