د Go په کارولو سره د صنعت لپاره د بلاکچین پراختیا. برخه 1

اوس د څلورو میاشتو راهیسې زه په یوه پروژه کار کوم چې "د بلاکچین پراساس په دولتي او صنعتي سکتورونو کې د ډیټا محافظت او مدیریت وسیلو پراختیا."
اوس زه غواړم تاسو ته ووایم چې څنګه ما دا پروژه پیل کړه، او اوس به زه د پروګرام کوډ په تفصیل سره بیان کړم.

د Go په کارولو سره د صنعت لپاره د بلاکچین پراختیا. برخه 1

دا د مقالو په لړۍ کې لومړۍ مقاله ده. دلته زه سرور او پروتوکول بیانوم. په حقیقت کې ، لوستونکی حتی کولی شي د دې بلاکچین عناصرو خپل نسخې ولیکي.

او دلته دویمه برخه ده - د بلاکچین او لیږد ډیټا جوړښتونو په اړه، او همدارنګه د بسته بندۍ په اړه چې د ډیټابیس سره تعامل پلي کوي.

پروسږکال، د ډیجیټل بریا هیکاتون کې، دوی د صنعت او ډیجیټل اقتصاد لپاره د توزیع شوي لیجر ټیکنالوژۍ په کارولو سره یو ګټور سیسټم رامینځته کولو مفکوره وړاندې کړه؛ د نوښت مرستې بنسټ لخوا د پراختیا لپاره یوه مرسته هم خپره شوې وه (زه باید یو جلا ولیکم. د مرستې په اړه مقاله، د هغو کسانو لپاره چې یوازې د پیل کولو پیل کوي) او اوس په ترتیب کې.

پراختیا په Go ژبه کې ترسره کیږي، او هغه ډیټابیس چې بلاکونه په کې ساتل کیږي LevelDB دی.
اصلي برخې پروتوکول دي، سرور (کوم چې TCP او WebSocket پرمخ وړي - لومړی د بلاکچین همغږي کولو لپاره، دویم د پیرودونکو سره نښلولو، د جاوا سکریپټ څخه لیږد او کمانډ لیږلو لپاره، د بیلګې په توګه.

لکه څنګه چې یادونه وشوه، دا بلاکچین په ابتدايي توګه د عرضه کونکو او پیرودونکو ترمنځ د محصولاتو تبادله اتوماتیک او ساتنه ته اړتیا لري، یا دواړه په یو شخص کې. دا خلک په یو بل باور کولو کې بېړه نه کوي. مګر دنده نه یوازې د جوړ شوي کیلکولیټر سره د "چیک بوک" رامینځته کول دي ، بلکه یو سیسټم چې ډیری معمول دندې اتومات کوي چې د محصول د ژوند دورې سره کار کولو پرمهال رامینځته کیږي. بایټکوډ چې د دې مسلې لپاره مسؤل دی ، لکه څنګه چې د بلاکچین سره دودیز دی ، د لیږدونو په آخذونو او محصولاتو کې زیرمه کیږي (معاملې پخپله په بلاکونو کې زیرمه شوي ، په لیول ډی بی کې بلاکونه د GOB ب formatه کې دمخه کوډ شوي دي). لومړی، راځئ چې د پروتوکول او سرور (اکا نوډ) په اړه وغږیږو.

پروتوکول پیچلی ندی ، د هغې ټوله نقطه د ځانګړي کمانډ لاین په ځواب کې د ځینې ډیټا بارولو حالت ته بدلول دي ، معمولا یو بلاک یا لیږد ، او دا د لیست تبادلې لپاره هم اړین دی ، ترڅو نوډ پوه شي چې دا څوک دی. سره وصل دی او څنګه دوی د سوداګرۍ کولو لپاره لري (د همغږي کولو ناستې لپاره تړل شوي نوډونه د "ګاونډي" په نوم هم یادیږي ځکه چې د دوی IP پیژندل شوی او د دوی دولتي معلومات په حافظه کې زیرمه شوي).

فولډرونه (ډائریکټرونه لکه څنګه چې لینکس ورته ویل کیږي) د Go پروګرامرانو په پوهیدو کې بسته ویل کیږي، نو د هرې فایل په پیل کې د دې ډایرکټر څخه د Go کوډ سره دوی د بسته فولډر_name_where_this_file واقع دی لیکي. که نه نو، تاسو به د دې توان ونلرئ چې کمپیلر ته کڅوړه تغذیه کړئ. ښه، دا د هغو کسانو لپاره پټ نه دی چې په دې ژبه پوهیږي. دا کڅوړې دي:

  • د شبکې ارتباط (سرور، پیرودونکي، پروتوکول)
  • د ذخیره شوي او لیږدول شوي معلوماتو جوړښتونه (بلاک، لیږد)
  • ډیټابیس (بلاکچین)
  • اتفاق
  • سټک شوي مجازی ماشین (xvm)
  • مرستندویه (کریپټو، ډولونه) دا ټول د اوس لپاره دي.

دلته د ګیتوب لینک دی

دا یو تعلیمي نسخه ده، دا د پروسې بین الافغاني تعامل او څو تجربې برخې نلري، مګر جوړښت د هغه سره مطابقت لري چې پراختیا یې پرمخ وړل کیږي. که تاسو په نظرونو کې د وړاندیز کولو لپاره کوم څه لرئ ، زه به خوښ شم چې دا په نور پرمختګ کې په پام کې ونیسم. او اوس د سرور تشریح لپاره او پروتوکول.

راځئ چې لومړی سرور وګورو.

د سرور سبروټین د ډیټا سرور په توګه کار کوي چې د پروتوکول کڅوړې څخه د ډیټا جوړښتونو په کارولو سره د TCP پروتوکول په سر کې تیریږي.

معمول لاندې کڅوړې کاروي: سرور, پروتوکول, ډولونه. پخپله کڅوړه کې tcp_server.go د معلوماتو جوړښت لري خدمت کول.

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

دا کولی شي لاندې پیرامیټونه ومني:

  • د شبکې بندر چې له لارې به ډاټا تبادله شي
  • د JSON بڼه کې د سرور ترتیب کولو فایل
  • په ډیبګ حالت کې د چلولو لپاره بیرغ (شخصي بلاکچین)

پرمختګ:

  • د JSON فایل څخه تشکیلات لوستل
  • د ډیبګ حالت بیرغ چیک شوی: که دا تنظیم شوی وي ، د شبکې ترکیب مهالویش نه پیل شوی او بلاکچین نه پورته کیږي
  • د ترتیب کولو ډاټا جوړښت پیل کول او د سرور پیل کول

سرور

  • د پروتوکول سره سم د TCP سرور او د شبکې تعامل پیل کوي.
  • دا د خدمت ډیټا جوړښت لري چې د پورټ شمیره، د بفر اندازه او جوړښت ته اشاره کوي ډولونه. ترتیبات
  • د چلولو طریقه د شبکې متقابل عمل پیل کوي (په ورکړل شوي بندر کې د راتلونکو اړیکو لپاره اوریدل، کله چې یو نوی پیوستون ترلاسه شي، د هغې پروسس کول په نوي تار کې د شخصي هینډل میتود ته لیږدول کیږي)
  • В سمبال کړئ د ارتباط څخه ډاټا په بفر کې لوستل کیږي، د تار نمایندګۍ ته بدلیږي او لیږدول کیږي پروتوکول. انتخاب
  • پروتوکول. انتخاب بیرته راګرځي پایله یا د خطا سبب کیږي. پایله بیا ته لیږدول کیږي protocol.interpreteکوم چې بیرته راګرځي intrpr - د څیز ډول تشریح ډاټا، یا د انتخاب پایلې پروسس کولو کې د غلطۍ لامل کیږي
  • بیا سویچ اجرا کیږي intrpr.commands[0] کوم یو چک کوي: پایله، inv، تېروتنه او یوه برخه شتون لري تلواله
  • په برخه کې پایله سویچ د ارزښت له مخې موندل کیږي 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) د سرور لخوا ترلاسه شوي ډیټا لومړني پروسس کول ترسره کوي ، د ان پټ په توګه د معلوماتو سټرینګ نمایش ترلاسه کوي او د دې لپاره چمتو شوی تار بیرته راګرځوي ترجمان:

  • د ننوتلو تار د سر او بدن په کارولو سره ویشل شوی ReqParseN2(str)
  • سر په عناصرو ویشل شوی او د ReqParseHead (سر) په کارولو سره د کمانډ سلائس کې ځای پرځای شوی
  • В بدلول(حکمونه[0]) ترلاسه شوي کمانډ غوره کړئ (cmd، کیلي، پته یا برخه پیل شوې تلواله)
  • 2 کمانډونه په cmd کې چک شوي switch(commands[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 اصلي بسته.

د مراجع

د مراجعینو بسته د دندې لري 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 ب formatه کې د ترتیب کولو فایل ، سرور ته د سټینګ په توګه لیږل شوي ډاټا ، فایل ته لاره چې تادیه کولو ته لیږل کیږي ، د نوډ شیډولر ایمولیشن بیرغ ، د شمیرې ارزښت په توګه لیږدول شوي ډیټا ډول.

  • د تشکیلاتو ترلاسه کول
    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 کې د جاواسکریپټ څخه د نښلولو لپاره د ویب ساکټ سرور په اړه، په 4 کې به زه د همغږي کولو مهالویش وګورم، بیا یو سټیک ماشین چې د انپټونو او محصولاتو څخه بایټ کوډ پروسس کوي، کریپټوګرافي او د محصولاتو لپاره حوضونه.

سرچینه: www.habr.com

Add a comment