Fampandrosoana Blockchain ho an'ny indostria mampiasa Go. Fizarana 1

Efa-bolana izao no niasako tamin'ny tetikasa iray antsoina hoe "Fampandrosoana ny fiarovana ny angon-drakitra sy ny fitaovana fitantanana amin'ny sehatry ny governemanta sy ny indostria mifototra amin'ny blockchain."
Ankehitriny dia te-hilaza aminao ny fomba nanombohako ity tetikasa ity aho, ary ankehitriny dia holazaiko amin'ny antsipiriany ny code code.

Fampandrosoana Blockchain ho an'ny indostria mampiasa Go. Fizarana 1

Ity no lahatsoratra voalohany amin'ny andian-dahatsoratra. Eto aho dia mamaritra ny mpizara sy ny protocol. Raha ny marina, ny mpamaky dia afaka manoratra ny dikan-teny manokana momba ireo singa blockchain ireo.

Ary indro ny tapany faharoa - momba ny blockchain sy ny rafitra angon-drakitra momba ny varotra, ary koa ny momba ny fonosana izay mametraka fifandraisana amin'ny angon-drakitra.

Tamin'ny taon-dasa, tao amin'ny hackathon Digital Breakthrough, dia nahazo hevitra izy ireo mba hamorona rafitra mahasoa ho an'ny indostria sy ny toekarena nomerika amin'ny fampiasana ny teknolojian'ny ledger zaraina; Navoaka ihany koa ny famatsiam-bola ho an'ny fampandrosoana avy amin'ny Tahirim-bolan'ny Fanampiana Innovation (tokony hanoratra lahatsoratra manokana aho. lahatsoratra momba ny fanomezana, ho an'ireo izay vao manomboka fanombohana ), ary amin'izao fotoana izao.

Ny fampandrosoana dia atao amin'ny fiteny Go, ary ny angon-drakitra misy ireo sakana dia LevelDB.
Ny ampahany lehibe dia ny protocol, ny mpizara (izay mitantana TCP sy WebSocket - ny voalohany amin'ny fampifanarahana ny blockchain, ny faharoa amin'ny fampifandraisana ny mpanjifa, ny fandefasana fifanakalozana sy ny baiko avy amin'ny JavaScript, ohatra.

Araka ny voalaza dia ilaina voalohany indrindra ity sakana ity mba handrindrana sy hiarovana ny fifanakalozana vokatra eo amin'ny mpamatsy sy ny mpanjifa, na amin'ny olona iray. Tsy maika hifampatoky ireo olona ireo. Saingy ny asa dia tsy vitan'ny hoe mamorona "boky fanamarinana" miaraka amin'ny kajy naorina, fa rafitra iray izay manara-maso ny ankamaroan'ny asa mahazatra mitranga rehefa miasa amin'ny tsingerin'ny fiainan'ny vokatra. Ny bytecode izay tompon'andraikitra amin'ity raharaha ity, toy ny mahazatra amin'ny blockchains, dia voatahiry ao amin'ny fidirana sy ny fivoahana amin'ny fifampiraharahana (ny fifanakalozam-bola dia voatahiry ao anaty blocs, ny sakana ao amin'ny LevelDB dia voarakitra mialoha amin'ny endrika GOB). Voalohany, andao hiresaka momba ny protocol sy ny server (aka node).

Ny protocol dia tsy sarotra, ny tanjona dia ny hifindra amin'ny fomba fametahana angon-drakitra sasany, matetika fanakanana na fifampiraharahana, ho setrin'ny baiko manokana, ary ilaina ihany koa amin'ny fifanakalozam-bola, mba hahafantaran'ny node hoe iza izy. mifandray amin'ny sy ny fomba ananan'izy ireo raharaham-barotra (ireo nodes mifandray amin'ny fivoriana fampifanarahana dia antsoina koa hoe "mpifanolo-bodirindrina" satria fantatra ny IP-ny ary voatahiry ao anaty fitadidiana ny angon-drakitra momba ny fanjakana).

Ny lahatahiry (lahatsoratra araka ny iantsoan'ny Linux azy) amin'ny fahatakarana ny Go programmer dia antsoina hoe fonosana, ka eo am-piandohan'ny rakitra tsirairay miaraka amin'ny code Go avy amin'ity lahatahiry ity dia manoratra fonosana folder_name_where_this_file izy ireo. Raha tsy izany, dia tsy ho afaka mamahana ny fonosana amin'ny mpanangom-bokatra ianao. Eny ary, tsy tsiambaratelo ho an'ireo izay mahafantatra io fiteny io. Ireto ny fonosana:

  • Fifandraisana amin'ny tambajotra (server, client, protocol)
  • Ny rafitry ny angona voatahiry sy ampitaina (block, transaction)
  • Database (blockchain)
  • fifanarahana
  • Masinina virtoaly mitambatra (xvm)
  • Auxiliary (crypto, karazana) izany rehetra izany amin'izao fotoana izao.

Ity ny rohy mankany amin'ny github

Ity dia dikan-teny fanabeazana, tsy misy fifandraisana eo amin'ny dingana sy singa andrana maromaro, fa ny rafitra dia mifanandrify amin'ilay anaovana ny fampandrosoana. Raha manana soso-kevitra ianao ao amin'ny fanehoan-kevitra dia ho faly aho handray izany amin'ny fampandrosoana bebe kokoa. Ary ankehitriny ho fanazavana ny mpizara sy fifanarahana.

Andeha hojerentsika aloha ny server.

Ny subroutine mpizara dia miasa toy ny mpizara data izay mandeha eo an-tampon'ny protocol TCP amin'ny fampiasana rafitra data avy amin'ny fonosana protocol.

Ny routine dia mampiasa ireto fonosana manaraka ireto: mpizara, fifanarahana, karazana. Ao amin'ny fonosana mihitsy tcp_server.go misy firafitry ny angona manompo.

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

Afaka manaiky ireto parameter manaraka ireto izy:

  • Seranan-tambajotra ahafahana mifanakalo angona
  • File configuration server amin'ny endrika JSON
  • Saina ho mandeha amin'ny fomba debug (blockchain manokana)

Fandrosoana:

  • Mamaky tefi-trano avy amin'ny rakitra JSON
  • Voamarina ny sainam-pamokarana debug: raha apetraka izany, dia tsy atomboka ny mpandrindra ny fandrindrana ny tambazotra ary tsy voaloa ny sakana.
  • Fanombohana ny firafitry ny angon-drakitra fanamafisana ary manomboka ny mpizara

Server

  • Manatanteraka ny fandefasana ny mpizara TCP sy ny fifandraisan'ny tambajotra mifanaraka amin'ny protocol.
  • Izy io dia manana rafitra angon-drakitra Serve misy laharan-tseranana, haben'ny buffer ary tondro ho an'ny rafitra karazana.Settings
  • Ny fomba Run dia manomboka ny fifandraisana amin'ny tambajotra (mihaino ny fifandraisana miditra amin'ny seranan-tsambo iray, rehefa misy fifandraisana vaovao voaray, dia afindra amin'ny fomba fitantanana manokana amin'ny kofehy vaovao ny fanodinana azy)
  • Π’ hiatrika Ny angona avy amin'ny fifandraisana dia vakiana ho buffer, avadika ho fanehoana tady ary alefa any protocol.Safidy
  • protocol.Safidy miverina vokatra na miteraka fahadisoana. vokatra dia nafindra tany protocol.Mandikaizay miverina intrpr - karazana zavatra InterpreteData, na miteraka hadisoana amin'ny fanodinana ny valin'ny fifantenana
  • Avy eo ny switch dia tanterahina intrpr.Commands[0] izay manamarina ny iray amin'ireo: vokatra, inv, fahadisoana ary misy fizarana toerana misy anao
  • Ao amin'ny fizarana vokatra switch dia hita amin'ny sanda intrpr.Commands[1] izay manamarina ny soatoavina bufferlength ΠΈ Malagasy Bible (amin'ny tranga tsirairay dia antsoina ny asa mifanaraka amin'izany)

asa GetVersion ΠΈ BufferLength ao anaty rakitra srvlib.go fonosana mpizara

GetVersion(conn net.Conn, version string)

manonta fotsiny amin'ny console izy io ary mandefa ny dikan-teny alefa amin'ny parameter ho an'ny mpanjifa:

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

.
asa

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

mametraka sakana, fifampiraharahana, na angona manokana hafa toy izao manaraka izao:

  • Manonta ao amin'ny console ny karazana angona voatondro ao amin'ny protocol izay tokony ekena:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Mamaky ny sandany intrpr.Vatany mankany amin'ny fari-pitsipika isa buf_len
  • Mamorona buffer newbuf voafaritra habe:
    make([]byte, buf_len)
  • Mandefa valiny ok:
    conn.Write([]byte("result:ok"))
  • Fenoy tanteraka ny buffer avy amin'ny stream vakiana:
    io.ReadFull(conn, newbuf)

    .

  • Manonta ny votoatin'ny buffer mankany amin'ny console
    fmt.Println(string(newbuf))

    ary ny isan'ny bytes novakiana

    fmt.Println("Bytes length:", n)
  • Mandefa valiny ok:
    conn.Write([]byte("result:ok"))

Ny fomba avy amin'ny fonosan'ny mpizara dia namboarina mba hikarakarana angon-drakitra voaray amin'ny alΓ lan'ny fiasa avy amin'ny fonosana fifanarahana.

Protocol

Ny protocole dia fitaovana iray maneho ny angona amin'ny fifanakalozana tambajotra.

Safidy(str string) (string, error) manao fanodinana voalohany ny angon-drakitra voarain'ny mpizara, mandray tady fanehoana ny angona ho fampidirana ary mamerina tady voaomana ho mpandika:

  • Ny tady fampidirana dia mizara ho loha sy vatana mampiasa ReqParseN2(str)
  • Ny loha dia mizara ho singa ary napetraka ao anaty baiko baiko amin'ny fampiasana ReqParseHead(head)
  • Π’ switch(baiko[0]) safidio ny baiko voaray (cmd, fanalahidy, adiresy na ny fizarana dia voatarika toerana misy anao)
  • Ny baiko 2 dia voamarina amin'ny cmd switch(baiko[1]) β€” halavany ΠΈ getversion.
  • halavan'ny manamarina ny karazana data ao baiko[2] ary tehirizo ao karazana data
  • Manamarina izany vatana misy sanda tady
    len(body) < 1
  • Mamerina ny tady valinteny:
    "result:bufferlength:" + datatype + "/" + body
  • getversion mamerina tady
    return "result:version/auto"

mpandika

Ahitana ny rafitra InterpreteData ary manao fanodinana faharoa ny angona naverina avy amin'ny Choice kofehy sy fananganana zavatra InterpreteData.

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

asa

Interprete(str string) (*InterpreteData, error)

manaiky tady vokatra ary mamorona sy mamerina reference amin'ilay zavatra InterpreteData.

Fandrosoana:

  • Toy izany koa Choice ny loha sy ny vatana dia alaina amin'ny fampiasana ReqParseN2(str)
  • loha dia mizara ho singa mampiasa ReqParseHead(loha)
  • Natomboka ny zavatra InterpreteData ary misy tondro averina aminy.

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

Ity zavatra ity dia ampiasaina amin'ny server.go fonosana lehibe.

Client

Ny fonosana mpanjifa dia misy ny fiasa TCPConnect ΠΈ TCPResponseData.

asa

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

miasa toy izao:

  • Ny fifandraisana dia atao amin'ny fifandraisana voatondro ao amin'ny zavatra fisie nandalo
    net.Dial("tcp", s.Host + ":" + s.Port)
  • Ampitaina ny angon-drakitra alefa amin'ny paramΓ¨tre data:
    conn.Write(data)
  • Vakina ny valiny
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    ary atao pirinty amin'ny console

    fmt.Println(string(resp[:n]))
  • Raha nafindra payload dia mampita izany
    conn.Write(payload)

    ary mamaky ihany koa ny valintenin'ny mpizara, manonta azy amin'ny console

asa

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

mamorona buffer amin'ny habe voafaritra, mamaky ny valin'ny mpizara ao ary mamerina ity buffer ity sy ny isan'ny bytes novakiana, ary koa zavatra diso.

Subroutine mpanjifa

Miasa handefa baiko amin'ny mpizara node, ary koa mahazo antontan'isa sy fitsapana fohy.

Afaka manaiky ireto mari-pamantarana manaraka ireto: fisie fanamafisam-peo amin'ny endrika JSON, angon-drakitra halefa any amin'ny mpizara ho toy ny tady, lalana mankany amin'ny rakitra halefa ho enta-mavesatra, saina emulation node scheduler, karazana data nafindra ho sanda isa.

  • Mahazo ny configuration
    st := types.ParseConfig(*config)
  • Raha lany ny saina emu dia manomboka izany sheduler
  • Raha omena ny saina f manondro ny lalana mankany amin'ny rakitra, dia ampidirintsika ao ny angon-drakitra fdb ary alefa any amin'ny mpizara ny atiny
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Raha tsy voafaritra ny rakitra, dia alefa tsotra izao ny angona avy amin'ny saina -d:
    client.TCPConnect(st, []byte(*data), nil)

Izany rehetra izany dia fanehoana tsotsotra mampiseho ny firafitry ny protocol. Mandritra ny fampandrosoana dia ampidirina amin'ny rafitra misy azy ny fiasa ilaina.

Ao amin'ny fizarana faharoa dia hiresaka momba ny rafitra angon-drakitra ho an'ny sakana sy ny fifampiraharahana aho, ao amin'ny 3 momba ny mpizara WebSocket ho an'ny fifandraisana amin'ny JavaScript, amin'ny 4 dia hijery ny fandaharam-potoana synchronization aho, avy eo milina stack izay manamboatra bytecode avy amin'ny inputs sy outputs, cryptography ary dobo ho an'ny vokatra.

Source: www.habr.com

Add a comment