C# Translation Overview

The Pravda project allows you to write programs in the subset of C# language. The Pravda Translator translates CIL to Pravda bytecode.

Supported C# Subset

The Pravda Translator only supports certain C# features.

Notably, it currently supports the following features: - Access to the storage via class fields. - Access to the storage via Mapping<K, V> (get, getDefault, put, exists methods). - Access to the sender address via Info.Sender() method. - Access to the list of contract callers' addresses via Info.Callers() method. - Class methods that are translated to program methods. - Integer primitive types (int, short, byte, uint) and bool. - Basic arithmetics and logical operations. - Local variables and method arguments. - If-conditions and loops. - Strings and auxiliary methods (+, access to particular chars, Slice); - Bytes (immutable byte arrays), auxiliary methods (access to particular bytes, Slice, Concat), creation from byte[]: new Bytes(bytes_array); - Arrays of primitive types (int, byte, String), reading and writing of particular elements; - Explicit conversion of primitive types via System.Convert.ToByte, System.Convert.ToChar,System.Convert.ToInt16,System.Convert.ToInt32,System.Convert.ToDouble,System.Convert.ToBoolean,System.Convert.ToString - Cryptographic functions: Ripemd160 hashing, validation of Ed25519 Signature. See more in Standard library docs. - User defined classes (although you cannot store them in the storage yet). - The calling of other programs via ProgramHelper.Program<...> interface. You can check out the examples here: (Pcall.cs, PcallProgram.cs). - Create events in your program via Log.Event("name of event", <some_data>), see Event.cs

Features that are not supported: - Standard C# library (except for some specific functions from the list above); - Standard C# collections.

Important note: The entire code placed in the Expload.Pravda namespace is ignored. It is needed to support stub methods in Pravda.dll.


You can have a look at several examples of test programs that illustrate the current translation abilities: - String examples that show how to operate Strings. - Array examples that show how to operate arrays. - Simple program with balanceOf and transfer methods similar to the corresponding methods from ERC20 - Buffer -- Dynamic resizable array implemented in C#. - Zoo program that allows you to create zoos, pets and breed them. - Poker program that implements simple a poker game on the blockchain. _(poker.cs was provided by Ducatur team)