"Hello World" TON smart-contract for 15 minutes

"Hello World" TON smart-contract for 15 minutes

Project Manager

Эта статья доступна на русском языке

The objective of a tutorial: understand how faster to deploy smart contracts at the TON for the very beginners.

What to do: to prepare necessary components, deploy the smart-contract, where there is a function hello_world. Call this function from outside and we will get 1234567890

This tutorial is intended for OS Ubuntu 18.04/20.04 (Server и Desktop). For other OS this tutorial can be useless.

upd: If the guide looks scary, you can deploy a smart contract in 2 minutes via https://deployer.tonsc.org , but it's better to read the guide to understand the essence.

The smart-contract will deploy in testnet

For deploying at mainnet: in p.19 testnet.ton.sh change to the ton.sh, p.20 you can skip, p.21 and p.22 change the testnet-global.config.json to global.config.json

Let’s go!

1. Connect to the server by SSH or open Terminal, then:

sudo -i
{if the system asked for a password - type it, then enter}


2. If you haven’t installed mytonctrl yet - install (if your PC /server isn’t powerful, it can take ~15 min, so have a cup of tea/coffee after starting the installation):

wget https://raw.githubusercontent.com/igroman787/mytonctrl/master/scripts/install.sh

sudo bash install.sh -m lite


3. Compile executable file func:

cd /usr/bin/ton/ && make func


4. Create the required environment variable:

export FIFTPATH=/usr/src/ton/crypto/fift/lib:/usr/src/ton/crypto/smartcont


5. Download global configuration file for mainnet and testnet:

wget https://newton-blockchain.github.io/global.config.json
wget https://newton-blockchain.github.io/testnet-global.config.json


6. Make generate.fif file, to which be referred .sh file from p.9:

cd /usr/src/ton/crypto/smartcont && nano generate.fif


7. Insert code:

#!/usr/bin/fift -s
"TonUtil.fif" include
"Asm.fif" include

5 :$1..n
$1 parse-workchain-id =: wc  // set workchain id from command line argument
$2 parse-int =: subwallet-id
$3 "/root/sc" replace-if-null =: file-base
$4 "/root/sc.fif" replace-if-null =: fif-code

fif-code include
<b 0 32 u, subwallet-id 32 u,
  file-base +".pk" load-generate-keypair
  constant wallet_pk
  B,
b>
null
<b b{0011} s, 3 roll ref, rot ref, swap dict, b>
dup ."StateInit: " <s csr. cr
dup hashu wc swap 2dup 2constant wallet_addr
."new wallet address = " 2dup .addr cr
2dup file-base +".addr" save-address-verbose
."Non-bounceable address (for init): " 2dup 7 .Addr cr
."Bounceable address (for later access): " 6 .Addr cr
<b subwallet-id 32 u, -1 32 i, 0 32 u, b>
dup ."signing message: " <s csr. cr
dup hashu wallet_pk ed25519_sign_uint rot
<b b{1000100} s, wallet_addr addr, b{000010} s, swap <s s, b{0} s, swap B, swap <s s, b>
dup ."External message for initialization is " <s csr. cr
2 boc+>B dup Bx. cr
file-base +".boc" tuck B>file
."(Saved wallet creating query to file " type .")" cr


8. Exit with saving:

{ctrl+x -> y -> enter}

upd: more detailed analysis of the code from p.7


9. Create .sh file, which permits compile file of future smart-contract (.fc) to .fif file. On-base .fif - generate .addr, .pk, .boc files and get the address of smart-contract:

cd /usr/bin/ton/ && nano compile.sh


10. Insert code:

#!/bin/bash
fcDir=$1
workchainId=$2
subwalletId=$3
if [ -z "${workchainId}" ]
 then
  workchainId=0
fi
if [ -z "${subwalletId}" ]
 then
  subwalletId=0
fi

funcPath="/usr/bin/ton/crypto/func"
fiftPath="/usr/bin/ton/crypto/fift"
fiftLibPath="/usr/src/ton/crypto/fift/lib"
smartcontPath="/usr/src/ton/crypto/smartcont"
stdlibPath="${smartcontPath}/stdlib.fc"

fcNames=$(ls ${fcDir}/*.fc)
fcPath=${fcNames[0]}
fcFullName=$(basename $fcPath)
fcShortName=${fcFullName:0:-3}
fifPath="${fcDir}/${fcShortName}.fif"

toFifCmd="${funcPath} -SPA ${stdlibPath} ${fcPath} -o ${fifPath}"
${toFifCmd}

toGenerateCmd="${fiftPath} -I ${fiftLibPath}:${smartcontPath} -s generate.fif ${workchainId} ${subwalletId} ${fcDir}/${fcShortName} ${fifPath}"
generateResult=$(${toGenerateCmd})

rawAddr=${generateResult#*new wallet address = }
rawAddr=${rawAddr%(Saving address to file*}

nonBounceableAddr=${generateResult#*Non-bounceable address (for init): }
nonBounceableAddr=${nonBounceableAddr%Bounceable*}

bounceableAddr=${generateResult#*Bounceable address (for later access): }
bounceableAddr=${bounceableAddr%signing message:*}

echo -e "\nRaw address: ${rawAddr}\nNon-bounceable address: ${nonBounceableAddr}\nBounceable address: ${bounceableAddr}"


11. Exit wth saving:

{ctrl+x -> y -> enter}


12. Allow the compile.sh to be executed:

chmod +x compile.sh


13. Create a directory with our project and go to it:

mkdir /srv/HelloWorldSC && cd /srv/HelloWorldSC


14. Use as the base smart-contract code of the wallet wallet3-code.fc. Copy it to the current directory like sc.fc (sc - smart-contract):

cp /usr/src/ton/crypto/smartcont/wallet3-code.fc ./sc.fc


15. Open sc.fc with a text editor:

nano sc.fc


16. Add at the end of the file our function hello_world:

int hello_world() method_id {
 return 1234567890;
}


17. Exit with saving:

{ctrl+x -> y -> enter}


18. Run compile.sh. First argument - directory with the project, where is located .fc file. Second argument - workchain_id, in our case it's 0 (if you are going to work with elector smart-contract in future, then point workchain_id -1):

/usr/bin/ton/compile.sh /srv/HelloWorldSC 0


19. Copy the address of smart-contract (it will be shown in console like Bounceable address), and transfer on it 1 TON. You can check your TON transfer on the link (replace "SMARTCONTRACT_ADDRESS"):
https://testnet.ton.sh/address/SMARTCONTRACT_ADDRESS


20. The simplest option is to register a wallet in testnet with the link https://tonwallet.me?testnet=true

Ask on telegram channel https://t.me/tondev to transfer a little of TON (5 will be enough), or text me (@ProjectManageRR), if I am not busy, I’ll send you.


21. Activate our smart-contract (roughly speaking - connect the smart-contract code to the wallet address):

/usr/bin/ton/lite-client/lite-client -C /usr/bin/ton/testnet-global.config.json -c "sendfile /srv/HelloWorldSC/sc.boc"


22. Call the hello_world function of our smart-contract, and get in response 1234567890:

/usr/bin/ton/lite-client/lite-client -C /usr/bin/ton/testnet-global.config.json -c "runmethod SMARTCONTRACT_ADDRESS hello_world"


23. If you get in the response "..result: [ 1234567890 ].." - Congratulations! You successfully have deployed a smart-contract in TON network! 🥳🥳

Bonus:

Type "ls" in the console and you will see these files:

sc.addr - a file with a smart-contract address

sc.boc -a file that we will send to activate a smart-contract

sc.fc - a file with a smart-contract code at programming language FunC

sc.fif - a compilation of sc.fc in Fift smart-contract code

sc.pk - a private key to access a smart-contract (for example, to transfer coins from it)

Usually, you need to save .addr and .pk files to a secure location for having access to your address.

Later I will consider the code line by line used in this tutorial smart-contract (sc.fc) and add here a link instead of this message 😉

If something doesn’t work at this tutorial, please contact @ProjectManageRR

I will be so thankful for your likes: EQAoB3Myz9p5DMjdAytez_d4FcWcXEnqRL7Mk11jS6PW0_R1

👍

Report Page