เช“เชจเซเชŸเซ‹เชฒเซ‹เชœเซ€ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐ เชชเชพเชฏเชฅเซ‹เชจเชฎเชพเช‚ เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเซ‹. เชญเชพเช— 3: เชฐเชจเชŸเชพเช‡เชฎ API

เช“เชจเซเชŸเซ‹เชฒเซ‹เชœเซ€ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐ เชชเชพเชฏเชฅเซ‹เชจเชฎเชพเช‚ เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเซ‹. เชญเชพเช— 3: เชฐเชจเชŸเชพเช‡เชฎ API

เช‘เชจเซเชŸเซ‹เชฒเซ‹เชœเซ€ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐ เชชเชพเชฏเชฅเซ‹เชจเชฎเชพเช‚ เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เชฌเชจเชพเชตเชตเชพ เชชเชฐ เชถเซˆเช•เซเชทเชฃเชฟเช• เชฒเซ‡เช–เซ‹เชจเซ€ เชถเซเชฐเซ‡เชฃเซ€เชฎเชพเช‚ เช† เชคเซเชฐเซ€เชœเซ‹ เชญเชพเช— เช›เซ‡. เช…เช—เชพเช‰เชจเชพ เชฒเซ‡เช–เซ‹เชฎเชพเช‚ เช†เชชเชฃเซ‡ เชชเชฐเชฟเชšเชฟเชค เชฅเชฏเชพ

  1. เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เช…เชจเซ‡ เชฌเซเชฒเซ‹เช• API
  2. เชธเซเชŸเซ‹เชฐเซ‡เชœ API.

เชนเชตเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเชจเซ‡ เช‘เชจเซเชŸเซ‹เชฒเซ‹เชœเซ€ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐ เชชเชพเชฏเชฅเซ‹เชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เชกเซ‡เชตเชฒเชช เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชฏเซ‹เช—เซเชฏ เชชเชฐเซเชธเชฟเชธเซเชŸเชจเซเชŸ เชธเซเชŸเซ‹เชฐเซ‡เชœ API เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เซ‰เชฒ เช•เชฐเชตเซ‹ เชคเซ‡เชจเซ‹ เช–เซเชฏเชพเชฒ เช›เซ‡, เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซ‹ เชคเซ‡ เชถเซ€เช–เชตเชพ เชฎเชพเชŸเซ‡ เช†เช—เชณ เชตเชงเซ€เช. เชฐเชจเชŸเชพเช‡เชฎ API (เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ API). เชฐเชจเชŸเชพเชˆเชฎ API เชชเชพเชธเซ‡ 8 เชธเช‚เชฌเช‚เชงเชฟเชค API เช›เซ‡ เชœเซ‡ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชฎเชพเชŸเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชˆเชจเซเชŸเชฐเชซเซ‡เชธ เชชเซ‚เชฐเชพ เชชเชพเชกเซ‡ เช›เซ‡ เช…เชจเซ‡ เชกเซ‡เชตเชฒเชชเชฐเซเชธเชจเซ‡ เชกเซ‡เชŸเชพ เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชค, เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เช…เชจเซ‡ เชฎเชพเชจเซเชฏ เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡.

เชจเซ€เชšเซ‡ 8 API เชกเซ‡เชŸเชพเชจเซเช‚ เชธเช‚เช•เซเชทเชฟเชชเซเชค เชตเชฐเซเชฃเชจ เช›เซ‡:

เช“เชจเซเชŸเซ‹เชฒเซ‹เชœเซ€ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐ เชชเชพเชฏเชฅเซ‹เชจเชฎเชพเช‚ เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเซ‹. เชญเชพเช— 3: เชฐเชจเชŸเชพเช‡เชฎ API

เชšเชพเชฒเซ‹ 8 API เชกเซ‡เชŸเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซ‹ เชคเซ‡เชจเชพ เชชเชฐ เชจเชœเซ€เช•เชฅเซ€ เชจเชœเชฐ เช•เชฐเซ€เช. เช† เชชเชนเซ‡เชฒเชพ, เชคเชฎเซ‡ เช“เชจเซเชŸเซ‹เชฒเซ‹เชœเซ€ เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เชกเซ‡เชตเชฒเชชเชฎเซ‡เชจเซเชŸ เชŸเซ‚เชฒเชฎเชพเช‚ เชจเชตเซ‹ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เชฌเชจเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹ เชธเซเชฎเชพเชฐเซเชŸเชเช•เซเชธ เช…เชจเซ‡ เชจเซ€เชšเซ‡เชจเซ€ เชธเซ‚เชšเชจเชพเช“เชจเซ‡ เช…เชจเซเชธเชฐเซ‹.

เชฐเชจเชŸเชพเช‡เชฎ API เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซ‹

เช†เชฏเชพเชค เช•เชฐเชตเชพเชจเซ€ เชฌเซ‡ เชฐเซ€เชค เช›เซ‡ เชฐเชจเชŸเชพเช‡เชฎ API: ontology.interop.System.Runtime ะธ ontology.interop.Ontology.Runtime. เช‘เชจเซเชŸเซ‹เชฒเซ‹เชœเซ€ เชชเชพเชฅเชฎเชพเช‚ เชจเชตเชพ เช‰เชฎเซ‡เชฐเชพเชฏเซ‡เชฒเชพ APIs เช›เซ‡. เชจเซ€เชšเซ‡เชจเซ€ เชฒเซ€เชŸเซ€เช“ API เชกเซ‡เชŸเชพเชจเซ‡ เช†เชฏเชพเชค เช•เชฐเซ‡ เช›เซ‡.

from ontology.interop.System.Runtime import GetTime, CheckWitness, Log, Notify, Serialize, Deserialize
from ontology.interop.Ontology.Runtime import Base58ToAddress, AddressToBase58, GetCurrentBlockHash

API เชจเซ‡ เชธเซ‚เชšเชฟเชค เช•เชฐเซ‹

Notify เชซเช‚เช•เซเชถเชจ เชธเชฎเช—เซเชฐ เชจเซ‡เชŸเชตเชฐเซเช•เชฎเชพเช‚ เช‡เชตเซ‡เชจเซเชŸเชจเซเช‚ เชชเซเชฐเชธเชพเชฐเชฃ เช•เชฐเซ‡ เช›เซ‡. เชจเซ€เชšเซ‡เชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, Notify เชซเช‚เช•เซเชถเชจ เชนเซ‡เช•เซเชธ เชธเซเชŸเซเชฐเชฟเช‚เช— "เชนเซ‡เชฒเซ‹ เชตเชฐเซเชก" เชชเชฐเชค เช•เชฐเชถเซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชธเชฎเช—เซเชฐ เชจเซ‡เชŸเชตเชฐเซเช•เชฎเชพเช‚ เชฌเซเชฐเซ‹เชกเช•เชพเชธเซเชŸ เช•เชฐเชถเซ‡.

from ontology.interop.System.Runtime import Notify
def demo():
    Notify("hello world")

เชคเชฎเซ‡ เช†เชจเซ‡ เชฒเซ‹เช—เชฎเชพเช‚ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹:

เช“เชจเซเชŸเซ‹เชฒเซ‹เชœเซ€ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐ เชชเชพเชฏเชฅเซ‹เชจเชฎเชพเช‚ เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเซ‹. เชญเชพเช— 3: เชฐเชจเชŸเชพเช‡เชฎ API

GetTime API

GetTime เชซเช‚เช•เซเชถเชจ เชตเชฐเซเชคเชฎเชพเชจ เชŸเชพเช‡เชฎเชธเซเชŸเซ‡เชฎเซเชช เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡ เชฏเซเชจเชฟเช•เซเชธ เชธเชฎเชฏ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เชœเซ‡เชจเชพ เชชเชฐ เชซเช‚เช•เซเชถเชจเชจเซ‡ เช•เซ‰เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹. เชฎเชพเชชเชจเชจเซเช‚ เชเช•เชฎ เชฌเซ€เชœเซเช‚ เช›เซ‡.

from ontology.interop.System.Runtime import GetTime
def demo():
    time=GetTime()
    return time # return a uint num

GetCurrentBlockHash API

GetCurrentBlockHash เชซเช‚เช•เซเชถเชจ เชตเชฐเซเชคเชฎเชพเชจ เชฌเซเชฒเซ‹เช•เชจเซเช‚ เชนเซ‡เชถ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡.

from ontology.interop.Ontology.Runtime import GetCurrentBlockHash
def demo():
    block_hash = GetCurrentBlockHash()
    return block_hash

เชธเซ€เชฐเซ€เชฏเชฒเชพเช‡เช เช…เชจเซ‡ เชกเซ€เชธเซ€เชฐเซ€เชฏเชฒเชพเช‡เช เช•เชฐเซ‹

เช† เชธเซ€เชฐเซ€เชฏเชฒเชพเชˆเชเซ‡เชถเชจ เช…เชจเซ‡ เชกเซ€เชธเซ€เชฐเซ€เชฒเชพเชˆเชเซ‡เชถเชจ เชซเช‚เช•เซเชถเชจเชจเซ€ เชœเซ‹เชกเซ€ เช›เซ‡. เชธเซ€เชฐเชฟเชฏเชฒเชพเชˆเช เชซเช‚เช•เซเชถเชจ เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซ‡ เชฌเชพเชฏเชŸเชฟเชฏเชฐ เช‘เชฌเซเชœเซ‡เช•เซเชŸเชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ เชกเชฟเชธเชฟเชฐเชฟเชฏเชฒเชพเชˆเช เชซเช‚เช•เซเชถเชจ เชฌเชพเชฏเชŸเชฟเชฏเชฐเชจเซ‡ เชฎเซ‚เชณ เช‘เชฌเซเชœเซ‡เช•เซเชŸเชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡. เชจเซ€เชšเซ‡เชจเชพ เช•เซ‹เชก เชธเซ‡เชฎเซเชชเชฒ เช‡เชจเช•เชฎเชฟเช‚เช— เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐเซเชธเชจเซ‡ เช•เชจเซเชตเชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸเชจเชพ เชชเชฐเซเชธเชฟเชธเซเชŸเชจเซเชŸ เชธเซเชŸเซ‹เชฐเซ‡เชœเชฎเชพเช‚ เชธเซเชŸเซ‹เชฐ เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸเชจเชพ เชธเชคเชค เชธเซเชŸเซ‹เชฐเซ‡เชœเชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพ เชชเชฃ เชฎเซ‡เชณเชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฎเซ‚เชณ เช‘เชฌเซเชœเซ‡เช•เซเชŸเชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡.

from ontology.interop.System.Runtime import GetTime, CheckWitness, Log, Notify, Serialize, Deserialize
from ontology.interop.System.Storage import Put, Get, GetContext

def Main(operation, args):
    if operation == 'serialize_to_bytearray':
        data = args[0]
        return serialize_to_bytearray(data)
    if operation == 'deserialize_from_bytearray':
        key = args[0]
        return deserialize_from_bytearray(key)
    return False


def serialize_to_bytearray(data):
    sc = GetContext()
    key = "1"
    byte_data = Serialize(data)
    Put(sc, key, byte_data)


def deserialize_from_bytearray(key):
    sc = GetContext()
    byte_data = Get(sc, key)
    data = Deserialize(byte_data)
    return data

Base58ToAddress เช…เชจเซ‡ AddressToBase58

เชธเชฐเชจเชพเชฎเชพเช‚ เช…เชจเซเชตเชพเชฆ เช•เชพเชฐเซเชฏเซ‹เชจเซ€ เช† เชœเซ‹เชกเซ€. Base58ToAddress เชซเช‚เช•เซเชถเชจ เช base58 เชเชจเซเช•เซ‹เชกเซ‡เชก เชเชกเซเชฐเซ‡เชธเชจเซ‡ เชฌเชพเชฏเชŸเชฟเชฏเชฐ เชเชกเซเชฐเซ‡เชธเชฎเชพเช‚ เช•เชจเซเชตเชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ AddressToBase58 เชฌเชพเชฏเชŸเชฟเชฏเชฐ เชเชกเซเชฐเซ‡เชธเชจเซ‡ เชฌเซ‡เช58 เชเชจเซเช•เซ‹เชกเซ‡เชก เชเชกเซเชฐเซ‡เชธเชฎเชพเช‚ เช•เชจเซเชตเชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡.

from ontology.interop.Ontology.Runtime import Base58ToAddress, AddressToBase58
def demo():
    base58_addr="AV1GLfVzw28vtK3d1kVGxv5xuWU59P6Sgn"
    addr=Base58ToAddress(base58_addr)
    Log(addr)
    base58_addr=AddressToBase58(addr)
    Log(base58_addr)

เชธเชพเช•เซเชทเซ€ เชคเชชเชพเชธเซ‹

CheckWitness(fromActt) เชซเช‚เช•เซเชถเชจเชฎเชพเช‚ เชฌเซ‡ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เช›เซ‡:

  • เชšเช•เชพเชธเซ‹ เช•เซ‡ เชถเซเช‚ เชตเชฐเซเชคเชฎเชพเชจ เชซเช‚เช•เซเชถเชจเชจเซ‹ เช•เซ‹เชฒเชฐ เชเช•เซเช•เซเชŸเชฎเชพเช‚เชฅเซ€ เช›เซ‡. เชœเซ‹ เชนเชพ (เชเชŸเชฒเซ‡ โ€‹โ€‹เช•เซ‡, เชนเชธเซเชคเชพเช•เซเชทเชฐ เชšเช•เชพเชธเชฃเซ€ เชชเชพเชธ เชฅเชˆ เช—เชˆ), เชคเซ‹ เชซเช‚เช•เซเชถเชจ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡.
  • เชตเชฐเซเชคเชฎเชพเชจ เช•เชพเชฐเซเชฏเชจเซ‡ เช•เซ‰เชฒ เช•เชฐเชคเซ€ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เช•เชฐเชพเชฐ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡ เชคเชชเชพเชธเซ‹. เชœเซ‹ เชคเซ‡ เช•เชฐเชพเชฐ เช›เซ‡ เช…เชจเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเชพเชฐเชฎเชพเช‚เชฅเซ€ เชšเชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซ‹ เชšเช•เชพเชธเชฃเซ€ เชชเชธเชพเชฐ เชฅเชพเชฏ เช›เซ‡. เชเชŸเชฒเซ‡ เช•เซ‡, เชœเซ‹ fromActt เช GetCallingScriptHash() เชจเซเช‚ เชตเชณเชคเชฐ เชฎเซ‚เชฒเซเชฏ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡ เชšเช•เชพเชธเซ‹. GetCallingScriptHash() เชซเช‚เช•เซเชถเชจ เชตเชฐเซเชคเชฎเชพเชจ เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸเชจเซ€ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เชนเซ‡เชถ เชตเซ‡เชฒเซเชฏเซ เชฒเชˆ เชถเช•เซ‡ เช›เซ‡.

GetCallingScriptHash():

เช†เช—เชณ เชตเชพเช‚เชšเซ‹ เช—เซเชฅเชฌ

from ontology.interop.System.Runtime import CheckWitness
from ontology.interop.Ontology.Runtime import Base58ToAddress
def demo():
    addr=Base58ToAddress("AW8hN1KhHE3fLDoPAwrhtjD1P7vfad3v8z")
    res=CheckWitness(addr)
    return res

เชตเชงเซ เชฎเชพเชนเชฟเชคเซ€ เช…เชนเซ€เช‚ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡ เช—เซเชฅเชฌ. เชนเชตเซ‡ เชชเช›เซ€เชจเชพ เชฒเซ‡เช–เชฎเชพเช‚ เชชเชฐเชฟเชšเชฏ เช•เชฐเซ€เชถเซเช‚ เชฎเซ‚เชณ APIเช“เชจเซเชŸเซ‹เชฒเซ‹เชœเซ€ เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸเชฎเชพเช‚ เชธเช‚เชชเชคเซเชคเชฟ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เช•เชฐเชตเซ€ เชคเซ‡ เชถเซ€เช–เชตเชพ เชฎเชพเชŸเซ‡.

เชฒเซ‡เช– เชธเช‚เชชเชพเชฆเช•เซ‹ เชฆเซเชตเชพเชฐเชพ เช…เชจเซเชตเชพเชฆเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹ เชนเชถเชฐเซ‡เชŸ เช…เชจเซ‡ เชถเซ‡เชฐเซเชธ เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เช“เชจเซเชŸเซ‹เชฒเซ‹เชœเซ€ เชฐเชถเชฟเชฏเชพ เชฎเชพเชŸเซ‡.

เชถเซเช‚ เชคเชฎเซ‡ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพ เช›เซ‹? เชชเชฐ เช…เชฎเชพเชฐเชพ เชŸเซ‡เช• เชธเชฎเซเชฆเชพเชฏเชฎเชพเช‚ เชœเซ‹เชกเชพเช“ เชตเชฟเชฐเชพเชฎ. เชชเชฃ, เชชเชฐ เชเช• เชจเชœเชฐ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพ เช•เซ‡เชจเซเชฆเซเชฐ เช‘เชจเซเชŸเซ‹เชฒเซ‹เชœเซ€, เชคเชฎเซ‡ เชคเซเชฏเชพเช‚ เชตเชงเซ เชธเชพเชงเชจเซ‹, เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เช…เชจเซ‡ เช˜เชฃเซเช‚ เชฌเชงเซเช‚ เชถเซ‹เชงเซ€ เชถเช•เซ‹ เช›เซ‹.

เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡ เช•เชพเชฐเซเชฏเซ‹ เช–เซ‹เชฒเซ‹. เช•เชพเชฐเซเชฏ เชชเซ‚เชฐเซเชฃ เช•เชฐเซ‹ เช…เชจเซ‡ เชˆเชจเชพเชฎ เชฎเซ‡เชณเชตเซ‹.

เชนเชตเซ‡ เช…เชฐเชœเซ€ เช•เชฐเซ‹ เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซ€เช“ เชฎเชพเชŸเซ‡ เช“เชจเซเชŸเซ‹เชฒเซ‹เชœเซ€ เชŸเซ‡เชฒเซ‡เชจเซเชŸ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฎเชพเชŸเซ‡

เช‘เชจเซเชŸเซ‹เชฒเซ‹เชœเซ€

เช“เชจเซเชŸเซ‹เชฒเซ‹เชœเซ€ เชตเซ‡เชฌเชธเชพเช‡เชŸ - GitHub - เชตเชฟเชฐเชพเชฎ - เชŸเซ‡เชฒเชฟเช—เซเชฐเชพเชฎ เชฐเชถเชฟเชฏเชจ - Twitter - Reddit

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹