Kev txhim kho Blockchain rau kev lag luam siv Go. Ntu 1

Rau plaub lub hlis tam sim no kuv tau ua hauj lwm rau ib qhov project hu ua "Kev txhim kho cov ntaub ntawv tiv thaiv thiab kev tswj cov cuab yeej hauv tsoom fwv thiab kev lag luam sectors raws li blockchain."
Tam sim no kuv xav qhia koj txog yuav ua li cas kuv pib qhov project no, thiab tam sim no kuv yuav piav qhia txog qhov program code kom ntxaws.

Kev txhim kho Blockchain rau kev lag luam siv Go. Ntu 1

Nov yog thawj tsab xov xwm nyob rau hauv ib tsab xov xwm. Ntawm no kuv piav qhia txog server thiab raws tu qauv. Qhov tseeb, tus nyeem ntawv tuaj yeem sau nws tus kheej versions ntawm cov ntsiab lus blockchain.

Thiab ntawm no yog qhov thib ob - hais txog blockchain thiab kev hloov pauv cov ntaub ntawv cov qauv, nrog rau cov pob uas siv kev cuam tshuam nrog cov ntaub ntawv.

Xyoo tas los, ntawm Digital Breakthrough hackathon, lawv tau los nrog lub tswv yim los ua kom muaj txiaj ntsig zoo rau kev lag luam thiab kev lag luam digital siv cov cuab yeej faib khoom siv; ib qho nyiaj pab kuj tau muab rau kev txhim kho los ntawm Innovation Assistance Fund (Kuv yuav tsum sau ib qho cais. tsab xov xwm hais txog qhov nyiaj pab, rau cov uas nyuam qhuav pib startups), thiab tam sim no nyob rau hauv kev txiav txim.

Kev loj hlob tshwm sim hauv Go lus, thiab cov ntaub ntawv uas cov blocks khaws cia yog LevelDB.
Cov khoom tseem ceeb yog raws tu qauv, tus neeg rau zaub mov (uas khiav TCP thiab WebSocket - thawj zaug rau synchronizing blockchain, qhov thib ob rau kev sib txuas cov neeg siv khoom, xa cov kev lag luam thiab cov lus txib los ntawm JavaScript, piv txwv li.

Raws li tau hais, qhov blockchain no yog qhov xav tau tshwj xeeb rau kev ua haujlwm thiab tiv thaiv kev sib pauv khoom ntawm cov neeg muag khoom thiab cov neeg siv khoom, lossis ob qho tib si hauv ib tus neeg. Cov neeg no yeej tsis maj mus ntseeg ib leeg. Tab sis txoj hauj lwm tsis yog tsuas yog tsim "phau ntawv txheeb xyuas" nrog lub tshuab xam zauv built-in, tab sis lub kaw lus uas ua rau feem ntau ntawm cov haujlwm niaj hnub uas tshwm sim thaum ua haujlwm nrog cov khoom lag luam lub neej. Cov bytecode uas yog lub luag haujlwm rau qhov teeb meem no, raws li kev cai nrog blockchains, yog khaws cia hauv cov khoom nkag thiab cov khoom tawm ntawm kev lag luam (cov kev lag luam lawv tus kheej tau khaws cia hauv cov blocks, cov blocks hauv LevelDB yog pre-encoded hauv GOB hom). Ua ntej, cia peb tham txog cov txheej txheem thiab lub server (aka node).

Cov txheej txheem tsis nyuaj, nws tag nrho cov ntsiab lus yog hloov mus rau hom kev thauj khoom qee cov ntaub ntawv, feem ntau yog ib qho thaiv lossis kev lag luam, teb rau cov kab lus tshwj xeeb, thiab nws tseem xav tau rau kev sib pauv cov khoom muag, kom cov node paub tias nws yog leej twg. txuas nrog thiab lawv muaj kev lag luam yuav ua li cas (cov nodes txuas rau kev sib tham synchronization tseem hu ua "cov neeg nyob sib ze" vim lawv tus IP paub thiab lawv cov ntaub ntawv hauv xeev tau khaws cia hauv nco).

Folders (cov ntawv qhia raws li Linux hu lawv) hauv kev nkag siab ntawm Go programmers hu ua pob, yog li thaum pib ntawm txhua cov ntaub ntawv nrog Go code los ntawm phau ntawv no lawv sau pob folder_name_where_this_file nyob. Txwv tsis pub, koj yuav tsis muaj peev xwm pub lub pob rau lub compiler. Zoo, qhov no tsis pub leejtwg paub rau cov neeg paub lus no. Cov no yog cov pob:

  • Kev sib txuas lus network (server, client, protocol)
  • Cov qauv ntawm cov ntaub ntawv khaws cia thiab xa tawm (block, pauv)
  • Database (blockchain)
  • Kev pom zoo
  • Stacked virtual tshuab (xvm)
  • Pab (crypto, hom) uas yog tag nrho rau tam sim no.

Nov yog qhov txuas rau github

Qhov no yog ib qho kev kawm version, nws tsis muaj kev sib cuam tshuam ntawm cov txheej txheem thiab ntau yam kev sim, tab sis cov qauv sib raug rau ib qho kev txhim kho tau ua. Yog tias koj muaj ib yam dab tsi los tawm tswv yim hauv cov lus, Kuv yuav zoo siab coj nws mus rau hauv tus account hauv kev txhim kho ntxiv. Thiab tam sim no rau kev piav qhia ntawm lub server thiab Raws tu qauv.

Cia peb saib ntawm server ua ntej.

Tus neeg rau zaub mov subroutine ua raws li cov ntaub ntawv server uas khiav saum TCP raws tu qauv siv cov ntaub ntawv tsim los ntawm pob raws tu qauv.

Qhov kev niaj hnub siv cov pob khoom hauv qab no: neeg rau zaub mov, Raws tu qauv, hom. Hauv pob nws tus kheej tcp_server.go muaj cov ntaub ntawv qauv Ua haujlwm pab.

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

Nws tuaj yeem lees txais cov kev txwv hauv qab no:

  • Network chaw nres nkoj los ntawm cov ntaub ntawv yuav pauv
  • Server configuration file hauv JSON format
  • Chij rau kev khiav hauv hom kev debug (private blockchain)

Kev vam meej:

  • Nyeem kev teeb tsa los ntawm JSON cov ntaub ntawv
  • Tus chij hom kev debug raug kuaj xyuas: yog tias nws tau teeb tsa, lub network synchronization teem sijhawm tsis tau pib thiab blockchain tsis thauj khoom
  • Pib lub configuration cov ntaub ntawv qauv thiab pib lub server

neeg rau zaub mov

  • Ua tiav kev tshaj tawm ntawm TCP server thiab kev sib cuam tshuam hauv network raws li txoj cai.
  • Nws muaj cov qauv siv cov ntaub ntawv uas muaj tus lej chaw nres nkoj, qhov loj me thiab tus taw tes rau cov qauv hom.Settings
  • Txoj kev Khiav pib kev sib tham hauv network (nrhiav cov kev sib txuas ntawm qhov chaw nres nkoj, thaum tau txais kev sib txuas tshiab, nws cov txheej txheem raug xa mus rau tus kheej tuav txoj hauv kev tshiab)
  • Π’ lis cov ntaub ntawv los ntawm kev sib txuas yog nyeem rau hauv ib qho tsis, hloov mus rau ib txoj hlua sawv cev thiab dhau mus rau raws tu qauv.Kev xaiv
  • raws tu qauv.Kev xaiv rov qab tshwm sim los yog ua rau yuam kev. tshwm sim ces pauv mus rau raws tu qauv.Inpreteuas rov kev intrpr - yam khoom Txhais cov ntaub ntawv, lossis ua rau muaj kev ua yuam kev hauv kev ua cov txiaj ntsig xaiv
  • Tom qab ntawd qhov kev hloov pauv tau ua tiav intrpr.Commands[0] uas checks ib ntawm: result, inv, yuam kev thiab muaj ib seem ua ntej
  • Hauv seem tshwm sim hloov yog pom los ntawm tus nqi intrpr.Commands[1] uas kuaj xyuas cov nqi qhov bufferength ΠΈ version (nyob rau hauv txhua rooj plaub lub luag hauj lwm yog hu ua)

Zog GetVersion ΠΈ BufferLength yog nyob rau hauv cov ntaub ntawv srvlib.go server pob

GetVersion(conn net.Conn, version string)

Nws tsuas yog luam tawm mus rau lub console thiab xa cov ntawv dhau los hauv qhov ntsuas mus rau tus neeg siv khoom:

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

.
muaj nuj nqi

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

loads ib qho thaiv, kev hloov pauv, lossis lwm cov ntaub ntawv tshwj xeeb raws li hauv qab no:

  • Sau rau lub console hom ntaub ntawv teev nyob rau hauv raws tu qauv uas yuav tsum tau txais:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Nyeem tus nqi intrpr.Lub cev mus rau tus lej hloov pauv buf_len
  • Tsim ib qho tsis newbuf qhov loj me:
    make([]byte, buf_len)
  • Xa ib qho lus teb ok:
    conn.Write([]byte("result:ok"))
  • Ua kom tiav qhov tsis los ntawm kev nyeem kwj:
    io.ReadFull(conn, newbuf)

    .

  • Sau cov ntsiab lus ntawm qhov tsis rau lub console
    fmt.Println(string(newbuf))

    thiab tus naj npawb ntawm bytes nyeem

    fmt.Println("Bytes length:", n)
  • Xa ib qho lus teb ok:
    conn.Write([]byte("result:ok"))

Cov txheej txheem los ntawm cov neeg rau zaub mov pob tau teeb tsa los ua cov ntaub ntawv tau txais los ntawm kev siv lub zog los ntawm pob Raws tu qauv.

raws tu qauv

Cov txheej txheem ua haujlwm ua ib txoj hauv kev uas sawv cev rau cov ntaub ntawv hauv kev sib pauv network.

Choice(str hlua) (txoj hlua, yuam kev) ua thawj txheej txheem ntawm cov ntaub ntawv tau txais los ntawm tus neeg rau zaub mov, tau txais ib txoj hlua sawv cev ntawm cov ntaub ntawv raws li kev tawm tswv yim thiab xa rov qab ib txoj hlua npaj rau Neeg txhais lus:

  • Txoj hlua input yog muab faib ua lub taub hau thiab lub cev siv ReqParseN2(str)
  • lub taub hau tau muab faib ua cov ntsiab lus thiab muab tso rau hauv cov lus txib siv ReqParseHead(lub taub hau)
  • Π’ hloov (commands[0]) xaiv cov lus txib tau txais (cmd, npe, los yog ntu tau ua ua ntej)
  • 2 cov lus txib raug kuaj xyuas hauv cmd switch(commands[1]) β€” ntev ΠΈ kev hloov pauv.
  • ntev tshawb xyuas cov ntaub ntawv hom lus txib [2] thiab txuag nws hauv datatype
  • Tshawb xyuas qhov ntawd lub cev muaj ib txoj hlua tus nqi
    len(body) < 1
  • Rov qab cov kab lus teb:
    "result:bufferlength:" + datatype + "/" + body
  • kev hloov pauv rov qab ib txoj hlua
    return "result:version/auto"

Neeg txhais lus

Muaj cov qauv InterpreteData thiab ua cov txheej txheem thib ob ntawm cov ntaub ntawv xa rov qab los ntawm xaiv cov hlua thiab cov khoom tsim Txhais cov ntaub ntawv.

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

muaj nuj nqi

Interprete(str string) (*InterpreteData, error)

txais ib txoj hlua tshwm sim thiab tsim thiab xa cov ntaub ntawv xa mus rau qhov khoom Txhais cov ntaub ntawv.

Kev vam meej:

  • Zoo sib xws xaiv taub hau thiab lub cev yog muab rho tawm siv ReqParseN2(str)
  • lub taub hau yog faib ua cov khoom siv ReqParseHead(lub taub hau)
  • Cov khoom yog pib Txhais cov ntaub ntawv thiab tus taw tes rau nws rov qab los:

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

Cov khoom no yog siv rau hauv server.go pob lub ntsiab.

Client

Cov neeg siv khoom pob muaj cov haujlwm TCPConnect ΠΈ TCPRresponseData.

muaj nuj nqi

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

ua haujlwm zoo li no:

  • Kev sib txuas yog ua rau qhov kev sib txuas tau teev tseg hauv cov khoom dhau los
    net.Dial("tcp", s.Host + ":" + s.Port)
  • Cov ntaub ntawv dhau los hauv cov ntaub ntawv parameter yog kis tau:
    conn.Write(data)
  • Cov lus teb yog nyeem
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    thiab luam tawm ntawm lub console

    fmt.Println(string(resp[:n]))
  • Yog pauv payload ces hla nws mus
    conn.Write(payload)

    thiab tseem nyeem cov lus teb rau cov neeg rau zaub mov, luam tawm rau lub console

muaj nuj nqi

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

tsim ib qho tsis ntawm qhov loj me, nyeem cov lus teb rau cov neeg rau zaub mov muaj thiab rov qab qhov tsis zoo no thiab cov lej ntawm bytes nyeem, nrog rau cov khoom yuam kev.

Client subroutine

Ua haujlwm xa cov lus txib mus rau node servers, nrog rau tau txais cov txheeb cais luv luv thiab kuaj.

Muaj peev xwm lees txais cov kev txwv hauv qab no: cov ntaub ntawv teeb tsa hauv JSON hom, cov ntaub ntawv xa mus rau lub server raws li txoj hlua, txoj hauv kev rau cov ntaub ntawv xa mus rau payload, node teem caij emulation chij, hom ntaub ntawv pauv raws li tus lej lej.

  • Tau txais lub configuration
    st := types.ParseConfig(*config)
  • Yog tias tus chij emu dhau lawm, nws pib tus tuav
  • Yog tias tus chij f qhia txoj hauv kev rau cov ntaub ntawv tau muab, ces peb thauj nws cov ntaub ntawv mus rau hauv fdb ib thiab cov ntsiab lus raug xa mus rau lub server
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Yog tias cov ntaub ntawv tsis tau teev tseg, ces cov ntaub ntawv los ntawm tus chij tsuas yog xa tuaj -d:
    client.TCPConnect(st, []byte(*data), nil)

Tag nrho cov no yog ib qho piv txwv yooj yim uas qhia txog cov qauv ntawm cov txheej txheem. Thaum lub sij hawm kev loj hlob, qhov tsim nyog functionality yog ntxiv rau nws cov qauv.

Hauv ntu thib ob kuv yuav tham txog cov qauv ntaub ntawv rau kev thaiv thiab kev lag luam, hauv 3 txog WebSocket server rau kev sib txuas ntawm JavaScript, hauv 4 Kuv yuav saib lub sijhawm synchronization, tom qab ntawd lub tshuab pawg uas ua haujlwm bytecode los ntawm kev nkag thiab tawm, cryptography thiab pas dej ua ke rau outputs.

Tau qhov twg los: www.hab.com

Ntxiv ib saib