Skip to content

Creating and Compiling Smart Contracts with Docker

This document guides you on how to create, compile, and deploy smart contracts using Ultra's 3rd party Docker image.

Prerequisites

Before you begin, ensure that Docker is installed on your computer and you can use the Developer Tools Docker image. For guidance, refer to the Tutorial - Install Docker and get started with Developer Tools Docker image tutorial.

Goal

The goal of this tutorial is to guide developers through the process of creating, compiling, and deploying smart contracts using Development Tools Docker image. By following this step-by-step guide, you will learn how to set up the development environment, create and compile a smart contract, deploy it to the Ultra Blockchain, and interact with it.

Step 1: Start the Docker Container and Log In

Start the Docker container, which contains the smart contract developer tools and a local Ultra Blockchain, using the following command:

sh
docker start ultra

Log in to your container with the following command:

sh
docker exec -it ultra /bin/bash

Step 2: Start the Local Chain in the Docker Container

Start the local Ultra Blockchain with:

sh
ultratest -D -n -s

Accept the default recommendation for the temporary files location by pressing enter.

Step 2a: Verify the Local Chain is Running

Execute the following command inside the container:

sh
cleos get info

Step 3: Create and Compile the Smart Contract

Create a directory on your host machine at ultra_workdir/hello and create a file named hello.cpp with the following content:

cpp
#include <eosio/eosio.hpp>

class [[eosio::contract]] hello : public eosio::contract {
public:
using contract::contract;

[[eosio::action]]
void hi(eosio::name user) {
    eosio::print("Hello, ", user);
}
};

Save it, then compile it with the following command in your Docker session:

sh
cdt-cpp -o /opt/ultra_workdir/hello/hello.wasm /opt/ultra_workdir/hello/hello.cpp

Verify that two new files, hello.abi and hello.wasm, were created in the hello directory with the following command:

sh
ls -lsa /opt/ultra_workdir/hello/

Step 4: Create an Account for Deployment

Inside the Docker container, create a private and public key pair:

sh
cleos create key --to-console

You will see a generated key pair:

sh
Private key: 5KPNRT7C4CJs9ddNTieC5fL92NQNk82Nxb1EQ5sL4siGhU4oxcV
Public key: EOS7crhavXnYD6LcbfXQuF4GoqWsS8zdYvVXyv2AV9HSFLa75PHCD

Import the key into your local wallet:

sh
cleos wallet import --private-key 5KPNRT7C4CJs9ddNTieC5fL92NQNk82Nxb1EQ5sL4siGhU4oxcV

Create an account named helloacc using your public key:

sh
cleos system newaccount --gift-ram-kbytes 128 eosio helloacc EOS7crhavXnYD6LcbfXQuF4GoqWsS8zdYvVXyv2AV9HSFLa75PHCD EOS7crhavXnYD6LcbfXQuF4GoqWsS8zdYvVXyv2AV9HSFLa75PHCD

Verify the account:

sh
cleos get account helloacc

Step 5: Deploy the Smart Contract

Deploy the smart contract to helloacc:

sh
cleos set contract helloacc /opt/ultra_workdir/hello hello.wasm hello.abi

WARNING

If you encounter the error account helloacc does not have KYC info, execute:

sh
cleos push action eosio.kyc togglekyc '[]' -p ultra.kyc

Then retry the deployment command.

Verify the deployment:

sh
cleos get code helloacc

If the code hash is not zero, the contract has been successfully deployed.

Step 6: Interact with Your Smart Contract

Call the hi action of the hello smart contract:

sh
cleos push action helloacc hi '["alice"]' -p helloacc@active

The output will be "Hello, alice".

Note: The hi action uses eosio::name parameter, so using capital letters will result in an Invalid name error:

sh
cleos push action helloacc hi '["Alice"]' -p helloacc@active

Always use names that conform to the EOSIO naming rules: lowercase letters, digits, and periods, with a maximum length of 12 characters.

Step 7: Log Out from Docker Container

To log out from the Docker container, you can type exit or simply press the CTRL+D shortcut combination.

What's next?

TBA