рдиреНрдпреВ рд╣рд╛рдЗрдкрд░рд▓реЗрдЧрд░ рдлреИрдмреНрд░рд┐рдХ: рдЧреЛ рдПрд╕рдбреАрдХреЗ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдореЙрдбрд▓



рдкрд┐рдЫрд▓реЗ рдПрдХ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рд╣рд╛рдЗрдкрд░рд▓реЗрдбрд░ рдлреИрдмреНрд░рд┐рдХ рдореЗрдВ рдХреЛрдбреЗрдХреНрд╕ рдХреЗ рдирдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЙрдбрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереАред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдирдИ рдЧреЛ рдПрд╕рдбреАрдХреЗ рдХреА рд░рд┐рд▓реАрдЬрд╝ рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реБрдИ рд╣реИ, рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдирд┐рд░реНрдорд╛рдг рдкрд░ рднреА рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рд╕рдм рдХреБрдЫ рдЕрднреА рднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬреИрд╕реЗ рдХрд┐ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИрдВрдбрд▓рд░ ), рд▓реЗрдХрд┐рди рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдореЙрдбрд▓ рдХрд╛ рдирд┐рдпреЛрдЬрд┐рдд рдбрд┐рдЬрд╝рд╛рдЗрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рддреЛ рдЖрдЗрдП рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рд░реАрдХреА рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рд▓реЗрддреЗ рд╣реИрдВред

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

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк go.mod рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ , рдирдП API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рд░рд┐рд▓реАрдЬрд╝ рдирд╣реАрдВ рд▓реЗрддреЗ рд╣реИрдВ (рдЕрднреА рддрдХ рдХреЛрдИ рд░рд┐рд▓реАрдЬрд╝ рдирд╣реАрдВ рд╣реБрдИ рд╣реИ), рд▓реЗрдХрд┐рди рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдорд┐рдЯ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди (рдпрд╣ рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЙрдкрд╛рдп рд╣реИ): рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ, рд╣рдо рдРрдк рдореЗрдВ рдЧреЗрдЯрд╡реЗ рдкреИрдХреЗрдЬ рдХреЛ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдирдП API рдХрд╛ рд╕рд╛рд░ рд╕рднреА рдПрд╕рдбреАрдХреЗ (рдЧреЛ, рдиреЛрдб, рдЬрд╛рд╡рд╛) рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдФрд░ рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдРрд╕рд╛ рд╣реА рдПрдХ рдЕрдореВрд░реНрдд рд╡реЙрд▓реЗрдЯ рд╣реИред

require github.com/hyperledger/fabric-sdk-go v1.0.0-beta1.0.20200404205634-0e550fc1a918



"github.com/hyperledger/fabric-sdk-go/pkg/gateway"

ред рд╡реЙрд▓реЗрдЯ рдХрд╛ рдЖрд░рдВрдн рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

wallet, err := gateway.NewFileSystemWallet("wallet")
if err != nil {
	fmt.Errorf(err.Error())
}

err = wallet.Put("admin", gateway.NewX509Identity("Org1MSP", string(cert), string(privKey)))
if err != nil {
	fmt.Errorf(err.Error())
}

рд╡реЙрд▓реЗрдЯ рд╡реЙрд▓реЗрдЯрд╕реНрдЯреЛрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:

type WalletStore interface {
	Put(label string, stream []byte) error
	Get(label string) ([]byte, error)
	List() ([]string, error)
	Exists(label string) bool
	Remove(label string) error
}

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рдЪрд╛рди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╕рд╛рде рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ ред рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╣рдЪрд╛рди рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд╕ рдПрдХ рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - NewInMemoryWallet () ред

рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:

gw, err := gateway.Connect(gateway.WithConfig(config.FromFile("./../connection-org1.yaml")),
gateway.WithIdentity(wallet, "admin"),
gateway.WithDiscovery(true),
gateway.WithCommitHandler(gateway.DefaultCommitHandlers.OrgAny))

Gateway.Connect () рдЧреЗрдЯрд╡реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ , рдЬреЛ рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЧреЗрдЯрд╡реЗред рдХреЛрдорд┐рдЯрд╣реИрдВрдбрд▓рд░ - рдкреНрд░рддрд┐рдмрджреНрдз рдШрдЯрдирд╛рдУрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рдгрдиреАрддрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╡рд┐рдХрд▓реНрдкред рдЕрднреА рддрдХ рдХреЛрдИ рднреА рд░рдгрдиреАрддрд┐ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИ (рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ "рдкреБрд░рд╛рдиреЗ" рдПрд╕рдбреАрдХреЗ " рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░рдгрдиреАрддрд┐ рд╕рднреА рдПрдВрдбреЛрд░реНрд╕рд░реНрд╕ рд╕реЗ рдХрдорд┐рдЯ рдХрд░реЗрдВ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ), рд▓реЗрдХрд┐рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдпреЛрдЬрдирд╛ рд╣реИ:

  • рдЧреЗрдЯрд╡реЗ редefaultCommitHandlers.OrgAll - рд╕рдВрдЧрдарди рдХреЗ рд╕рднреА рд╕рд╛рдерд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдХрдореЗрдЯреА рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ (рд╡рд┐рдЬреНрдЮрд╛рдкрди рджреНрд╡рд╛рд░рд╛)
  • рдЧреЗрдЯрд╡реЗ .efaultCommitHandlers.OrgAny - рдХрд┐рд╕реА рднреА рд╕рдВрдЧрдарди рдХреЗ рд╕рд╣рдХрд░реНрдореА рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ
  • рдЧреЗрдЯрд╡реЗред рд╕реЗрдлрд╛рд▓реНрдЯрдХреЙрдорд┐рдЯрд╣реИрдВрдбрд▓рд░.рди рдиреЗрдЯрд╡рд░реНрдХреНрд╕ - рдЪреИрдирд▓ рдореЗрдВ рд╕рднреА рд╕рдВрдЧрдардиреЛрдВ рдХреЗ рд╕рднреА рд╕рд╛рдерд┐рдпреЛрдВ рдХреА рдУрд░ рд╕реЗ рдПрдХ рдХрдореЗрдЯреА рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛
  • рдЧреЗрдЯрд╡реЗ .efaultCommitHandlers.NetworkAny - рдЪреИрдирд▓ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рд╣рдХрд░реНрдореА рдХреА рдУрд░ рд╕реЗ рдХрдорд┐рдЯрдореЗрдВрдЯ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ

рдЖрдк рдХрд┐рд╕реА рднреА рдХрдорд┐рдЯ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕ рдкрд░ рдФрд░ рдмрд╛рдж рдореЗрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ:

network, err := gw.GetNetwork("mychannel")
if err != nil {
	panic(err)
}

contract := network.GetContract("mycc")

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЪреИрдирд▓ рд╕реЗ рд╕рд╛рдерд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░, рдЬрд┐рд╕рдХреА рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣рдореЗрдВ рдЪреЗрдВрдХреЛрдб рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреАред

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд░рдгрдиреАрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдкрд╣рд▓реЗ, рдЪрд▓реЛ рдПрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рд▓реЗрдирджреЗрди рдХреЛ рджреЗрдЦреЗрдВ:

result, err := contract.SubmitTransaction("Create", "b", "50")


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

result, err := contract.EvaluateTransaction("Read", "b")
	if err != nil {
		panic(err)
	}
fmt.Println(string(result))

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рддреА рд╣реИ рдФрд░ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреЗ рдХрдорд┐рдЯ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд╛рдЬреНрдп рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

transient := make(map[string][]byte)
transient["someTransient"] = []byte("mytransientdata")
txn, err := contract.CreateTransaction("Update", gateway.WithTransient(transient))
if err != nil {
	panic(err)
}
result, err = txn.Submit("b", "100")
if err != nil {
	panic(err)
}

рдЕрдиреБрдмрдВрдзред рдХреНрд░реЗрдЯрдЯреНрд░рд╛рдВрд╕рдХреНрд╢рди рд▓реЗрди-рджреЗрди рдкрд░ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рджреЗрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╡рд┐рдХрд▓реНрдк рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛:

  • рдЧреЗрдЯрд╡реЗред рдЯреНрд░рд╛рдиреНрд╕рд┐рдПрдВрдЯ (рдХреНрд╖рдгрд┐рдХ) - рдирд┐рдЬреА рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП
  • рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░рджреНрд╡рд╛рд░редрдЙрдкрдХрд░рдг ("peer0.org1.example.com")


рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП appAgo , рд╡рд┐рднрд┐рдиреНрди рдХреБрдВрдЬрд┐рдпреЛрдВ, рдорд╛рдиреЛрдВ рдФрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд▓реЗрди-рджреЗрди рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ ред

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

рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рджред

All Articles