áŤáá á´áááŤá á°áá°á
ááááá˘
áľááá á¨áĽáááźáá ááŽáááśá˝á á áááááľ á¨ááľ á°á áááľ áŤáá á¨á´áŽáŹá áĄáľá áá° áá ááá á ááťááᢠá ááľáľ á°áŤá°áá˝á áááľáľáŠ á áááá á°áĽá°ááᣠáĽá á¨áááľ áłáááłáľ á áá á á´áᲠáťáááŽá (á ) áá áá á¨áááá° á á˝á áľá á áá°á áŚáł áŤáᢠá áá á˝áá ááľáĽ áĽáá´áľ áĽááłá°á¨ááľ áĽáááŤáá. á áááĽááľ á áľá á°áááá˝ ááľáĽ á˘áŤááľ á ááľ á áľá°áłá˝ áłáŞá áĽáá°ááŤáᥠá°áľá áĽáá°áááá, áĽá á˘á á á áĽáą ááľáĽ á áľáŤá ááľáĽ áááá¨áľ á¨áá˝ááľ á áá ááá áŤááá.
áá á áľáá˝ á ááľ áĽááááá˘
ááľáľá áĽá áááłáá˝
áľááá á¨á°áłáłáááš áá á°ááŁáŤáľ á ááľ ááá á¨á፠á áá á¨áłááą áĽáἠáŽááľáŤáśá˝ á áááá áĽáá˛áá á¨áśá áĽá áá áłáŠá áááťáťá ááłáŚá˝á áá á¨áĽ áá አᢠááľáľáŠ á¨á´áá´áá á 24 áĽáľá¨ áĽá ááľ 15 áľá¨áľ á¨á°áŤáá° á˛áá áá¤áąá á¨á°áááá á áłá 15 áĽáť ááᢠá á´áááŤá á¨áŞáŚá áá áĽáŞáá˝ áĽáŤáľá áááá°á˝ áĽá áááá°á˝ á C++ ááľáĽ á áá°áá áŞáŤáá˝ á˛ááá áĽá áááľ áá á¨á´áááŤá áá¤áśá˝á á áááááľ áĽá á áááááľ á¨ááľáľáŠá áá¤áľ áááľáłáá á¨á á áá ááľáˇáá˘
á á ááááš á¨áá¨áĄáľ áááá ááľáĽ áááľ áááá áŽááľáŤáśá˝á ááá áá. áá áá°áá á¨áśá áá á¨á°á¨ááá ááłáŞáŤáá˝á á°á ááá, ááá°áá á°áá á á á˛áľ ááá á°á°ááĽáŻá á áĽá áááá˛áśá˝ á á°áá á áśá á á°áááá áĽá á ááľáŹá á¨á°á°áŤ.
á°ááŁáŤá á¨ááŽááŤá ááá áá፠á á ááŁá á áá°áá. á áĽá
áááłá°á áĽááłá ááá áá°áá?
áŁááŠáŁ á¨áĽá áľááťáááá˝á áá°á á áŤááá áĽá áአá˝ááł á¨áá áá ááľáĽáľáĽ ááŽáááśá˝ áľááá áĽá áĽá áá á IT áá á á¨á°áĽ áłáááłá á áááł áŤáá¸á áá¸áᢠáĽá á áĽáĽá áááľ-ááá áááľ áĽáá°áááá áĽá á ááľáĄ áłááááľ áá á¨á°á°áአáá¸á, áĽá á°áá áŽáááá°á áłáááľ áĽá ááłáĽ ááľá ááľáĽ á᪠á¨áŠá˛áŤ áŠáá¨áá˛á˛áá˝ áá áá°áŁá á.
á¨ááľáľáŠ á áľá°áłá˝ á°ááŁáŤáľ áĽá á á°ááłá á¨á´áááŤá ááŽáááłá˝á ááľáĽ ááłá°á á áŤáą áĽáŠ á°ááłá˝ááľ áá á ᣠáá á¨á˝áááľ áááą á°á¨á᪠áá á¨áłáť ááᢠđ
TON blockchain áááá
á áĽáááźááᣠá áá´ááťá á˘áá°ááááľ áĽá á¨áá˝á ááá á áłá˛áľ áĽáľááśá˝á á á
áἠáĽáá¨áłá°ááá áĽá á áĽáŤááłááą á ááá°áŤá áľ á áŤáŁá˘ á ááľá ááá
á¨áá áááľ áĽááłáŤáááĽá áĽááááŤááᢠáľááá
ááľáľáŠ á˛ááá áĄáľáá˝á á¨áá
áá°á áŤááľá ááłáŚá˝ á áá
á áŤááá
ááľáľáŠ á˛ááá áŽáą á áľááľá áłáľááᣠáľááá ááá áááá áĽáŁ á¨á°áťá áááŞáŤ ááá áá áá፠ááááá ááľáááᢠá á°á áááá˝. áĽáá° á áááłá°á áá áá ááá áá¤áľ á ááľááá - á áĄáĄááą áá ááľá¨áá ááá°áĽá°áĽ áááŞáŤáá˝á á¨ááľá áľ á á°á¨á᪠ááá˝ ááłááśá˝á á ááááá á˘
á°ááą áŤáą á áĽáŠ áááł á¨á°áá¨áᨠá˘ááá á á ááłááľ á áŤáŁá˘áá˝ áá áááá ἠá áľá¸á᪠áá áᢠáĽá áá áá° á°áá°á ááĽáŚá˝ ááááľ áĽá á¨á¨áá°á á°á¨á á¨á áĽáľáľáŤááľ ááłáŚá˝ ááá፠áá° áá á°á á°á¨á áľáá ፠ááááŽá˝ ááá¨á áá á¨áĽáá˘
áááá ááááŤá á¨á á°ááŁá áŠá áááá ááá፠áŁáŤá ááá ááá ááááᢠá¨áášáá áá˝á ááá áĽáá´áľ áĽáá°áááá á¨áááá˝ áá¨á ááá˘áá˝á á¨áááłáľ ááá ááśá áááľááá áĽáἠáŽááľáŤáśá˝á á¨áááĽáŠ ááá˘áá˝á á¨áááááľ ááľá á¨áá°á ááá˘
Nix: ááŽáááąá á ááľ áá ááľá¨á
á á´áŽáŹá áľáá
á°áááá˝ áá
áľááá
á ááá á áááá
$ cd ~/.config/nixpkgs/overlays && git clone https://github.com/serokell/ton.nix
$ cd /path/to/ton/repo && nix-shell
[nix-shell]$ cmakeConfigurePhase && make
ááá áĽááááśá˝á ááŤá áĽáá°ááŤáľáááá áἠáá á. NixᣠáĄáĄááą ááá áááŽáľ áĽá¨á°á ááá ááá áááľ áááá ááá á áľáááľ áŤá°áááááłáá˘
ááśá ááŽááŤá áááŁáľ
á TON Network ááľáĽ áŤáá áááá á¨áŽááľáŤáľ áŽáľ á áśá á¨áášáá áá˝á (á˛áŞá¤á) áá áá°áŤáᢠá˛áŞá¤á á¨ááá˝ áááŁá áá˝áá˝ á¨á áá ááľáĽáľáĽ áá, áĽá á áŁá á áľá°áłá˝ á°ááŁá á áá, áááłá, á áĽáŽ ááľáŤáľ áá˝áá áááĽáá и áá° ááἠá áááá˝.
á á°á¨ááŞá ᣠá¨áśá á°áá˝ áśáľáľ á áłá˛áľ á¨ááŽááŤá ááááá˝á ááĽá¨áá-
á ááľáľ á¨áááľáá áááá°áá ááá ááŽááŤááá ááá ááá˘
FunC á°ááłáłá á¨áá áĽáἠá¨áŽááľáŤáľ ááŽááŤá ááá ááá˘
á ááľá°á á°áĽáłá˘ - áá˛áŞá¤á áááľáŽá˝ á¨áá°áá á áŽáľ ááááá¨áľ á ááľáľ á¤á°-áá˝áááľá˘ á ááľá°á á°áĽáłá˘ á¨áááᢠáá
á¨áĽá ááľáľá áá°áŤá
á áá¨á¨áťá á¨áĽá¨áłá˝áá áá¤áľ á¨ááááá¨áľá áľ áá ááá˘
áŤáá°ááłá°á á¨áá፠áŁá˘áŤ
á¨áá፠áťáá áááľ á°á áááá˝ á¨áĽáááźáá áá áááŤáá˝á áĽáá˛áአá¨ááŤáľá˝á áááá áá ááᢠá áá¤áąá, ááááĽá áĽáť áłááá (áŽáá˝á á¨áá), ááá áá ááá (á¨áááĽáá áĽááł áĽáľáŞá°áŤ áľá¨áľ áá á á á áŤáľáááááľá). áááŤáá˝ á á°áááá áá á áľáá˝ áĽá á á°áááá áá á ááá áá˝ááᢠá áá ááłá áá á°ááá áááá˝ áĽááľ á ááľ áá°ááá á áŤáľáááá¸áá, ááááŤáąá á¨áá¨á¨áťá ááľááááľ á áľáááľ áŽááľáŤáľ á¨á°á¨ááá áá.
áá˝áአááá á¨áá áááľá á ááá°ááᢠáááľ áááá˝ á¨á°áá¨á áááĽááśá˝á ááááἠáá˝áá, áĽáŤááłááłá¸á áááľ ááĽáŽá˝ áááá - á áĽáŤááłááą ááá á¨áá¨ááá áá áá á. áĽááá
áááľ ááĽáŽá˝ áá áŤá
á áĽáááąáŁ áá áá ááłáĽ ááá°áá á á ááľ ááĽá á á ááᣠááá áá áááąáá áľá°áá ááááŤáąá á áá ááááľ á¨á áá ááš á¨á°á áá á áááá˝ ááľá¨á áĽáá˝áááᢠá á°á¨ááŞá, á áĽáŤááłááą áááĽááľ ááľáĽ á¨áááŤáá áá á áááŤá°áľ ááľááá. áŤááą, áááĽááą á áá ááááŤáľ á¨á á, ááá áĽááłá ááá áá áá˝ áĽá á¨áá¨á¨áťá áľááľ áľááá á˘ááá, á°á ááá áŞáłáŤáá ááŤáľá°ááá áá˝áá.
ááłáŁá˝áá áááá°á˝ áĽáá°áá á áááľ ááá áĽá á áá á¨áá፠áťáá ááŽáśáŽáá ááá áá ááłááá˝á áááááᢠá¨áááááᣠáŤáááá áááąá áĽáť ááá˘
ááá፠á°ááłáłá á ááŤá¨áĽ ᣠáá ááľ á á áŁáŤá áťáá ááłá áĽáťá˘á áἠáľáá á áĽáá° á á ááá áľááááááľ áĽá á¨áááľ á ááłáľ áá°áśá˝ áŤá áĽá á áľááá ááááŽá˝á áłáŤáĽáŤáŤ áĽáá° áĽá á°ááłáłá ááłáĽá á¨áááá˝á˘
ááľááááááą áአáľáŠá¨áľ á ááľá áľ ááŽáśáŽáá˝áá á áááá ááááš ááááŤáłá áĽáá°áá ááá˝ ááᢠá¨áĽá áľáááážá˝ á áá ááááŤá ááá áá áᣠáĽá á áá áĽááľáá áá˝ááá˘
ááá á FunC ááľáĽ á°ááŁáŤá á áľááááᣠáĽá á á ááááš á á°á ááá áá°á¨áľ á¨áŽááľáŤáłá˝á áá áá ááá ááľá°ááĽá áááá á á¨áľáĽáá ááľáá áááááŤáá áťááᢠá CLIá˝á áá áááááá ááá ááá¨áĽ áĽáá˝á áá áᣠááá áá á¨á áŤá áĽááľá á á°ááŁá áĽáá´áľ áĽáá°áá°áŤ ááá¨áľ áááá áá áá˘
áĽáááąá áááááᣠᨠFift áá á¨á°áŤá á ááᣠáá á ááá á¨á°ááá ááłáŞáŤáá˝ áĽá á¤á°-ááťáááľ áá áłáá á¨áá áĽá á áááľ á¨áá áááŁá¸á ááááá˝ áááá¨áĽ ááá á áłáá ááááŤáśá˝ á áá¨ááᢠááá áá á á°áá á¨á° ááá ââááŽááŤááá á áŁá á°áľ á¨ááá ááᣠááááŤáąá ááá áá áŤááá ááá áŤáááá¨áĽ á ááá ááłá˝á ááľáĽ ááľááἠáľáááŁá˝áᣠáĽá á áááŁáŞá á áá áá á áá¨áłáá˘
áľááá , á áĽá á áľá°áŤá¨áľ, ááááľ ááá áĽá¸áá áá¨áá፠á Fift Assembler á¨á áľá°ááá ááá áá ááá áá. áá ááá áĽá¸á ááá á á˛áľ á¨ááá á ááá á¨á˛áŞ á¤á á°áĽáłá˘áá áá° á ááłááľ ááŁá ááááá˝ ááá°áľ á¨á°áťá á áááá?
TVM Haskell eDSL
áľá ááá°áá áááá áŽááľáŤáłá˝á áááááá ááá á áá áá. áŁááĽá ááá á¨áŞáľ áŚááł ááááááľ ááľáááᣠááá áá á FunC ááľáĽ áá áááá áá ááá á áŁá á á°ááş ááááᢠá ááłááľ áŁáá ááá¨áá áĽááááááᣠáĽá ፠áá˛áŞá¤á á¨áŤáłá˝á á¨áá°áĽá°á˘áŤ ááá áá áá˘
áá áĽáá° Fift Assembler á á˛áą áááá˝á á°áŤáˇá ááááá á¨áááľ ááá ááľáŹááá áĽáá° á áľá°ááá ááá áá áá á á¨áá á áááľ á˛áľá°á áá á áá áĽááľáá áá á áľá˝áááᢠá¨áľáááľ áŽááľáŤáśá˝ áá á˛á°áŤ, áľáá˝ áľá á°áľ áĽááłá áá á áŁá á¨áá°á ááá áá˝áá, á¨áááááἠáľá¨áŁ, á áĽá á áľá°áŤá¨áľ, áľáá áĽá á áá.
á Haskell ááľáĽ á¨á˛áŞá¤á á°áĽáłá˘ áá áĽáá°áááľá áááłá¨áľ á ááľ áá°á á á¨áŞáľ áŚááł á°ááĽá¨ááᢠáľáŠá¨áľ áá°áŁá¸á á¨ááᥠáĽááľ áááŽá˝ áĽáá á á
- áá áá á ááľ á°ááŁáá áŤáá áá, ááá áá á¨ááááľá áá áá áá˝áá. á á˛áľ á°ááŁáá á á áľá°ááá ááá á˛áááš (áááľá Haskell) á¨áĽá eDSL á á˛áŞá¤á ááľáĽ á¨á°áᨠá¨áááľ á°áááľ á°ááŁá áĽáá˛áá ááá á ááá á áá°á፠áŚáł ááľáĽ áĽáá˛áᣠáááľá¨á áĽáá˛ááᥠááá áľáááłáá˘
- áá áĽáá° Haskellᣠá°ááŁáŤáľ á áá ááá áá á¨ááá°áš ááááśá˝ á áá¸áᢠá áĽá eDSL ááľáĽ á¨á ááľ á°ááŁá áá¤áľ á áááľ á°ááŁáŠ á¨áá áĽáá á¨ááá á áááľ á˛áá á¨áá¤áľ á áááľ á°áá á¨áĽáŞá á áá á¨ááá á¨á á¨ááá á áááľ ááá˘
- áŽáą ááĽáŤáŞáŤáá˝ á ááľ
stacktype
, á¨áá á ááá á¨ááá á áááľ á ááĽáŞáŤ áŚáł áá á áááá˝. á ááááŞáŤá á¨áŞáľ áŚááł áá ááľáĽ áĽááá á áľá°áŤá¨áśá˝ áĽáť áá áŠáŁ ááá áá á áĽá eDSL ááľáĽ áĽááą á¨áŽáą á áŤá áá¸á áĽá á á°á ááᨠáá áá ááááľ áá°á¨ááŁá¸ááᢠáŽáą á¨á°áá¨á¨ áĽá á¨ááá á áááľ á¨á°ááá ááá˘á á˝ááŠá áĽáá˛áŤáá á¨ááŤáá á°ááśá˝ ááá ááááŤáá˝ ááá ááŤáááá áá˝ááᢠáĽááἠááᣠáĽáá˛á áŤááľ ááĽáŤáŞáŤáá˝ á¨á˛áŞ á¤á áŽáľ áľááá°áá á¨áá¸á á¨áŠáŤ áá á ááťá¸á áá á°á˝áá á áááŤá¸ááᢠ- áá á ááá á áááľ áłáááłáľ ááľáĽ á¨á°áá ááłá áá, áľááá á ááŽáááą áá áá áĽá áľáŤáá˝ á á. áááłáᣠá¨áá á áłá˝ áŁáá áŽáľ ááľáĽ á¨ááŤáŠáá¸á á¨áááŞáŤ áááá˝ ááá ááłááá˝ á áŤáľ-á°á ááá á á ááŁá¸áá˘
á¨áŁááĽá á˛á áŚááł á á°ááŁá á á áĽá eDSL áá áá á áááľáááĄ-
main :: IO ()
main = putText $ pretty $ declProgram procedures methods
where
procedures =
[ ("recv_external", decl recvExternal)
, ("recv_internal", decl recvInternal)
]
methods =
[ ("seqno", declMethod getSeqno)
]
data Storage = Storage
{ sCnt :: Word32
, sPubKey :: PublicKey
}
instance DecodeSlice Storage where
type DecodeSliceFields Storage = [PublicKey, Word32]
decodeFromSliceImpl = do
decodeFromSliceImpl @Word32
decodeFromSliceImpl @PublicKey
instance EncodeBuilder Storage where
encodeToBuilder = do
encodeToBuilder @Word32
encodeToBuilder @PublicKey
data WalletError
= SeqNoMismatch
| SignatureMismatch
deriving (Eq, Ord, Show, Generic)
instance Exception WalletError
instance Enum WalletError where
toEnum 33 = SeqNoMismatch
toEnum 34 = SignatureMismatch
toEnum _ = error "Uknown MultiSigError id"
fromEnum SeqNoMismatch = 33
fromEnum SignatureMismatch = 34
recvInternal :: '[Slice] :-> '[]
recvInternal = drop
recvExternal :: '[Slice] :-> '[]
recvExternal = do
decodeFromSlice @Signature
dup
preloadFromSlice @Word32
stacktype @[Word32, Slice, Signature]
-- cnt cs sign
pushRoot
decodeFromCell @Storage
stacktype @[PublicKey, Word32, Word32, Slice, Signature]
-- pk cnt' cnt cs sign
xcpu @1 @2
stacktype @[Word32, Word32, PublicKey, Word32, Slice, Signature]
-- cnt cnt' pk cnt cs sign
equalInt >> throwIfNot SeqNoMismatch
push @2
sliceHash
stacktype @[Hash Slice, PublicKey, Word32, Slice, Signature]
-- hash pk cnt cs sign
xc2pu @0 @4 @4
stacktype @[PublicKey, Signature, Hash Slice, Word32, Slice, PublicKey]
-- pubk sign hash cnt cs pubk
chkSignU
stacktype @[Bool, Word32, Slice, PublicKey]
-- ? cnt cs pubk
throwIfNot SignatureMismatch
accept
swap
decodeFromSlice @Word32
nip
dup
srefs @Word8
pushInt 0
if IsEq
then ignore
else do
decodeFromSlice @Word8
decodeFromSlice @(Cell MessageObject)
stacktype @[Slice, Cell MessageObject, Word8, Word32, PublicKey]
xchg @2
sendRawMsg
stacktype @[Slice, Word32, PublicKey]
endS
inc
encodeToCell @Storage
popRoot
getSeqno :: '[] :-> '[Word32]
getSeqno = do
pushRoot
cToS
preloadFromSlice @Word32
á¨á˘á˛á¤áľá¤á áĽá á¨áŁááĽá ááá á¨áŞáľ áŚááł áá áá ááá áŽáľ á áá ááááá˘
áľá ááľáľá áĽá áśá áá°áá°ááŤáá˝
á áľááŠáŁ áľáŤá˝á 380 á°á áłáľ áá áˇá (á¨á°ááľ áá áá°ááá áᣠáľáĽá°áŁáá˝á áĽá áľáááá áĽáľááľá á¨ááŽ)ᢠá ááľáľ ááá˘áá˝ á ááľáľá ááŽáááą ááľáĽ á°áłáľáááᥠCTOᣠá¨áĄáľá ááŞáŁ á¨áĽáááźáá ááľá¨á áľááťááľáśá˝ áĽá ᨠHaskell áśááľáá ááá˘áá˝á˘
á¨ááŤáśá ááááľáŁá¨á áá áľ á¨áĄáľá áľáŤ áĽá áĽáŤáłá˝áá á á áłá˛áľ á´áááááá˝ áá áłáá˝ ááľáĽ á ááĽááľ á¨ááľááŁáľ á áľáááááľ áá áá á¨ááŤáľá°áľáľ á ááá áŤáááá á˝áá á ááľáľáŠ áááłá°á ááĽááśá˝á á ááá°ááᢠáĽá áĽáá áá á¨ááá¸á áá˝áśá˝ á ááľá ááĽáśá˝ ááľáĽ á¨áá°ááá áá¤áľ áááááľ á áá áá°áá á¨ááá˝á áááľ áĽá ááἠáľááľáłáá˝ ááŤáłáᢠá á°á¨ááŞá áĽáá°áá áŁá áĽáŤáá˝ áá ááĽáŤáľ áá áá á¨áŠáŁááŤá áá°áśá˝ áĽáŠ áá°á áá ᣠááááŤáąá á áĽáŠ áááł á¨áá°áŤ á¨ááľáĽ ááľá°ááĽá á¨áá áĽááá°á áĽáŠ áá¤áśá˝á áááááľ áĽá á á áŁá á¨áŁáľ áľáááá˘
ááĽáá˝ áá° ááᥠá¨áśá áĄáľá áŁá°á¨áá á¨áľáŤ áá á á áľá°áááᢠááľáĽáľáĽ, ááá, áĽá á¨ááá á áá, á¨á á°áŤá áľáááľ ááááŁáľ á˝ááá. áśá áľáá á á á áŤáá ááľá¨á áááá á á¨ááá§áᢠááá áĽáá, áá áĽá-áá áłá áĽáá˛áłáĽá, á áĽáááźáá ááŽáááśá˝ ááľáĽ á á áááá áĽá á¨áááľ ááłáŞáŤáá˝á á¨ááťáťá á ááá áĽá á°á¨á᪠áá¨ááá á áá áľ. á áá á¨áá áá°áľ á áŤá á áááá˝á áŠáŤáľ áá°áááá˘
áá
áá á˝áá áŤáá ᥠá áá á ááá áĽáŤááá˝ áŤáááľ ááá á˝ááŽá˝á ááááłáľ áśá áĽáá´áľ áá áá áĽáá°áá˝á ááłáĽ áŤáááľ
ááá: hab.com