เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ Blockchain เบชเปเบฒเบฅเบฑเบšเบญเบธเบ”เบชเบฒเบซเบฐเบเปเบฒเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Go. เบžเบฒเบเบ—เบต 1

เบชเปเบฒเบฅเบฑเบšเบชเบตเปˆเป€เบ”เบทเบญเบ™เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบฎเบฑเบ”เบงเบฝเบเบเปˆเบฝเบงเบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ "เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เปƒเบ™เบ‚เบฐเปเบซเบ™เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบฅเบฑเบ”เบ–เบฐเบšเบฒเบ™เปเบฅเบฐเบญเบธเบ”เบชเบฒเบซเบฐเบเปเบฒเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ blockchain."
เบ•เบญเบ™เบ™เบตเป‰เบ‚เป‰เบญเบเบขเบฒเบเบšเบญเบเป€เบˆเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบ—เบตเปˆเบ‚เป‰เบญเบเป€เบฅเบตเปˆเบกเป‚เบ„เบ‡เบเบฒเบ™เบ™เบตเป‰, เปเบฅเบฐเบ•เบญเบ™เบ™เบตเป‰เบ‚เป‰เบญเบเบˆเบฐเบญเบฐเบ—เบดเบšเบฒเบเบฅเบฐเบซเบฑเบ”เป‚เบ„เบ‡เบเบฒเบ™เบขเปˆเบฒเบ‡เบฅเบฐเบญเบฝเบ”.

เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ Blockchain เบชเปเบฒเบฅเบฑเบšเบญเบธเบ”เบชเบฒเบซเบฐเบเปเบฒเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Go. เบžเบฒเบเบ—เบต 1

เบ™เบตเป‰เปเบกเปˆเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ—เปเบฒเบญเบดเบ”เปƒเบ™เบŠเบธเบ”เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบก. เบ—เบตเปˆเบ™เบตเป‰เบ‚เป‰เบญเบเบญเบฐเบ—เบดเบšเบฒเบเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปเบฅเบฐเป‚เบ›เป‚เบ•เบ„เบญเบ™. เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบœเบนเป‰เบญเปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เบฝเบ™เบชเบฐเบšเบฑเบšเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบš blockchain เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰.

เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เบžเบฒเบเบ—เบตเบชเบญเบ‡ โ€” เบเปˆเบฝเบงโ€‹เบเบฑเบš blockchain เปเบฅเบฐโ€‹เป‚เบ„เบ‡โ€‹เบชเป‰เบฒเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบเบฒเบ™โ€‹เป€เบฎเบฑเบ”โ€‹เบ—เบธโ€‹เบฅเบฐโ€‹เบเปเบฒโ€‹, เป€เบŠเบฑเปˆเบ™โ€‹เบ”เบฝเบงโ€‹เบเบฑเบ™โ€‹เบเบฑเบšโ€‹เบŠเบธเบ”โ€‹เบ—เบตเปˆโ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบเบฒเบ™โ€‹เบžเบปเบงโ€‹เบžเบฑเบ™โ€‹เบเบฑเบšโ€‹เบ–เบฒเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹.

เปƒเบ™เบ›เบตเบเบฒเบเบ™เบตเป‰, เบขเบนเปˆเบ—เบตเปˆ Digital Breakthrough hackathon, เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบกเบตเบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบฅเบฐเบšเบปเบšเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบญเบธเบ”เบชเบฒเบซเบฐเบเปเบฒเปเบฅเบฐเป€เบชเบ”เบ–เบฐเบเบดเบ”เบ”เบดเบˆเบดเบ•เบญเบ™เป‚เบ”เบเบ™เปเบฒเปƒเบŠเป‰เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบตเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบเบฒเบ™เบ—เบตเปˆเปเบˆเบเบขเบฒเบ; เบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเบเบฑเบ‡เป„เบ”เป‰เบ–เบทเบเบญเบญเบเปƒเบซเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเป‚เบ”เบเบเบญเบ‡เบ—เบถเบ™เบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเบ”เป‰เบฒเบ™เบ™เบฐเบงเบฑเบ”เบเปเบฒ (เบ‚เป‰เบญเบเบ„เบงเบ™เบ‚เบฝเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ. เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เบŠเปˆเบงเบโ€‹เป€เบซเบผเบทเบญโ€‹เบฅเป‰เบฒโ€‹, เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบœเบนเป‰โ€‹เบ—เบตเปˆโ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เป€เบฅเบตเปˆเบกโ€‹เบ•เบปเป‰เบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เป€เบฅเบตเปˆเบกโ€‹เบ•เบปเป‰เบ™โ€‹)โ€‹, เปเบฅเบฐโ€‹เปƒเบ™โ€‹เบ›เบฑเบ”โ€‹เบˆเบธโ€‹เบšเบฑเบ™โ€‹เปƒเบ™โ€‹เบ„เปเบฒโ€‹เบชเบฑเปˆเบ‡โ€‹.

เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™เบžเบฒเบชเบฒ Go, เปเบฅเบฐเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบšเบฅเบฑเบญเบเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปเบกเปˆเบ™ LevelDB.
เบžเบฒเบเบชเปˆเบงเบ™เบ•เบปเป‰เบ™เบ•เปเปเบกเปˆเบ™เป‚เบ›เป‚เบ•เบ„เบญเบ™, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ (เบ—เบตเปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ TCP เปเบฅเบฐ WebSocket - เบ—เปเบฒเบญเบดเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™ synchronizing blockchain, เบ—เบตเบชเบญเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบฅเบนเบเบ„เป‰เบฒ, เบชเบปเปˆเบ‡เบ—เบธเบฅเบฐเบเปเบฒเปเบฅเบฐเบ„เปเบฒเบชเบฑเปˆเบ‡เบˆเบฒเบ JavaScript, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡.

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป„เบ”เป‰เบเปˆเบฒเบงเบกเบฒเปเบฅเป‰เบง, blockchain เบ™เบตเป‰เปเบกเปˆเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เบปเป‰เบ™เบ•เปเป€เบžเบทเปˆเบญเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปเบฅเบฐเบ›เบปเบเบ›เป‰เบญเบ‡เบเบฒเบ™เปเบฅเบเบ›เปˆเบฝเบ™เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบœเบนเป‰เบชเบฐเบซเบ™เบญเบ‡เปเบฅเบฐเบฅเบนเบเบ„เป‰เบฒ, เบซเบผเบทเบ—เบฑเบ‡เบชเบญเบ‡เบ„เบปเบ™เปƒเบ™เบ„เบปเบ™เบ”เบฝเบง. เบ„เบปเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบšเปเปˆเบฎเบตเบšเบฎเป‰เบญเบ™เบ—เบตเปˆเบˆเบฐเป€เบŠเบทเปˆเบญเปƒเบˆเบเบฑเบ™. เปเบ•เปˆเบงเบฝเบเบ‡เบฒเบ™เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบชเป‰เบฒเบ‡ "เบ›เบทเป‰เบกเป€เบŠเบฑเบ" เบ—เบตเปˆเบกเบตเป€เบ„เบทเปˆเบญเบ‡เบ„เบดเบ”เป€เบฅเบเปƒเบ™เบ•เบปเบง, เปเบ•เปˆเบฅเบฐเบšเบปเบšเบ—เบตเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เบงเบฝเบเบ‡เบฒเบ™เบ›เบปเบเบเบฐเบ•เบดเบชเปˆเบงเบ™เปƒเบซเบเปˆเป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบงเบปเบ‡เบˆเบญเบ™เบŠเบตเบงเบดเบ”เบ‚เบญเบ‡เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™. bytecode เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบ•เปเปˆเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰, เบ•เบฒเบกเบ›เบฐเป€เบžเบ™เบตเบ‚เบญเบ‡ blockchains, เปเบกเปˆเบ™เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบงเบฑเบ”เบชเบฐเบ”เบธเบ›เป‰เบญเบ™เปเบฅเบฐเบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ‚เบญเบ‡เบ—เบธเบฅเบฐเบเปเบฒ (เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบ•เบปเบงเป€เบญเบ‡เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบšเบฅเบฑเบญเบ, เบ•เบฑเบ™เปƒเบ™ LevelDB เปเบกเปˆเบ™เบ–เบทเบเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบเปˆเบญเบ™เปƒเบ™เบฎเบนเบšเปเบšเบš GOB). เบ—เปเบฒเบญเบดเบ”, เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเป‚เบ›เป‚เบ•เบ„เบญเบ™เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ (aka node).

เป‚เบ›เป‚เบ•เบ„เบญเบ™เบšเปเปˆเบชเบฑเบšเบชเบปเบ™, เบˆเบธเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบกเบฑเบ™เปเบกเปˆเบ™เบเบฒเบ™เบ›เปˆเบฝเบ™เป„เบ›เบชเบนเปˆเป‚เบซเบกเบ”เบเบฒเบ™เป‚เบซเบผเบ”เบ‚เปเป‰เบกเบนเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡, เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบดเปเบกเปˆเบ™เบšเบฅเบฑเบญเบเบซเบผเบทเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ, เป€เบžเบทเปˆเบญเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบเบฑเบšเป€เบชเบฑเป‰เบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบžเบดเป€เบชเบ”, เปเบฅเบฐเบกเบฑเบ™เบเบฑเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบฅเบเบ›เปˆเบฝเบ™เบชเบดเบ™เบ„เป‰เบฒเบ„เบปเบ‡เบ„เบฑเบ‡, เป€เบžเบทเปˆเบญเปƒเบซเป‰ node เบฎเบนเป‰เบงเปˆเบฒเบกเบฑเบ™เปเบกเปˆเบ™เปƒเบœ. เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบกเบตเบ—เบธเบฅเบฐเบเบดเบ”เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ” (เบ‚เปเป‰เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบชเปเบฒเบฅเบฑเบšเบเบญเบ‡เบ›เบฐเบŠเบธเบก synchronization เบเบฑเบ‡เป€เบญเบตเป‰เบ™เบงเปˆเบฒ "เป€เบžเบทเปˆเบญเบ™เบšเป‰เบฒเบ™" เป€เบžเบฒเบฐเบงเปˆเบฒ IP เบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป€เบ›เบฑเบ™เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเปเบฅเบฐเบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบฅเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ).

เป‚เบŸเบ™เป€เบ”เบต (เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ—เบตเปˆ Linux เป€เบญเบตเป‰เบ™เบžเบงเบเป€เบ‚เบปเบฒ) เปƒเบ™เบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเบ‚เบญเบ‡เป‚เบ›เบฅเปเบเบฅเบก Go เบ–เบทเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒเปเบžเบฑเบเป€เบเบฑเบ”, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เปƒเบ™เบ•เบญเบ™เบ•เบปเป‰เบ™เบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเป„เบŸเบฅเปŒเบ—เบตเปˆเบกเบตเบฅเบฐเบซเบฑเบ” Go เบˆเบฒเบเป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ™เบตเป‰เบžเบงเบเป€เบ‚เบปเบฒเบ‚เบฝเบ™ package folder_name_where_this_file. เบ–เป‰เบฒโ€‹เบšเปเปˆโ€‹เบ”เบฑเปˆเบ‡โ€‹เบ™เบฑเป‰เบ™โ€‹, เบ—เปˆเบฒเบ™โ€‹เบˆเบฐโ€‹เบšเปเปˆโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เปƒเบซเป‰โ€‹เบญเบฒโ€‹เบซเบฒเบ™โ€‹เบŠเบธเบ”โ€‹เปƒเบซเป‰โ€‹เบ„เบญเบกโ€‹เบžเบดเบงโ€‹เป€เบ•เบตโ€‹เป„เบ”เป‰โ€‹. เบ”เบต, เบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบ„เบงเบฒเบกเบฅเบฑเบšเบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบ—เบตเปˆเบฎเบนเป‰เบžเบฒเบชเบฒเบ™เบตเป‰. เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบŠเบธเบ”:

  • เบเบฒเบ™โ€‹เบชเบทเปˆโ€‹เบชเบฒเบ™โ€‹เป€เบ„เบทเบญโ€‹เบ‚เปˆเบฒเบ (เป€เบŠเบตเบšโ€‹เป€เบงเบตโ€‹, เบฅเบนเบโ€‹เบ„เป‰เบฒโ€‹, protocolโ€‹)
  • เป‚เบ„เบ‡โ€‹เบชเป‰เบฒเบ‡โ€‹เบ‚เบญเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ—เบตเปˆโ€‹เป€เบเบฑเบšโ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เป„เบงเป‰โ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบ–เปˆเบฒเบโ€‹เป‚เบญเบ™ (blockโ€‹, เบ—เบธโ€‹เบฅเบฐโ€‹เบเปเบฒโ€‹)
  • เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ (blockchain)
  • เบ„เบงเบฒเบกเป€เบซเบฑเบ™เบ”เบตเป€เบซเบฑเบ™เบžเป‰เบญเบก
  • เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเบชเบฐเป€เปเบทเบญเบ™เบŠเป‰เบญเบ™เบเบฑเบ™ (xvm)
  • เบ•เบปเบงเบŠเปˆเบงเบ (crypto, เบ›เบฐเป€เบžเบ”) เบ—เบฑเบ‡เปเบปเบ”เบชเบณเบฅเบฑเบšเบ•เบญเบ™เบ™เบตเป‰.

เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบš github

เบ™เบตเป‰เปเบกเปˆเบ™เบชเบฐเบšเบฑเบšเบเบฒเบ™เบชเบถเบเบชเบฒ, เบกเบฑเบ™เบ‚เบฒเบ”เบ›เบฐเบ•เบดเบชเปเบฒเบžเบฑเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบฅเบฐเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบเบฒเบ™เบ—เบปเบ”เบฅเบญเบ‡เบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡, เปเบ•เปˆเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™เบเบฑเบšเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ—เบตเปˆเบเปเบฒเบฅเบฑเบ‡เบ”เปเบฒเป€เบ™เบตเบ™. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเบชเบดเปˆเบ‡เปƒเบ”เบ—เบตเปˆเบˆเบฐเปเบ™เบฐเบ™เปเบฒเปƒเบ™เบ„เปเบฒเป€เบซเบฑเบ™, เบ‚เป‰เบญเบเบˆเบฐเบเบดเบ™เบ”เบตเบ—เบตเปˆเบˆเบฐเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเปƒเบ™เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ•เปเปˆเป„เบ›. เปเบฅเบฐเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปเบฅเบฐ protocol.

เบฅเบญเบ‡เป€เบšเบดเปˆเบ‡เป€เบŠเบตเบšเป€เบงเบตเบเปˆเบญเบ™.

routine เบเปˆเบญเบเบ‚เบญเบ‡เป€เบŠเบตเบšเป€เบงเบตเป€เบฎเบฑเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบขเบนเปˆเป€เบ—เบดเบ‡เบชเบธเบ”เบ‚เบญเบ‡เป‚เบ›เป‚เบ•เบ„เบญเบ™ TCP เป‚เบ”เบเปƒเบŠเป‰เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบŠเบธเบ”เป‚เบ›เป‚เบ•เบ„เบญเบ™.

เบ›เบปเบเบเบฐเบ•เบดเปƒเบŠเป‰เปเบžเบฑเบเป€เบเบ”เบ•เปเปˆเป„เบ›เบ™เบตเป‰: เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, protocol, เบ›เบฐเป€เบžเบ”. เปƒเบ™เบŠเบธเบ”เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡ tcp_server.go เบกเบตเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™ เบฎเบฑเบšเปƒเบŠเป‰.

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

เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบเบญเบกเบฎเบฑเบšเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  • เบžเบญเบ”เป€เบ„เบทเบญเบ‚เปˆเบฒเบเป‚เบ”เบเบœเปˆเบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เปเบฅเบเบ›เปˆเบฝเบ™
  • เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบŠเบตเบšเป€เบงเบตเปƒเบ™เบฎเบนเบšเปเบšเบš JSON
  • เบ—เบธเบ‡เบชเบณเบฅเบฑเบšเปเบฅเปˆเบ™เบขเบนเปˆเปƒเบ™เป‚เปเบ”เบ”เบตเบšเบฑเบ (เบšเบฅเบฑเบญเบเป€เบŠเบ™เบชเปˆเบงเบ™เบ•เบปเบง)

เบ„เบงเบฒเบกเบ„เบทเบšเปœเป‰เบฒ:

  • เบญเปˆเบฒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบˆเบฒเบเป„เบŸเบฅเปŒ JSON
  • เบ—เบธเบ‡เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบ”เบตเบšเบฑเบเบ–เบทเบเบเบงเบ”เบชเบญเบš: เบ–เป‰เบฒเบกเบฑเบ™เบ–เบทเบเบ•เบฑเป‰เบ‡, เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒ synchronization เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบšเปเปˆเป„เบ”เป‰เป€เบ›เบตเบ”เบ•เบปเบงเปเบฅเบฐ blockchain เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเป‚เบซเบฅเบ”.
  • เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปเบฅเบฐเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ

Server

  • เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ TCP เปเบฅเบฐเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเป€เบ„เบทเบญเบ‚เปˆเบฒเบเป‚เบ”เบเบชเบญเบ”เบ„เปˆเบญเบ‡เบเบฑเบšเป‚เบ›เป‚เบ•เบ„เบญเบ™.
  • เบกเบฑเบ™เบกเบตเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™ Serve เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเปเบฒเบเป€เบฅเบเบžเบญเบ”, เบ‚เบฐเปœเบฒเบ” buffer เปเบฅเบฐเบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเป‚เบ„เบ‡เบชเป‰เบฒเบ‡ types.Settings
  • เบงเบดเบ—เบตเบเบฒเบ™ Run เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเป€เบ„เบทเบญเบ‚เปˆเบฒเบ (เบŸเบฑเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบฒเป€เบ‚เบปเป‰เบฒเบขเบนเปˆเปƒเบ™เบžเบญเบ”เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰, เป€เบกเบทเปˆเบญเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปƒเบซเบกเปˆ, เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบ‚เบญเบ‡เบกเบฑเบ™เบ–เบทเบเป‚เบญเบ™เป„เบ›เบซเบฒเบงเบดเบ—เบตเบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบชเปˆเบงเบ™เบ•เบปเบงเปƒเบ™เบซเบปเบงเบ‚เปเป‰เปƒเบซเบกเปˆ)
  • ะ’ เบˆเบฑเบšเป„เบ”เป‰ เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เบ•เปเปˆโ€‹เปเบกเปˆเบ™โ€‹เป„เบ”เป‰โ€‹เบญเปˆเบฒเบ™โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป„เบ›โ€‹เปƒเบ™ bufferโ€‹, เบ›เปˆเบฝเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เบ•เบปเบงโ€‹เปเบ—เบ™โ€‹เบชเบฐโ€‹เบ•โ€‹เบฃเบดเบ‡โ€‹เปเบฅเบฐโ€‹เบชเบปเปˆเบ‡โ€‹เป„เบ›โ€‹ protocol.เบ—เบฒเบ‡เป€เบฅเบทเบญเบ
  • protocol.เบ—เบฒเบ‡เป€เบฅเบทเบญเบ เบเบฑเบšเบ„เบทเบ™ เบœเบปเบ™ เบซเบผเบทเป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”. เบœเบปเบ™ เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ™เบฑเป‰เบ™โ€‹เป„เบ”เป‰โ€‹เบเบปเบโ€‹เบเป‰เบฒเบโ€‹เป„เบ›โ€‹ protocol.Interpreteเป€เบŠเบดเปˆเบ‡เบเบฑเบšเบ„เบทเบ™เบกเบฒ intrpr - เบงเบฑเบ”โ€‹เบ–เบธโ€‹เบ›เบฐโ€‹เป€เบžเบ”โ€‹ เปเบ›เบ‚เปเป‰เบกเบนเบ™, เบซเบผเบทเป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบœเบปเบ™เบเบฒเบ™เบ„เบฑเบ”เป€เบฅเบทเบญเบ
  • เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบชเบฐเบซเบผเบฑเบšเป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ” intrpr.Commands[0] เป€เบŠเบดเปˆเบ‡เบเบงเบ”เบชเบญเบšเปœเบถเปˆเบ‡เปƒเบ™: เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš, inv, เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” เปเบฅเบฐโ€‹เบกเบตโ€‹เบžเบฒเบโ€‹เบชเปˆเบงเบ™โ€‹ Default
  • เปƒเบ™เบžเบฒเบ เบœเบปเบ™ เบชเบฐเบงเบดเบ”เปเบกเปˆเบ™เบžเบปเบšเป‚เบ”เบเบ„เปˆเบฒ intrpr.Commands[1] เป€เบŠเบดเปˆเบ‡เบเบงเบ”เบชเบญเบšเบ„เปˆเบฒ bufferlength ะธ เบชเบฐเบšเบฑเบšเบžเบฒเบชเบฒ (เปƒเบ™โ€‹เปเบ•เปˆโ€‹เบฅเบฐโ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบเบฒเบ™โ€‹เบ—เปเบฒโ€‹เบ‡เบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบชเบญเบ”โ€‹เบ„เป‰เบญเบ‡โ€‹เบเบฑเบ™โ€‹เปเบกเปˆเบ™โ€‹เป€เบญเบตเป‰เบ™โ€‹เบงเปˆเบฒโ€‹)

เบŸเบฑเบ‡เบŠเบฑเบ™ GetVersion ะธ BufferLength เบขเบนเปˆเปƒเบ™เป„เบŸเบฅเปŒ srvlib.go เบŠเบธเบ”เป€เบŠเบตเบšเป€เบงเบต

GetVersion(conn net.Conn, version string)

เบกเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเบžเบดเบกเปƒเบชเปˆ console เปเบฅเบฐเบชเบปเปˆเบ‡เบชเบฐเบšเบฑเบšเบ—เบตเปˆเบœเปˆเบฒเบ™เปƒเบ™เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเป„เบ›เบซเบฒเบฅเบนเบเบ„เป‰เบฒ:

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

.
เบเบฒเบ™เบ—เปเบฒเบ‡เบฒเบ™เบ‚เบญเบ‡

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

เป‚เบซเบฅเบ”เบšเบฅเบฑเบญเบ, เบ—เบธเบฅเบฐเบเปเบฒ, เบซเบผเบทเบ‚เปเป‰เบกเบนเบ™เบชเบฐเป€เบžเบฒเบฐเบญเบทเปˆเบ™เป†เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  • เบžเบดเบกเปƒเบชเปˆ console เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™เป‚เบ›เป‚เบ•เบ„เบญเบ™เบ—เบตเปˆเบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบญเบกเบฎเบฑเบš:
    fmt.Println("DataType:", intrpr.Commands[2])
  • เบญเปˆเบฒเบ™เบ„เปˆเบฒ intrpr.เบฎเปˆเบฒเบ‡เบเบฒเบ เบเบฑเบšเบ•เบปเบงเปเบ›เบ•เบปเบงเป€เบฅเบ buf_len
  • เบชเป‰เบฒเบ‡ buffer newbuf เบ‚เบฐเปœเบฒเบ”เบ—เบตเปˆเบฅเบฐเบšเบธ:
    make([]byte, buf_len)
  • เบชเบปเปˆเบ‡โ€‹เบเบฒเบ™โ€‹เบ•เบญเบšโ€‹เบชเบฐโ€‹เบซเบ™เบญเบ‡ ok:
    conn.Write([]byte("result:ok"))
  • เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆ buffer เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™เบˆเบฒเบเบเบฐเปเบชเบเบฒเบ™เบญเปˆเบฒเบ™:
    io.ReadFull(conn, newbuf)

    .

  • เบžเบดเบกเป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡ buffer เปƒเบชเปˆ console เป„เบ”เป‰
    fmt.Println(string(newbuf))

    เปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡ bytes เบญเปˆเบฒเบ™

    fmt.Println("Bytes length:", n)
  • เบชเบปเปˆเบ‡โ€‹เบเบฒเบ™โ€‹เบ•เบญเบšโ€‹เบชเบฐโ€‹เบซเบ™เบญเบ‡ ok:
    conn.Write([]byte("result:ok"))

เบงเบดเบ—เบตเบเบฒเบ™เบˆเบฒเบเปเบžเบฑเบเป€เบเบฑเบ”เป€เบŠเบตเบšเป€เบงเบตเบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปƒเบซเป‰เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเป‚เบ”เบเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™เบˆเบฒเบเปเบžเบฑเบเป€เบเบฑเบ” protocol.

เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒ

เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒเป€เบฎเบฑเบ”เปœเป‰เบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบเบฒเบ™เปเบฅเบเบ›เปˆเบฝเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบ.

Choice(str string) (string, error) เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเป‚เบ”เบเป€เบŠเบตเบšเป€เบงเบต, เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบชเบฐเบ•เบฃเบดเบ‡เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เป€เบ›เบฑเบ™เบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™ เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบชเบฐเบ•เบฃเบดเบ‡เบ—เบตเปˆเบเบฝเบกเป„เบงเป‰เบชเปเบฒเบฅเบฑเบš เบ™เบฒเบเบžเบฒเบชเบฒ:

  • เบชเบฒเบเบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ–เบทเบเปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เบซเบปเบง เปเบฅเบฐ เบฎเปˆเบฒเบ‡เบเบฒเบเป‚เบ”เบเปƒเบŠเป‰ ReqParseN2(str)
  • เบซเบปเบงเบ–เบทเบเปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเปเบฅเบฐเบ–เบทเบเบˆเบฑเบ”เปƒเบชเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ•เปˆเบญเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เป‚เบ”เบเปƒเบŠเป‰ ReqParseHead(head)
  • ะ’ เบชเบฐเบซเบผเบฑเบš(เบ„เปเบฒเบชเบฑเปˆเบ‡[0]) เป€เบฅเบทเบญเบเบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบš (cmd, เบฅเบฐเบซเบฑเบ”, เบ—เบตเปˆเบขเบนเปˆ เบซเบผเบทเบžเบฒเบเบชเปˆเบงเบ™เบ–เบทเบเบเบฐเบ•เบธเป‰เบ™ Default)
  • 2 เบ„เปเบฒเบชเบฑเปˆเบ‡เบ–เบทเบเบเบงเบ”เบชเบญเบšเปƒเบ™ cmd switch(เบ„เปเบฒเบชเบฑเปˆเบ‡[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 ะธ TCPRresponseData.

เบเบฒเบ™เบ—เปเบฒเบ‡เบฒเบ™เบ‚เบญเบ‡

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

เป€เบฎเบฑเบ”เบงเบฝเบเปเบšเบšเบ™เบตเป‰:

  • เบเบฒเบ™โ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เบ•เปเปˆโ€‹เปเบกเปˆเบ™โ€‹เป€เบฎเบฑเบ”โ€‹เปƒเบซเป‰โ€‹เบเบฒเบ™โ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เบ•เปเปˆโ€‹เบ—เบตเปˆโ€‹เบฅเบฐโ€‹เบšเบธโ€‹เป„เบงเป‰โ€‹เปƒเบ™โ€‹เบงเบฑเบ”โ€‹เบ–เบธโ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบœเปˆเบฒเบ™โ€‹
    net.Dial("tcp", s.Host + ":" + s.Port)
  • เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เปƒเบ™เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ‚เปเป‰เบกเบนเบ™เบ–เบทเบเบชเบปเปˆเบ‡:
    conn.Write(data)
  • เบ„เปเบฒเบ•เบญเบšเปเบกเปˆเบ™เบญเปˆเบฒเบ™
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    เปเบฅเบฐเบžเบดเบกเบญเบญเบเปƒเบ™ console เป„เบ”เป‰

    fmt.Println(string(resp[:n]))
  • เบ–เป‰เบฒเป‚เบญเบ™ payload เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ™เบฑเป‰เบ™โ€‹เบœเปˆเบฒเบ™โ€‹เบกเบฑเบ™โ€‹
    conn.Write(payload)

    เปเบฅเบฐเบเบฑเบ‡เบญเปˆเบฒเบ™เบ„เปเบฒเบ•เบญเบšเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, เบžเบดเบกเบกเบฑเบ™เปƒเบชเปˆ console

เบเบฒเบ™เบ—เปเบฒเบ‡เบฒเบ™เบ‚เบญเบ‡

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

เบชเป‰เบฒเบ‡ buffer เบ‚เบญเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰, เบญเปˆเบฒเบ™เบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™ buffer เบ™เบตเป‰เปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡ bytes เบญเปˆเบฒเบ™, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบงเบฑเบ”เบ–เบธเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”.

เบเบดเบ”เบˆเบฐเบเบณเบเปˆเบญเบเบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒ

เบฎเบฑเบšเปƒเบŠเป‰เบเบฒเบ™เบชเบปเปˆเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡เป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡ node, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเบชเบฐเบ–เบดเบ•เบดเบชเบฑเป‰เบ™เป†เปเบฅเบฐเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš.

เบชเบฒเบกเบฒเบ”เบเบญเบกเบฎเบฑเบšเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ•เปเปˆเป„เบ›เบ™เบตเป‰: เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปƒเบ™เบฎเบนเบšเปเบšเบš JSON, เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบ›เบฑเบ™เบชเบฐเบ•เบฃเบดเบ‡, เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบซเบฒเป„เบŸเบฅเปŒเบ—เบตเปˆเบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เป„เบ›เบซเบฒ payload, node scheduler emulation flag, เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป‚เบญเบ™เป€เบ›เบฑเบ™เบ„เปˆเบฒเบ•เบปเบงเป€เบฅเบ.

  • เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹
    st := types.ParseConfig(*config)
  • เบ–เป‰เบฒเบ—เบธเบ‡ emu เบ–เบทเบเบœเปˆเบฒเบ™, เบกเบฑเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ เบœเบนเป‰เบฅเป‰เบฝเบ‡
  • เบ–เป‰เบฒเบ—เบธเบ‡ 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 เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบˆเบฒเบ JavaScript, เปƒเบ™ 4 เบ‚เป‰เบญเบเบˆเบฐเป€เบšเบดเปˆเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ synchronization, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เป€เบ„เบทเปˆเบญเบ‡ stack เบ—เบตเปˆเบ›เบธเบ‡เปเบ•เปˆเบ‡ bytecode เบˆเบฒเบเบงเบฑเบ”เบชเบฐเบ”เบธเบ›เป‰เบญเบ™เปเบฅเบฐเบœเบปเบ™เบœเบฐเบฅเบดเบ”, cryptography เปเบฅเบฐ. เบชเบฐเบ™เบธเบเป€เบเบตเบชเปเบฒเบฅเบฑเบšเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™