Ce projet est le fruit des conseils et des critiques bienveillantes d’un grand nombre de personnes. Nous tenons à les remercier ici et leur faire part de toutes nos gratitudes, pour avoir été à l’écoute et toujours d’une aide précieuse. Plus particulièrement, nous souhaitons adresser à travers ces courtes lignes nos remerciements les plus sincères à nos professeurs M. Youness Tabii et M. Rachid Oulad Haj Thami, qui ont eu le soin d’examiner et encadrer ce travail et ainsi nous offrir une véritable opportunité d’apprentissage. Enfin, nos remerciements s’adressent aux professeurs et au corps administratif de l’Ecole Nationale Supérieure de l’Informatique et de l’Analyse des Systèmes ENSIAS.
CashScript est un langage de programmation de haut niveau pour les contrats intelligents sur Bitcoin Cash. Il offre une couche d'abstraction solide sur la machine virtuelle native de Bitcoin Cash, Bitcoin Script. Sa syntaxe est basée sur le langage de contrat intelligent Solidity d'Ethereum, mais sa fonctionnalité est très différente puisque les contrats intelligents sur Bitcoin Cash diffèrent grandement des contrats intelligents sur Ethereum.
- Boolean :true ou false
- Integer
- Bytes :séquence de bits
- String
- datasig :Séquence de bytes représentant une signature de données
- sig : Séquence de bytes représentant une signature de transaction.
- pubkey :Séquence de bytes représentant une clé publique
- if (condition){body} else{}
- while (condition){body}
- print(variable)
- input(variable)
- ’while’ WHILE_TOKEN
- ’print’ ECRIRE_TOKEN
- ’input’ LIRE_TOKEN ‘date(’ DATE_TOKEN
- ’/*’ CO_TOKEN
- ’*/’ CF_TOKEN
- ’//’ ∼[\r\n]* COMMENTAIRE_LIGNE_TOKEN
- ’/’ . ? ’*/’ COMMENTAIRE_TOKEN
- EOF EOF_TOKEN
- ’true’ TRUE_TOKEN
- ’false’ FALSE_TOKEN
- ’satoshis’ SATOSHIS_TOKEN
- ’sats’ SATS_TOKEN
- ’finney’ FINNEY_TOKEN
- ’bits’ BITS_TOKEN
- ’bitcoin’ BITCOIN_TOKEN
- ’seconds’ SECONDS_TOKEN
- ’minutes’ MINUTES_TOKEN
- ’hours’ HOURS_TOKEN
- ’days’ DAYS_TOKEN
- ’weeks’ WEEKS_TOKEN [-] ?[0-9]+ ([eE] [0-9]+) NOMBRE_LITTERAL_TOKEN
- ’bytes’ BYTES_TOKEN
- ’"’ GUILLEMET_TOKEN
- ’\” sGUILLEMET_SIMPLE_TOKEN
- ^[^’"]*$ _VALEUR_TOKEN
- ’0’ [xX] [0-9A-Fa- f]* HEX_LITTERAL_TOKEN
- ’tx.age’ TX_AGE_TOKEN
- ’tx.time’ TX_TIME_TOKEN
- ’tx.version’ TX_VERSION_TOKEN
- ’tx.hashPrevouts’ TX_HASHPREVOUTS_TOKEN
- ’tx.hashSequence’ TX_HASHSEQUENCE_TOKEN
- ’tx.outpoint’ TX_OUTPOINT_TOKEN
- ’tx.bytecode’ TX_BYTECODE_TOKEN
- ’tx.value’ TX_VALUE_TOKEN
- ’tx.sequence’ TX_SEQUENCE_TOKEN
- ’tx.hashOutputs’ TX_HASHOUTPUTS_TOKEN
- ’tx.locktime’ TX_LOCKTIME_TOKEN
- ’tx.hashtype’ TX_HASHTYPE_TOKEN
- ’tx.preimage’ TX_PREIMAGE_TOKEN
- [a-zA-Z] [a-zA-Z0-9_]* IDENTIFIANT_TOKEN
- [ \t\r\n\u000C] ESPACE_TOKEN
- ’pragma’ PRAGMA_TOKEN
- ’ ;’ POINT_VIRGULE_TOKEN
- ’.’ POINT_TOKEN
- ’cashscript’ CASHSCRIPT_TOKEN
- ’^’ OPERATEUR_BINAIRE_XOR_TOKEN
- ’∼’ OPERATEUR_BINAIRE_NON_TOKEN
- ’>=’ OPERATEUR_SUPEG_TOKEN
- ’>’ OPERATEUR_SUP_TOKEN
- ’<’ OPERATEUR_INF_TOKEN
- ’<=’ OPERATEUR_INFEG_TOKEN
- ’=’ OPERATEUR_EG_TOKEN
- ’contract’ CONTRAT_TOKEN
- ’{’ ACCOLADE_O_TOKEN
- ’}’ ACCOLADE_F_TOKEN
- ’function’ FONCTION_TOKEN
- ’(’ PARENTHESE_O_TOKEN
- ’,’ VIRGULE_TOKEN
- ’)’ PARENTHESE_F_TOKEN
- ’require’ REQUIRE_TOKEN
- ’require_time’ REQUIRE_TIME_TOKEN
- if ’ SI_TOKEN
- ’else’ SINON_TOKEN
- new’ NOUVEAU_TOKEN
- ’[’ CROCHET_O_TOKEN
- ]’ CROCHET_F_TOKEN
- ’.reverse()’ INVERSER_TOKEN
- ’.length’ TAILLE_TOKEN
- ’ !’ OPERATEUR_NON_TOKEN
- ’-’ OPERATEUR_MOINS_TOKEN
- ’.split’ SPLIT_TOKEN
- ’/’ OPERATEUR_DIVISER_TOKEN
- ’%’ OPERATEUR_MODULO_TOKEN
- ’+’ OPERATEUR_PLUS_TOKEN
- ’*’ OPERATEUR_FOIS_TOKEN
- ’==’ OPERATEUR_EGAL_TOKEN
- ’ !’ OPERATEUR_DIFFERENT_TOKEN
- ’&’ OPERATEUR_BINAIRE_ET_TOKEN
- ’|’ OPERATEUR_BINAIRE_OU_TOKEN
- ’&&’ OPERATEUR_ET_TOKEN
- ’||’ OPERATEUR_OU_TOKEN
- ’int’ TYPE_ENTIER_TOKEN
- ’bool’ TYPE_BOOLEAN_TOKEN
- ’string’ TYPE_STRING_TOKEN
- ’pubkey’ TYPE_CLE_PUBLIQUE_TOKEN
- ’sig’ TYPE_SIGNATURE_TOKEN
- ’datasig’ TYPE_SIGNATURE_DONNEE_TOKEN
- PROGRAMME : DIRECTIVE_PRAGMA* DEFINITION_CONTRAT EOF_TOKEN ;
- DIRECTIVE_PRAGMA : PRAGMA_TOKEN CASHSCRIPT_TOKEN VALEUR_PRAGMA POINT_VIRGULE_TOKEN ;
- VALEUR_PRAGMA : CONTRAINTE_VERSION [CONTRAINTE_VERSION | eps] ;
- CONTRAINTE_VERSION : [OPERATEUR_VERSION | eps] VERSION_LITTERALE_TOKEN ; *OPERATEUR_VERSION : OPERATEUR_BINAIRE_XOR_TOKEN | OPERATEUR_BINAIRE_NON_TOKEN | OPERATEUR_SUPEG_TOKEN | OPERATEUR_SUP_TOKEN | OPERATEUR_INF_TOKEN | OPERATEUR_INFEG_TOKEN | OPERATEUR_EG_TOKEN ;
- DEFINITION_CONTRAT : CONTRAT_TOKEN IDENTIFIANT_TOKEN LISTE_PARAMETRE ACCOLADE_O_TOKEN {DEFINITION_FONCTION} ACCOLADE_F_TOKEN ;
- DEFINITION_FONCTION : FONCTION_TOKEN IDENTIFIANT_TOKEN LISTE_PARAMETRE ACCOLADE_O_TOKEN {DECLARATION} ACCOLADE_F_TOKEN ;
- LISTE_PARAMETRE : PARENTHESE_O_TOKEN [(PARAMETRE (VIRGULE_TOKEN PARAMETRE)* [VIRGULE_TOKEN | eps])| eps] PARENTHESE_F_TOKEN ;
- PARAMETRE : NOM_TYPE IDENTIFIANT_TOKEN ;
- BLOC : ACCOLADE_O_TOKEN DECLARATION* ACCOLADE_F_TOKEN | DECLARATION ;
- DECLARATION : DEFINITION_VARIABLE| AFFECTATION| TEMPS_DECLARATION | requireStatement| SI | WHILE | ECRIRE | LIRE ;
- DEFINITION_VARIABLE : NOM_TYPE IDENTIFIANT_TOKEN OPERATEUR_EG_TOKEN EXPRESSION POINT_VIRGULE_TOKEN ;
- AFFECTATION : IDENTIFIANT_TOKEN OPERATEUR_EG_TOKEN EXPRESSION POINT_VIRGULE_TOKEN ; TEMPS_DECLARATION : REQUIRE_TIME_TOKEN PARENTHESE_O_TOKEN TX_VAR_TOKEN OPERATEUR_SUPEG_TOKEN EXPRESSION PARENTHESE_F_TOKEN POINT_VIRGULE_TOKEN ;
- requireStatement : REQUIRE_TOKEN PARENTHESE_O_TOKEN EXPRESSION PARENTHESE_F_TOKEN POINT_VIRGULE_TOKEN ;
- SI : SI_TOKEN PARENTHESE_O_TOKEN EXPRESSION PARENTHESE_F_TOKEN BLOC [(SINON_TOKEN BLOC)| eps] ;
- LITTERAL : BOOLEAN_LITTERAL_TOKEN | NOMBRE_LITTERAL | STRING_LITTERAL_TOKEN | DATE_LITTERAL | HEX_LITTERAL_TOKEN ;
- LISTE_EXPRESSIONS : PARENTHESE_O_TOKEN [(EXPRESSION (VIRGULE_TOKEN EXPRESSION)* [VIRGULE_TOKEN| eps])| eps] PARENTHESE_F_TOKEN ;
- EXPRESSION : PARENTHESE_O_TOKEN EXPRESSION PARENTHESE_F_TOKEN | NOM_TYPE PARENTHESE_O_TOKEN EXPRESSION [(VIRGULE_TOKEN EXPRESSION) | eps] [VIRGULE_TOKEN| eps] PARENTHESE_F_TOKEN | NOUVEAU_TOKEN IDENTIFIANT_TOKEN LISTE_EXPRESSIONS | IDENTIFIANT_TOKEN [[LISTE_EXPRESSIONS | INVERSER_TOKEN | TAILLE_TOKEN | (CROCHET_O_TOKEN NOMBRE_LITTERAL_TOKEN CROCHET_F_TOKEN) | (SPLIT_TOKEN PARENTHESE_O_TOKEN EXPRESSION PARENTHESE_F_TOKEN ) | DEUXIEME_EXPRESSION_BINAIRE] | eps ] | LITTERAL [ [INVERSER_TOKEN | TAILLE_TOKEN | (CROCHET_O_TOKEN NOMBRE_LITTERAL_TOKEN CROCHET_F_TOKEN) | (SPLIT_TOKEN PARENTHESE_O_TOKEN EXPRESSION PARENTHESE_F_TOKEN ) | DEUXIEME_EXPRESSION_BINAIRE] | eps ] | (OPERATEUR_NON_TOKEN | OPERATEUR_MOINS_TOKEN) EXPRESSION | CROCHET_O_TOKEN [(EXPRESSION (VIRGULE_TOKEN EXPRESSION)* [VIRGULE_TOKEN | eps]) | eps] CROCHET_F_TOKEN | CHAMP_AVANT_IMAGE_TOKEN -NOMBRE_LITTERAL : NOMBRE_LITTERAL_TOKEN [UNITE_TOKEN| eps] ;
- NOM_TYPE : TYPE_ENTIER_TOKEN | TYPE_BOOLEAN_TOKEN | TYPE_STRING_TOKEN | TYPE_CLE_PUBLIQUE_TOKEN | TYPE_SIGNATURE_TOKEN | TYPE_SIGNATURE_DONNEE_TOKEN | BYTES ;
- BYTES : BYTES_TOKEN [[[1-9] [0-9]*] | eps] ;
- DATE_LITTERAL : DATE_TOKEN STRING_LITTERAL_TOKEN PARENTHESE_F_TOKEN ;
- WHILE : WHILE_TOKEN PARENTHESE_O_TOKEN EXPRESSION PARENTHESE_F_TOKEN BLOC ;
- ECRIRE : ECRIRE_TOKEN PARENTHESE_O_TOKEN EXPRESSION PARENTHESE_F_TOKEN POINT_VIRGULE_TOKEN ;
- LIRE : LIRE_TOKEN IDENTIFIANT_TOKEN PARENTHESE_F_TOKEN POINT_VIRGULE_TOKEN ;
- COMMENT : CO_TOKEN .* CF_TOKEN ;
- LINE_COMMENT : COMMENTAIRE_LIGNE_TOKEN ∼[\r\n]* ;
- VERSION_LITTERALE_TOKEN : NOMBRE_LITTERAL_TOKEN POINT_TOKEN NOMBRE_LITTERAL_TOKEN POINT_TOKEN NOMBRE_LITTERAL_TOKEN ;
- BOOLEAN_LITTERAL_TOKEN : TRUE_TOKEN | FALSE_TOKEN ;
- UNITE_TOKEN : SATOSHIS_TOKEN | SATS_TOKEN | FINNEY_TOKEN | BITS_TOKEN | BITCOIN_TOKEN | SECONDS_TOKEN | MINUTES_TOKEN | HOURS_TOKEN | DAYS_TOKEN | WEEKS_TOKEN ;
- STRING_LITTERAL_TOKEN : [ GUILLEMET_SIMPLE_TOKEN STRING_VALEUR_TOKEN GUILLEMET_SIMPLE_TOKEN ] | [ GUILLEMET_TOKEN STRING_VALEUR_TOKEN GUILLEMET_TOKEN ] ;
- TX_VAR_TOKEN : TX_AGE_TOKEN|TX_TIME_TOKEN ;
- CHAMP_AVANT_IMAGE_TOKEN :TX_VERSION_TOKEN| TX_HASHPREVOUTS_TOKEN | TX_HASHSEQUENCE_TOKEN| TX_OUTPOINT_TOKEN | TX_BYTECODE_TOKEN| TX_VALUE_TOKEN| TX_SEQUENCE_TOKEN| TX_HASHOUTPUTS_TOKEN | TX_LOCKTIME_TOKEN| TX_HASHTYPE_TOKEN| TX_PREIMAGE_TOKEN
pour utiliser le compilateur vous devez au dossier tests le programme sous le nom test.cash et le compilé parl'utilisation de : cmake voir : comment utiliser cmake