рдлрд┐рд░ рднреА рдПрдХ рдФрд░ рдкреА 2 рдкреА рдореИрд╕реЗрдВрдЬрд░
рд╕рдореАрдХреНрд╖рд╛ рдФрд░ рднрд╛рд╖рд╛ рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝рдирд╛ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдЙрдкрдпреЛрдЧреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред
рд╕рдореЗрдХрд┐рдд рд╣реЛрдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдпрд╣ рд▓реЗрдЦ рд╢реБрд░реБрдЖрддреА рднрд╛рд╖рд╛ рдФрд░ рдкреАрдпрд░-рдЯреВ-рдкреАрдпрд░ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИред
рдФрд░ рдРрд╕реЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЙрдЪрд┐рдд рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдВ рдХрд╛рдлреА рд╕рдордп рд╕реЗ рдЬрд╛рд╡рд╛, рдкреАрдПрдЪрдкреА, рдЬреЗрдПрд╕, рдЕрдЬрдЧрд░ рдореЗрдВ рд╡рд┐рд╕рд░реНрдЬрди рдХреА рдбрд┐рдЧреНрд░реА рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдФрд░ рд╣рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрдЪреНрдЫреА рд╣реИред
рдЧреЛ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдХреНрд╖реЗрддреНрд░ рд╡рд┐рддрд░рд┐рдд рд╕реЗрд╡рд╛рдУрдВ, рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реИред
рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдПрдХ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд╛ рдПрдХ рдЫреЛрдЯрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ рдЬреЛ рдЗрд╕рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдХреЛ рдЕрднреА рднреА рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдорд╛рдЗрдХреНрд░реЛрд╕рд┐рд╕реНрдЯрд░реНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рдХреЛ рдЖрд╕рд╛рди рдФрд░ рджрд░реНрдж рд░рд╣рд┐рдд рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рдиреЗрдЯрд╡рд░реНрдХ рдСрдл рдкреАрдпрд░ (рдкреАрдпрд░-рдЯреВ-рдкреАрдпрд░) рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡реЗрджрди рд▓рд┐рдЦреЗрдВрдЧреЗ, рд╕рдмрд╕реЗ рд╕рд░рд▓ рдПрдХ рдкреА 2 рдкреА рдореИрд╕реЗрдВрдЬрд░ рд╣реИ (рд╡реИрд╕реЗ, рдЗрд╕ рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрд╕реА рдкрд░реНрдпрд╛рдп рд╣реИ?)ред
рдХреЛрдб рдореЗрдВ, рдореИрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╕рд╛рдЗрдХрд┐рд▓ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЧреЛрд▓рдЧрдкреНрдкреЗ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрджрдо рдЙрдард╛рддрд╛ рд╣реВрдВ, рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдФрд░ рддрд░реНрдХрд╕рдВрдЧрдд рд╕реБрдЭрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВред
рд╣рдо рдХреНрдпрд╛ рдХрд░реЗрдВ?
рдкреАрдпрд░ (рд╕рд╣рдХрд░реНрдореА) - рдореИрд╕реЗрдВрдЬрд░ рдХрд╛ рдПрдХ рдЕрдиреВрдард╛ рдЙрджрд╛рд╣рд░рдгред
рд╣рдорд╛рд░реЗ рджреВрдд рдХреЛ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
- рдЖрд╕-рдкрд╛рд╕ рдХреА рджрд╛рд╡рддреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ
- рдЕрдиреНрдп рд╕рд╛рдерд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
- рд╕рд╛рдерд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░реЗрдВ
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдПрдВ
рдХрд╛рд░реНрдп рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╣рдо рд╕рднреА рдХреЛ рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдкреЛрд░реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рджреЗрдВред

рдпрджрд┐ рдЖрдк HTTP рдкрд░ рдЗрд╕ рдкреЛрд░реНрдЯ рдХреЛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рд░рд┐рдПрдХреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдЙрд╕реА рдкреЛрд░реНрдЯ рдХреЛ рдЦреАрдВрдЪрддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рд╕реЗ HTTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреЛрд░реНрдЯ рдХреЛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдмреИрдирд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред
рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рд╕рд╣рдХрд░реНрдореА рдЗрд╕ рдкреЛрд░реНрдЯ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ, рддреЛ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдерд╛рдпреА рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ рдЦреЛрд▓реЗрдВ рдФрд░ рд╣рдо рдирдП рдХрдиреЗрдХреНрд╢рди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗред
net.ListenTCP("tcp", tcpAddr)
рдирдП рдХрдиреЗрдХреНрд╢рди рдкрд░, рдкрд╣рд▓реЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝реЗрдВред
рд╣рдо HTTP рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА 4 рдмрд╛рдЗрдЯреНрд╕ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВред
рдЕрдм рд╣рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рд╕реЗ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо рдПрдХ рдмреИрдирд░ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВред
buf, err := readWriter.Peek(4) if ItIsHttp(buf) { handleHttp(readWriter, conn, p) } else { peer := proto.NewPeer(conn) p.HandleProto(readWriter, peer) } if !strings.EqualFold(s, "127") && !strings.EqualFold(s, "[::") { response.Body = ioutil.NopCloser(strings.NewReader("Peer To Peer Messenger. see https://github.com/easmith/p2p-messenger")) }
рдпрджрд┐ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдиреАрдп рд╣реИ, рддреЛ рд╣рдо рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд░реВрдк рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВред
рддрдм рдореИрдВрдиреЗ рд╕реНрд╡рдпрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред
рдпрджрд┐ рдкрде /ws
рдбрдмреНрд▓реНрдпреВрдПрд╕ /ws
рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
рдЪреВрдВрдХрд┐ рдореИрдВрдиреЗ рдмрд╛рдЗрдХ рдХреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдлрд╝рд╛рдЗрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЧреЛрд░рд┐рд▓реНрд▓рд╛ / рд╡реЗрдмрд╕реНрдХреЙрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрдмреНрд▓реНрдпреВрдПрд╕ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд░реВрдВрдЧрд╛ ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, MyWriter
рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ http.ResponseWriter
рдФрд░ http.Hijacker
рдЕрдиреБрд░реВрдк рддрд░реАрдХреЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВред
рдкреАрдпрд░ рдбрд┐рдЯреЗрдХреНрд╢рди
рдПрдХ рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рд╕рд╛рдерд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпреВрдбреАрдкреА рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рд╣рдо рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯ рдЖрдИрдкреА рдкрддреЗ рдкрд░ рдЕрдкрдиреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЯ рднреЗрдЬреЗрдВрдЧреЗред
func startMeow(address string, p *proto.Proto) { conn, err := net.DialUDP("udp", nil, addr) for { _, err := conn.Write([]byte(fmt.Sprintf("meow:%v:%v", hex.EncodeToString(p.PubKey), p.Port))) time.Sleep(1 * time.Second) } }
рдФрд░ рд╕рднреА рдпреВрдбреАрдкреА рдкреИрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯ рдЖрдИрдкреА рд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд╕реБрдиреЗрдВред
func listenMeow(address string, p *proto.Proto, handler func(p *proto.Proto, peerAddress string)) { conn, err := net.ListenMulticastUDP("udp", nil, addr) _, src, err := conn.ReadFromUDP(buffer)
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдо рдЦреБрдж рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреНрдп рджрд╛рд╡рддреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрддреЗ рд╣реИрдВред
рдЖрдИрдкреА тАЛтАЛрд╕реНрддрд░ рдкрд░ рдЗрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рдЖрдИрдкреАрд╡реА 4 рдкреИрдХреЗрдЬ рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ, рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╕ рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯ рдбреЗрдЯрд╛ рдкреИрдХреЗрдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдкреАрдпрд░ рдЗрдВрдЯрд░реЗрдХреНрд╢рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓
рд╣рдо рдПрдХ рд▓рд┐рдлрд╛рдлреЗ (рд▓рд┐рдлрд╛рдлрд╛) рдореЗрдВ рд╕рд╛рдерд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕рднреА рд╕рдВрдЪрд╛рд░ рдкреИрдХ рдХрд░реЗрдВрдЧреЗред
рдХрд┐рд╕реА рднреА рд▓рд┐рдлрд╛рдлреЗ рдкрд░ рд╣рдореЗрд╢рд╛ рдПрдХ рдкреНрд░реЗрд╖рдХ рдФрд░ рдПрдХ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдХрдорд╛рдВрдб (рдЬреЛ рд╡рд╣ рдЙрд╕рдХреЗ рд╕рд╛рде рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ) рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдЕрдм рддрдХ рдпрд╣ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╣реИрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рд╕рд╛рдордЧреНрд░реА рдХреА рд▓рдВрдмрд╛рдИ рдФрд░ рд▓рд┐рдлрд╛рдлреЗ рдХреА рд╕рд╛рдордЧреНрд░реА - рдПрдХ рд╕рдВрджреЗрд╢ рдпрд╛ рдХрдорд╛рдВрдб рдкреИрд░рд╛рдореАрдЯрд░ред

рдЖрджреЗрд╢, (рдпрд╛ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдкреНрд░рдХрд╛рд░) рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓рд┐рдлрд╛рдлреЗ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рдо 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдЖрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ HTTP рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЕрдВрддрд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рджреМрд░рд╛рди рдкреВрд░реЗ рд▓рд┐рдлрд╛рдлреЗ рдХреЛ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рд╛рде рдорд┐рд▓рд╛рдирд╛
рдЬрдм рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджрд╛рд╡рдд рддреБрд░рдВрдд рд╕рд╛рдЭрд╛ рд╕рддреНрд░ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдирд╛рдо, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдФрд░ рдкрдВрдЪрд╛рдЯ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рджреЗрддреЗ рд╣реБрдП, рдПрдХ рд╣реИрдВрдбрд╢реЗрдХ рдХреЗ рд▓рд┐рдП рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред
рдЬрд╡рд╛рдм рдореЗрдВ, рд╕рд╣рдХрд░реНрдореА рдХреЛ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рд╕рдорд╛рди рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЕрдкрдиреА рд╕реВрдЪреА рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╣рдХрд░реНрдореА рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕рддреНрд░ рдХреБрдВрдЬреА рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ (CalcSedenSecret)ред
func handShake(p *proto.Proto, conn net.Conn) *proto.Peer { peer := proto.NewPeer(conn) p.SendName(peer) envelope, err := proto.ReadEnvelope(bufio.NewReader(conn)) }
рджрд╛рд╡рдд рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди
рдПрдХ рд╣рд╛рде рдорд┐рд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд╛рдерд┐рдпреЛрдВ рдиреЗ рдЕрдкрдиреЗ рд╕рд╛рдерд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ =)
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓рд┐рд╕реНрдЯ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд┐рдлрд╛рдлрд╛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рдерд┐рдпреЛрдВ рдХреА рдПрдХ JSON рд╕реВрдЪреА рдХреЛ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЬрд╡рд╛рдм рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд▓рд┐рдлрд╛рдлрд╛ рдорд┐рд▓рддрд╛ рд╣реИред
рд╣рдо рдирдП рдХреА рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рдкрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд╕рд╛рде рд╣рдо рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рде рдорд┐рд▓рд╛рддреЗ рд╣реИрдВ, рджрд╛рд╡рддреЛрдВ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реА рддрд░рд╣ ...
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрджреЗрд╢
рдХрд╕реНрдЯрдо рд╕рдВрджреЗрд╢ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдореВрд▓реНрдп рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░реЗрдВрдЧреЗред
рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдХреНрд░рд┐рдкреНрдЯреЛ рдкреИрдХреЗрдЬ рд╕реЗ рдорд╛рдирдХ (Google) рдЧреЛрд▓рдВрдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ (рдХреЛрдИ GOST рдорд╛рдирдХ рдирд╣реАрдВ рд╣реИрдВ)ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ Ed25519 рд╡рдХреНрд░ рд╣реИред рд╣рдо рд╕рдВрджреЗрд╢ рд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ed25519 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВрдиреЗ ed25519 рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬреЛрдбрд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛, рди рдХреЗрд╡рд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ рдПрдХ рд╕рддреНрд░ рдХреБрдВрдЬреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреАред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдХреБрдВрдЬреА рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреА рдХреБрдВрдЬреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ - рдЖрдкрдХреЛ рдЕрднреА рднреА рдЙрдиреНрд╣реЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
func CreateKeyExchangePair() (publicKey [32]byte, privateKey [32]byte) { pub, priv, err := ed25519.GenerateKey(nil) copy(publicKey[:], pub[:]) copy(privateKey[:], priv[:]) curve25519.ScalarBaseMult(&publicKey, &privateKey) }
рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдкрдВрдЪрд╛рдВрдЧ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓рдирд╛, рдпрд╣ рд╕рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬреЛ рд╣рдорд▓рд╛рд╡рд░реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреБрдВрдЬреА рд▓реЗрдиреЗ рдХрд╛ рдореМрдХрд╛ рдирд╣реАрдВ рдЫреЛрдбрд╝рддрд╛ рд╣реИред
рдЧрдгрд┐рдд рдкреНрд░реЗрдорд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рд╡рд┐рдХрд┐ рд▓рд┐рдВрдХ рджрд┐рдП рдЧрдП рд╣реИрдВ:
рдбрд┐рдлреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ - рдПрд▓рд┐рдкреНрдЯрд┐рдХрд▓ рдХрд░реНрд╡реНрд╕ рдкрд░ Hellman_
рдбрд┐рдЬрд┐рдЯрд▓ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдПрдбреАрдбреАрдПрд╕рдП
рдПрдХ рд╕рд╛рдЭрд╛ рдХреБрдВрдЬреА рдХреА рдкреАрдврд╝реА рдХрд╛рдлреА рдорд╛рдирдХ рд╣реИ: рдкрд╣рд▓рд╛, рдПрдХ рдирдП рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрдВрдЪрд╛рдВрдЧ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд┐рдлрд╛рдлрд╛ рднреЗрдЬрддреЗ рд╣реИрдВред
рд╡рд┐рдкрд░реАрдд рдкрдХреНрд╖ рдПрдХ рд╣реА рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рдХреНрд░рдо рдореЗрдВ: рдпрд╣ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд┐рдлрд╛рдлрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЕрдкрдиреА рдЬреЛрдбрд╝реА рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХреЛ рд╕реЙрдХреЗрдЯ рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИред
рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддрд┐рднрд╛рдЧреА рдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рдФрд░ рдХреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдФрд░ рдирд┐рдЬреА рдкрдВрдЪрд╛рдВрдЧ рдХреБрдВрдЬреА рд╣реИред
рдЙрдиреНрд╣реЗрдВ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред
рд╣рдо рдмреНрд▓реЙрдХ рдпреБрдЧреНрдорди рдореЛрдб (CBC) рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдПрдИрдПрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рджреНрд╡рд╛рд░рд╛ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░реЗрдВрдЧреЗред
рдпреЗ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрд╕рд╛рдиреА рд╕реЗ рдЧреЛрд▓рдВрдЧ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдмреНрд▓реЙрдХ рдХреА рд▓рдВрдмрд╛рдИ (16 рдмрд╛рдЗрдЯреНрд╕) рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдкрд░рд┐рд╢реЛрдзрди рдХреЗ рд╕рд╛рде рд╕рдВрджреЗрд╢ рдХреЛ рдСрдЯреЛ-рдлрд┐рд▓рд┐рдВрдЧ рдПрдХрдорд╛рддреНрд░ рд╢реЛрдзрди рд╣реИред
2013 рдореЗрдВ рд╡рд╛рдкрд╕, рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдИрдИрдПрд╕ (рд╕реАрдмреАрд╕реА рдХреЗ рд╕рдорд╛рди рдореЛрдб рдХреЗ рд╕рд╛рде) рдХреЛ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдореЗрдВ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╡реЗрд▓ рдбреБрд░реЛрд╡ рд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред
рдЙрд╕ рд╕рдордп, рд╕рдмрд╕реЗ рдЖрдо рдбрд┐рдлреА-рд╣реЗрд▓рдореИрди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреЗрд▓реАрдЧреНрд░рд╛рдореЛрдВ рдореЗрдВ рдПрдХ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ ред
рдФрд░ рдлрд░реНрдЬреА рдХрдиреЗрдХреНрд╢рди рд╕реЗ рд▓реЛрдб рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдореБрдЦ рдПрдХреНрд╕рдЪреЗрдВрдЬ рд╕реЗ рдкрд╣рд▓реЗ, рдЧреНрд░рд╛рд╣рдХреЛрдВ рдиреЗ рдлреИрдХреНрдЯрд░рд╛рдЗрдЬреЗрд╢рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред
рдЬреАрдпреВрдЖрдИ
рд╣рдореЗрдВ рд╕рд╛рдерд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджрд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╕рд╣рдХрд░реНрдореА рдХреЗ рдирд╛рдо рдХреЗ рдЖрдЧреЗ рдХрд╛рдЙрдВрдЯрд░ рдмрдврд╝рд╛рдХрд░ рдирдП рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рднреА рджреЗрдирд╛ рд╣реИред
рдпрд╣рд╛рдБ рдореБрд╕реАрдмрддреЛрдВ рдХреЗ рдмрд┐рдирд╛ - ReactJS + websocketред
рд╡реЗрдм рд╕реЙрдХреЗрдЯ рд╕рдВрджреЗрд╢ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЕрджреНрд╡рд┐рддреАрдп рд▓рд┐рдлрд╛рдлреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдЙрдирдореЗрдВ рд╕рд┐рдлрд░рдЯреЗрдХреНрд╕реНрдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред
рд╡реЗ рд╕рднреА WsCmd
рдкреНрд░рдХрд╛рд░ рдХреЗ "рд╡рд╛рд░рд┐рд╕" рд╣реИрдВ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдкрд░ JSON рдореЗрдВ рдХреНрд░рдордмрджреНрдз рд╣реИрдВред
рддреЛ, рдПрдХ HTTP рдЕрдиреБрд░реЛрдз рд░реВрдЯ ("/") рдкрд░ рдЖрддрд╛ рд╣реИ, рдЕрдм рд╕рд╛рдордиреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, "рд╕рд╛рдордиреЗ / рдирд┐рд░реНрдорд╛рдг" рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рджреЗрдЦреЗрдВ рдФрд░ index.html рджреЗрдВ
рд╡реИрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реИ: рдЗрд╕реЗ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдпрд╛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЪрд▓рд╛рдПрдВ - WebViewред
рдЕрдВрддрд┐рдо рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП zserge / webview рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛
e := webview.Open("Peer To Peer Messenger", fmt.Sprintf("http://localhost:%v", initParams.Port), 800, 600, false)
рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
sudo apt install libwebkit2gtk-4.0-dev
рдЬреАрдпреВрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рдХреНрд░рдо рдореЗрдВ, рдореБрдЭреЗ рдЬреАрдЯреАрдХреЗ, рдХреНрдпреВрдЯреА рдХреЗ рд▓рд┐рдП рдХрдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдорд┐рд▓реАрдВ, рдФрд░ рдХрдВрд╕реЛрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрд╣реБрдд geeky рд▓рдЧреЗрдЧрд╛ - https://github.com/jroimartin/gocui - рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ред
рдореИрд╕реЗрдВрдЬрд░ рд▓реЙрдиреНрдЪ
рдЧреЛрд▓рд╛рдВрдЧ рд╕реНрдерд╛рдкрдирд╛
рдмреЗрд╢рдХ, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЧреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЕрддреНрдпрдзрд┐рдХ golang.org/doc/install рдЕрдиреБрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ ред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХреЛрд╕рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдирд┐рд░реНрджреЗрд╢
GOPATH рдореЗрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
рдпрд╣ рдЗрддрдиреА рд╡реНрдпрд╡рд╕реНрдерд╛ рд╣реИ рдХрд┐ рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рддрдерд╛рдХрдерд┐рдд GOPATH рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ $ HOME / рдЧреЛ рд╣реИред рдЧреЛ рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрдВрдбрд╛рд░ рд╕реЗ рд╕реНрд░реЛрдд рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
go get github.com/easmith/p2p-messenger
рдЕрдм, рдЖрдкрдХреЗ $HOME/go/src/github.com/easmith/p2p-messenger
рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рд╕реЗ рд╕реНрд░реЛрдд рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛
Npm рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рдлреНрд░рдВрдЯ рдЕрд╕реЗрдВрдмрд▓реА
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ, рд╣рдорд╛рд░рд╛ GUI ReactJs рдкрд░ рдлреНрд░рдВрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рдордиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдЕрднреА рднреА рдЗрдХрдЯреНрдард╛ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
Nodejs + npm - рдпрд╣рд╛рдБ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ред
рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣рд╛рдБ ubuntu рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рд╣реИ
рдЕрдм рд╣рдо рдорд╛рдирдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдордиреЗ рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
cd front npm update npm run build
рд╕рд╛рдордиреЗ рддреИрдпрд╛рд░ рд╣реИ!
рд▓рд╛рдВрдЪ
рдЖрдЗрдП рдЬрдбрд╝ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдЕрдкрдиреЗ рджреВрдд рдХреА рджрд╛рд╡рдд рдХрд╛ рд╢реБрднрд╛рд░рдВрдн рдХрд░реЗрдВред
рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░, рд╣рдо рдЕрдкрдиреЗ рд╕рд╣рдХрд░реНрдореА рдХрд╛ рдирд╛рдо, рдкреЛрд░реНрдЯ, рдЕрдиреНрдп рд╕рд╛рдерд┐рдпреЛрдВ рдХреЗ рдкрддреЗ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдФрд░ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЭрдВрдбреЗ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдирдпрд╛ рд╡реНрдпреВ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рд╣реИред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, $USER@$HOSTNAME
рдХрд╛ рдЙрдкрдпреЛрдЧ $USER@$HOSTNAME
рдирд╛рдо рдФрд░ рдкреЛрд░реНрдЯ 35035 рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рджреЛрд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдФрд░ рдЪреИрдЯ рдХрд░рддреЗ рд╣реИрдВред
go run app.go -name Snowden
рдЧреЛрд▓рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?
рддреЛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкреАрд░-рдЯреВ-рдкреАрдпрд░ рдореИрд╕реЗрдВрдЬрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╢рдВрдХреБ crammed рд╣реИрдВ, рдЖрдЧреЗ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдлрд╛рдЗрд▓реЗрдВ, рдЪрд┐рддреНрд░, рдСрдбрд┐рдпреЛ, рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕, рдЖрджрд┐ рднреЗрдЬрдирд╛, рдЖрджрд┐ред
рдФрд░ рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ Google рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ,
рдмреНрд▓реЙрдХрдЪреИрди рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рдПрдереЗрд░рдо рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕реНрдкреИрдо рд╕реЗ рдмрдЪрд╛рдПрдВред
рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рдкрд░, рд╕рдореВрд╣ рдЪреИрдЯ, рдЪреИрдирд▓, рдПрдХ рдирд╛рдо рдкреНрд░рдгрд╛рд▓реА, рдЕрд╡рддрд╛рд░ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░реЛрдлрд╛рдЗрд▓ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВред
рд╕реАрдб рдкреАрдпрд░ рдЪрд▓рд╛рдирд╛, рдиреИрдЯ рдмрд╛рдИрдкрд╛рд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рд╕рд╣рдХрд░реНрдореА рд╕реЗ рд╕рд╣рдХрд░реНрдореА рддрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рднреА рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИред
рдирддреАрдЬрддрди, рдЖрдкрдХреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЯреЗрд▓реАрдЧреНрд░рд╛рдо / рдлреЛрди рдорд┐рд▓рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдЕрдкрдиреЗ рд╕рднреА рджреЛрд╕реНрддреЛрдВ рдХреЛ рд╡рд╣рд╛рдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ =)
рдЙрдкрдпреЛрдЧрд┐рддрд╛
рдХреБрдЫ рд▓рд┐рдВрдХрдореИрд╕реЗрдВрдЬрд░ рдкрд░ рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди, рдореБрдЭреЗ рд╢реБрд░реБрдЖрддреА рдЧреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдкреЗрдЬ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧреЗред
рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реВрдВ:
golang.org/doc/ - рднрд╛рд╖рд╛ рдкреНрд░рд▓реЗрдЦрди, рд╕рдм рдХреБрдЫ рд╕рд░рд▓, рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИред рдПрдХ рд╣реА рдкреНрд░рд▓реЗрдЦрди рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
godoc -HTTP=:6060
gobyexample.com - рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣
golang-book.ru - рд░реВрд╕реА рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рдХрд┐рддрд╛рдм
github.com/dariubs/GoBooks Go рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреБрд╕реНрддрдХреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред
рднрдпрд╛рдирдХ-go.com - рдЬрд╛рдиреЗ рдкрд░ рджрд┐рд▓рдЪрд╕реНрдк рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ, рд░реВрдкрд░реЗрдЦрд╛ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреАред рд╡рд░реНрдЧреАрдХрд░рдг рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХрд╛ рд╡рд░реНрдгрди рдмрд╣реБрдд рджреБрд░реНрд▓рдн рд╣реИ, рдЬреЛ Ctrl + F рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ