Développer sur FreeTON (1): Créer son wallet avec ft

Thomas
OCamlPro FreeTON FR
8 min readAug 31, 2021

Dans nos articles précédents, nous avons présenté la blockchain FreeTON, et comment créer son premier compte sur FreeTON en utilisant l’interface web de TON Surf. Maintenant, nous allons commencer à nous intéresser au développement de smart contracts en Solidity sur FreeTON. Pour cela, nous avons besoin de pouvoir manipuler de nombreux comptes pour déployer et tester les contrats. C’est ce que va nous permettre ft , un wallet en ligne de commande que nous avons spécialement développé pour cet usage, et bien d’autres, puisque cet outil concentre des années d’expérience sur Tezos, Dune Network et maintenant FreeTON, pour fournir aux développeurs un couteau suisse puissant, intuitif et documenté. La documentation complète de ft est disponible sur github.

Installer l’outil ft

La première étape de notre voyage consiste bien entendu à installer ft. La façon la plus rapide est d’utiliser Docker, qui permet d’exécuter ft sous Linux, Mac et Windows. Les courageux qui souhaitent bénéficier des dernières améliorations opteront pour la compilation depuis les sources avec opam.

Installer ft avec Docker

La manière la plus simple d’installer ft consiste à utiliser docker, comme indiqué ici. Il est conseillé d’utiliser une version récente de docker .

Cette méthode consiste simplement à télécharger un script, et à utiliser ce script en lieu et place de ft . Le script téléchargera l’image depuis le Docker-Hub à la première exécution et se comportera ensuite simplement comme ft , avec quelques limitations mineures (pas de commande ft exec , accès aux fichiers uniquement dans les sous-répertoires).

L’image est mise à jour assez régulièrement, il suffit alors de lancer la commande docker pull ocamlpro/ft pour utiliser la dernière version.

Installer ft avec opam

Pour suivre le développement de ft au jour le jour, le mieux est de construire le programme depuis les sources. Cette méthode fonctionne bien sous Linux, mais n’a pas été testée sous Mac et Windows.

La méthode consiste ici à installer opam , le gestionnaire de paquets de référence de OCaml, d’ajouter le dépôt des paquets d’OCamlPro, puis d’installer les paquets nécessaires. Il faut aussi installer cargo , le gestionnaire de paquets de Rust, dont dépend le SDK de FreeTON. Cela donne les commandes suivantes pour préparer l’environnement:

$ sh <(curl -sL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)
$ opam init --comp=4.10.0
$ opam repo add ocp git+https://github.com/OCamlPro/ocp-opam-repository
$ opam update
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ opam install --deps-only ft

Il faut ensuite installer le paquet freeton_wallet ou ft avec opam . La commande ft doit alors apparaître dans le PATH en faisant eval $(opam env) :

$ opam install freeton_wallet
$ eval $(opam env)
$ ft

Soit de compiler depuis les sources sur Github. La commande ft apparaît alors dans le répertoire local:

$ git clone https://github.com/OCamlPro/freeton_wallet
$ cd freeton_wallet
$ eval $(opam env)
$ drom build --switch 4.10.0
$ ./ft

ft n’utilisant pas de fichiers externes, il est tout à fait possible de copier l’exécutable dans un endroit plus pratique, ou de créer un lien symbolique:

$ sudo ln -s $(which ft) /usr/local/bin/ft

Vous pourrez à tout moment consulter la liste des commandes à l’aide de ft --help :

Vous pouvez aussi demander de l’aide sur une sous-commande, par exemple ft account create --help :

Tout wallet FreeTON est un “multisig”… ou presque !

Dans la suite, pour un utilisateur, nous allons distinguer les termes clé, passphrase, wallet, adresse et compte.

  • La clé d’un utilisateur est en fait une paire de clés cryptographiques, composée d’une clé secrète (ou privée) et d’une clé publique (pubkey); la clé secrète ne doit jamais être communiquée à quiconque; au contraire, la clé publique peut être librement partagée, elle permet aux autres utilisateurs de reconnaître cet utilisateur.
  • La passphrase d’un utilisateur est un ensemble de mot permettant de créer une paire de clés, secrète et publique. Elle a l’avantage de pouvoir être facilement mémorisable, ou écrite sur papier pour être stockée dans un coffre, alors que la clé secrète l’est difficilement. Comme la clé secrète, elle doit rester secrète. Sur FreeTON, la passphrase est généralement composée de 12 mots, facilement distinguables.
  • Un wallet est un emplacement sur la blockchain, contrôlé par la clé d’un utilisateur. De la crypto-monnaie peut y être stockée. Sur FreeTON, cet emplacement est toujours géré par un smart contract, qu’il est donc nécessaire de déployer pour pouvoir déplacer les tokens.
  • Une adresse est l’adresse sur la blockchain d’un wallet, qui permet d’accéder à ce wallet, au smart contract qu’il contient, et de demander des transferts de tokens. Sur FreeTON, l’adresse d’un wallet est uniquement déterminée par le clé de l’utilisateur, le code du smart contract et les données statiques du contrat.
  • Finalement, un compte est le nom associé par ft à une clé ou une adresse mémorisée dans son carnet de contacts. Ce nom permet de référencer une clé ou une adresse beaucoup plus facilement que leur version numérique.

Sur FreeTON, l’adresse d’un wallet dépend donc du code du smart contract qu’il abrite. Pour simplifier les choses, la plupart des utilisateurs déploient un contrat standard, appelé “multisig”, pour gérer leurs tokens. Nous reviendrons plus tard sur l’ensemble des possibilités offertes par ce type de contrats, mais pour l’instant, il suffit de savoir qu’il s’agit quasiment toujours du contrat historiquement appelé SetcodeMultisigWallet2 (et récemment renommé SurfMultisigWallet), déployé par défaut par TON Surf, et par ft avec l’option --surf .

ft permet de facilement switcher entre plusieurs réseaux FreeTON, tels que le mainnet, le testnet et les réseaux déployés localement (sandboxes)

La notion de “switch” pour manipuler les réseaux

Je suppose à présent que vous disposez d’un exécutable ft . Comme toutes les blockchains, FreeTON dispose de plusieurs réseaux: mainnet est la blockchain principale, testnet la blockchain de test… Parfois, à l’occasion de contests particuliers, de nouveaux réseaux sont déployés. C’était le cas pour le contest auquel nous avons participé, un réseau prenant en charge un opérande de vérification des preuves zero-knowledge avait été déployé par la Nil Foundation.

ft permet de changer facilement d’univers sans se soucier de perdre d’informations. Il permet aussi de créer des bacs à sable ou sandbox dans lesquelles on peut facilement, et rapidement, déployer des contrats, tester des scénarios, et disposer d’argent de poche sans avoir à en demander à quiconque. Ces univers sont appelés des switch et on passe de l’un à l’autre ainsi:

$ ft switch to mainnet

Si vous n’avez pas encore d’argent sur un compte FreeTON, ou si vous préférez commencer doucement en sandbox, vous pouvez lancer:

$ ft switch create sandbox1

puis

$ ft node start

Par défaut, une sandbox vient avec des utilisateurs user0 , user1 , etc à qui vous pouvez facilement verser des TON:

$ ft node give user0 --amount 1000000

Vous voilà armé(e) pour la suite.

Créer un compte avec ft

Si vous possédez déjà un compte TON Surf:

Peut-être possédez-vous déjà un compte sur FreeTON, par exemple sur TON Surf. Dans ce cas, cela signifie que vous avez à la fois un compte (défini par votre clé privée, que vous avez probablement stockée en lieu sûr sous la forme de douze mots ou dans un Ledger) et un contrat multisig déployé (seulement si vous avez de l’argent sur ce compte) depuis ce compte, à partir duquel TON Surf calcule votre adresse. Vous pouvez facilement importer votre compte TON Surf dans ft :

$ ft account create mon_compte --passphrase “votre passphrase” --contract SetcodeMultisigWallet2

(mon_compte est simplement l’alias que vous souhaitez donner à votre compte.) Cela vous permet simplement de contrôler votre compte depuis ft en plus de TON Surf, et ne va rien transférer ou modifier à votre compte. Alternativement, vous pouvez ajouter votre compte “en lecture seule”:

$ ft account create mon_compte --address <une de vos adresses> --surf

Vous ne pourrez alors pas initier de transactions depuis votre compte sur ft, mais vous pourrez consulter l’état (typiquement, le solde) de votre compte.

Si vous n’avez pas encore de compte:

Si vous n’avez pas encore de compte, vous pouvez simplement appeler la commande:

$ ft account create blog_example
[...]
Passphrase: "produce coconut gospel observe wild bounce make sudden capital blur banana pen"
{ "public": "0bbb94fc6e2876c9eda45e904e1e4fb34c0a8373bb7ea3963f6c295e6ca89b51",
"secret": "ed9c7b590b26473ac583f63487f73495a622c4229d4e56e063d6743d39d8a7ee" }
Key for user "blog_example" generated
Saving wallet file /home/thomas/.ft/sandbox1/wallet.json
Saving config file /home/thomas/.ft/config.json

Vous pouvez voir votre clé privée sous forme hexadécimale et sous forme de “passphrase”, ainsi que votre clé publique. Vous n’avez pas encore d’adresse puisque vous n’avez pas encore créé de wallet. D’ailleurs, vous n’avez pas besoin de déployer un wallet pour connaître sa future adresse:

$ ft account create multisig_blog_example --passphrase "produce coconut gospel observe wild bounce make sudden capital blur banana pen" --contract SetcodeMultisigWallet2
[...]
Account "multisig_blog_example" created.
{
"name": "multisig_blog_example",
"passphrase": "produce coconut gospel observe wild bounce make sudden capital blur banana pen",
"pair": {
"public": "0bbb94fc6e2876c9eda45e904e1e4fb34c0a8373bb7ea3963f6c295e6ca89b51",
"secret": "ed9c7b590b26473ac583f63487f73495a622c4229d4e56e063d6743d39d8a7ee"
},
"account": {
"address": "0:51ea97d220272fca86bf7c85446df4d7e5e8f70891433c50ec6383f72ed02fba",
"contract": "SetcodeMultisigWallet2"
}
}

Lorsque mon compte recevra de l’argent, je pourrai déployer le contrat SetcodeMultisigWallet2 et mon adresse sera celle renvoyée par la commande précédente (0:51ea97d220272fca86bf7c85446df4d7e5e8f70891433c50ec6383f72ed02fba ). Vérifions-le:

$ ft multisig create multisig_blog_example
[...]
fatal exception Deploy failed: {
code:409.000000
message:Account does not exist. You need to transfer funds to this account first to have a positive balance and then deploy its code
data:{
core_version:1.16.1
account_address:0:51ea97d220272fca86bf7c85446df4d7e5e8f70891433c50ec6383f72ed02fba

[...]
}

Le déploiement a échoué, puisque le compte n’avait pas d’argent. Par contre, on vérifie que l’adresse est bien la même qu’auparavant! Une manière plus orthodoxe de vérifier que le compte n’est pas actif:

$ ft account info multisig_blog_example
[...]
Loading wallet file /home/thomas/.ft/sandbox3/wallet.json
Account "multisig_blog_example": not yet created (empty balance)

Transférer des tokens

Envoyons donc de l’argent à notre (futur) contrat en le parrainant avec l’option --sponsor :

ft multisig transfer 100.000 --from user0 --to multisig_blog_example --sponsor
Config loaded from /home/thomas/.ft/config.json
Network: sandbox4
Loading wallet file /home/thomas/.ft/sandbox4/wallet.json
call: 0:108f6113fb0cad8c98b70e8ea3cfd12b52710ec20441d05ceb78cacb4f5566b7
method: submitTransaction
params: {"dest":"0:51ea97d220272fca86bf7c85446df4d7e5e8f70891433c50ec6383f72ed02fba","value":100000000000,"bounce":false,"allBalance":false,"payload":""}
signed: user0
MessageId: ea235abb3a2dd6adfb9ee98aa5c4bb080f1798123d45c512f4a5522b2ac4c31e
call result:
{
"transId": "0"
}

Effectuer un transfert de tokens dans FreeTON avec ft

Dernière opération de ce tutoriel, je vais maintenant transférer de l’argent à user1 :

$ ft multisig transfer 100.000 --from multisig_blog_example --to user1
[...]
call: 0:51ea97d220272fca86bf7c85446df4d7e5e8f70891433c50ec6383f72ed02fba
method: submitTransaction
params: {"dest":"0:108f6113fb0cad8c98b70e8ea3cfd12b52710ec20441d05ceb78cacb4f5566b7","value":100000000000,"bounce":true,"allBalance":false,"payload":""}
signed: multisig_blog_example
MessageId: b6a34407669008dce626d769e208f2b47feec3be17cc4cbbe92ceec71516f8b7
call result:
{
"transId": "0"
}

On peut ensuite vérifier que les tokens ont bien été réceptionnés:

$ ft account info user1

Conclusion

Et voilà! Nous n’avons fait qu’effleurer la surface des possibilités de ft, mais j’espère vous avoir donné envie de l’utiliser! Les prochaines fois, nous verrons par exemple que ft:

  • connaît des dizaines de contrats standard de FreeTON par défaut;
  • permet d’utiliser l’ABI des contrats pour faire des vérifications de typage au moment des appels;
  • permet de surveiller un contrat en direct et les transactions qui lui parviennent, et de les stocker dans une base de données;
  • permet de faire des substitutions complexes à la fois dans l’entrée et la sortie des appels;
  • permet à tout moment d’appeler tonos-cli pour lui faire exécuter l’équivalent de la commande actuelle;
  • permet de créer et exécuter des debots , ces “bots décentralisés” privilégiés par l’écosystème FreeTON pour interagir avec les smart contracts.

--

--