Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

HOW TO CREATE A C COUNTER PROGRAM ON THRU

This repository is a comprehensive, beginner-friendly guide to building your first C program on the Thru blockchain. Whether you are a seasoned developer or just starting out, this guide will walk you through every step of the process.


CLONE THE REPOSITORY

Start by cloning this repository and navigating into the project directory:

git clone https://github.com/namedfarouk/thru-c-tutorial.git
cd thru-c-tutorial

🛠️ SETUP ENVIRONMENT

1. Install Dependencies

Open your terminal and run the following command to install the core build tools:

sudo apt update && sudo apt install -y build-essential pkg-config libssl-dev protobuf-compiler libclang-dev clang npm

2. Install Buf CLI

Thru uses Buf for protocol buffers. Install it globally via npm:

sudo npm install -g @bufbuild/buf

3. Install Rust

The Thru CLI is built with Rust. Install the Rust toolchain:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Press 1 to proceed with the default installationsource$HOME/.cargo/env

4. Install Thru CLI

Now, install the official Thru command-line interface:

cargo install thru-cli --locked

Note: We use --locked to ensure we use the exact versions of dependencies intended by the developers, avoiding version conflicts.


INITIALIZE WALLET & ACCOUNT

1. Create Directories

mkdir -p ~/.thru/cli

2. Generate Wallet

thru-cli keys generate default

🌐 RPC CONFIGURATION (REQUIRED)

By default, the Thru CLI may be configured to use a local RPC endpoint (127.0.0.1), which will not work unless you are running a local Thru node.

For this guide, you should use the Thru Alphanet RPC.

Edit the Thru CLI config file

nano ~/.thru/cli/config.yaml

Update [rpc_base_url]

Change this:

rpc_base_url: http://127.0.0.1:8472

To this:

rpc_base_url: https://rest.alphanet.thruput.org

Save and exit the file.

3. Create and Fund Account

This command will set up your default account on the Thru network:

thru-cli account create default

INSTALL TOOLCHAIN & SDK

To compile C code for the Thru VM (which runs on RISC-V), you need:

  1. System dependencies
  2. The Thru RISC-V toolchain
  3. The Thru C SDK

1. System Dependencies (Linux / Codespaces / WSL)

sudo apt update
sudo apt install -y \
build-essential \
pkg-config \
libssl-dev \
gcc-riscv64-unknown-elf

2. Install the Thru Toolchain

thru-cli dev toolchain install

3. Install the Thru C SDK

thru-cli dev sdk install c

4. Verify Install

ls ~/.thru/sdk
which riscv64-unknown-elf-gcc

Expected output:

c toolchain
/usr/bin/riscv64-unknown-elf-gcc

CREATE YOUR PROGRAM

1. Create the Makefile (GNUmakefile)

The Makefile tells the compiler how to build your project. Create a file named GNUmakefile in your root directory:

## Explicit configuration for the Thru SDK buildTHRU_HOME := $(HOME)/.thru
BASEDIR := $(CURDIR)/build
THRU_C_SDK_DIR := $(THRU_HOME)/sdk/c/thru-sdk
THRU_RISCV_TOOLCHAIN := $(THRU_HOME)/sdk/toolchain
exportTHRU_HOMEexportTHRU_RISCV_TOOLCHAINexportPATH := $(THRU_RISCV_TOOLCHAIN)/bin:$(PATH)include$(THRU_C_SDK_DIR)/thru_c_program.mk

2. Create the Header File (examples/tn_counter.h)

This file defines the "shape" of your data and instructions.

#ifndefTN_COUNTER_H#defineTN_COUNTER_H#include<thru-sdk/c/tn_sdk.h>#defineTN_COUNTER_ERR_INVALID_INSTRUCTION 0x1000UL
#defineTN_COUNTER_INSTRUCTION_CREATE (0U)
#defineTN_COUNTER_INSTRUCTION_INCREMENT (1U)
typedefstruct __attribute__((packed)) {
uintinstruction_type;
ushortaccount_index;
ucharcounter_program_seed[TN_SEED_SIZE];
uintproof_size;
} tn_counter_create_args_t;
typedefstruct __attribute__((packed)) {
ulongcounter_value;
} tn_counter_account_t;
#endif

3. Create the Logic File (examples/tn_counter.c)

This is where the actual "smart" logic of your program lives.

#include<thru-sdk/c/tn_sdk.h>#include"tn_counter.h"TSDK_ENTRYPOINT_FNvoidstart(ucharconst*data, ulongsize) {
if (size<sizeof(uint)) tsdk_revert(TN_COUNTER_ERR_INVALID_INSTRUCTION);
uintconst*type= (uintconst*)data;
if (*type==TN_COUNTER_INSTRUCTION_CREATE) {
// Handle initializationtsdk_return(TSDK_SUCCESS);
} else {
tsdk_revert(TN_COUNTER_ERR_INVALID_INSTRUCTION);
}
}

INSTALL TOOLCHAIN & SDK

...commands...


⚠️ Alphanet RPC Notice

Thru currently operates on Alphanet. You may occasionally encounter errors such as:

  • service is currently unavailable
  • transaction rejected
  • Parse failed

These are network-side issues and NOT caused by your setup. If this happens:

  • Wait 1–2 minutes
  • Retry the command

⚠️ Important
Before building, ensure the RISC-V toolchain is exposed to make:

export THRU_HOME=$HOME/.thru
export THRU_RISCV_TOOLCHAIN=$THRU_HOME/sdk/toolchain
export PATH=$THRU_RISCV_TOOLCHAIN/bin:$PATH

COMPILE AND DEPLOY

1. Compile

rm -rf build
make

⚠️ Note Do not run make clean. The Thru C SDK may error during make clean even on a valid setup. To reset the build state, delete the build/ directory instead.

2. Deploy

Deploy your compiled program to the Thru blockchain:

thru-cli program create my_counter ./build/thruvm/bin/tn_counter_program_c.bin

🔍 VERIFY YOUR WORK

Visit scan.thru.org and paste your Program ID to see your program live on the blockchain!


🤝 CONNECT WITH ME

If you found this guide helpful, feel free to reach out!

Thanks for using my guide! Built with ❤️ for the Thru Community.

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

HOW TO CREATE A C COUNTER PROGRAM ON THRU

This repository is a comprehensive, beginner-friendly guide to building your first C program on the Thru blockchain. Whether you are a seasoned developer or just starting out, this guide will walk you through every step of the process.


CLONE THE REPOSITORY

Start by cloning this repository and navigating into the project directory:

git clone https://github.com/namedfarouk/thru-c-tutorial.git
cd thru-c-tutorial

🛠️ SETUP ENVIRONMENT

1. Install Dependencies

Open your terminal and run the following command to install the core build tools:

sudo apt update && sudo apt install -y build-essential pkg-config libssl-dev protobuf-compiler libclang-dev clang npm

2. Install Buf CLI

Thru uses Buf for protocol buffers. Install it globally via npm:

sudo npm install -g @bufbuild/buf

3. Install Rust

The Thru CLI is built with Rust. Install the Rust toolchain:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Press 1 to proceed with the default installationsource$HOME/.cargo/env

4. Install Thru CLI

Now, install the official Thru command-line interface:

cargo install thru-cli --locked

Note: We use --locked to ensure we use the exact versions of dependencies intended by the developers, avoiding version conflicts.


INITIALIZE WALLET & ACCOUNT

1. Create Directories

mkdir -p ~/.thru/cli

2. Generate Wallet

thru-cli keys generate default

🌐 RPC CONFIGURATION (REQUIRED)

By default, the Thru CLI may be configured to use a local RPC endpoint (127.0.0.1), which will not work unless you are running a local Thru node.

For this guide, you should use the Thru Alphanet RPC.

Edit the Thru CLI config file

nano ~/.thru/cli/config.yaml

Update [rpc_base_url]

Change this:

rpc_base_url: http://127.0.0.1:8472

To this:

rpc_base_url: https://rest.alphanet.thruput.org

Save and exit the file.

3. Create and Fund Account

This command will set up your default account on the Thru network:

thru-cli account create default

INSTALL TOOLCHAIN & SDK

To compile C code for the Thru VM (which runs on RISC-V), you need:

  1. System dependencies
  2. The Thru RISC-V toolchain
  3. The Thru C SDK

1. System Dependencies (Linux / Codespaces / WSL)

sudo apt update
sudo apt install -y \
build-essential \
pkg-config \
libssl-dev \
gcc-riscv64-unknown-elf

2. Install the Thru Toolchain

thru-cli dev toolchain install

3. Install the Thru C SDK

thru-cli dev sdk install c

4. Verify Install

ls ~/.thru/sdk
which riscv64-unknown-elf-gcc

Expected output:

c toolchain
/usr/bin/riscv64-unknown-elf-gcc

CREATE YOUR PROGRAM

1. Create the Makefile (GNUmakefile)

The Makefile tells the compiler how to build your project. Create a file named GNUmakefile in your root directory:

## Explicit configuration for the Thru SDK buildTHRU_HOME := $(HOME)/.thru
BASEDIR := $(CURDIR)/build
THRU_C_SDK_DIR := $(THRU_HOME)/sdk/c/thru-sdk
THRU_RISCV_TOOLCHAIN := $(THRU_HOME)/sdk/toolchain
exportTHRU_HOMEexportTHRU_RISCV_TOOLCHAINexportPATH := $(THRU_RISCV_TOOLCHAIN)/bin:$(PATH)include$(THRU_C_SDK_DIR)/thru_c_program.mk

2. Create the Header File (examples/tn_counter.h)

This file defines the "shape" of your data and instructions.

#ifndefTN_COUNTER_H#defineTN_COUNTER_H#include<thru-sdk/c/tn_sdk.h>#defineTN_COUNTER_ERR_INVALID_INSTRUCTION 0x1000UL
#defineTN_COUNTER_INSTRUCTION_CREATE (0U)
#defineTN_COUNTER_INSTRUCTION_INCREMENT (1U)
typedefstruct __attribute__((packed)) {
uintinstruction_type;
ushortaccount_index;
ucharcounter_program_seed[TN_SEED_SIZE];
uintproof_size;
} tn_counter_create_args_t;
typedefstruct __attribute__((packed)) {
ulongcounter_value;
} tn_counter_account_t;
#endif

3. Create the Logic File (examples/tn_counter.c)

This is where the actual "smart" logic of your program lives.

#include<thru-sdk/c/tn_sdk.h>#include"tn_counter.h"TSDK_ENTRYPOINT_FNvoidstart(ucharconst*data, ulongsize) {
if (size<sizeof(uint)) tsdk_revert(TN_COUNTER_ERR_INVALID_INSTRUCTION);
uintconst*type= (uintconst*)data;
if (*type==TN_COUNTER_INSTRUCTION_CREATE) {
// Handle initializationtsdk_return(TSDK_SUCCESS);
} else {
tsdk_revert(TN_COUNTER_ERR_INVALID_INSTRUCTION);
}
}

INSTALL TOOLCHAIN & SDK

...commands...


⚠️ Alphanet RPC Notice

Thru currently operates on Alphanet. You may occasionally encounter errors such as:

  • service is currently unavailable
  • transaction rejected
  • Parse failed

These are network-side issues and NOT caused by your setup. If this happens:

  • Wait 1–2 minutes
  • Retry the command

⚠️ Important
Before building, ensure the RISC-V toolchain is exposed to make:

export THRU_HOME=$HOME/.thru
export THRU_RISCV_TOOLCHAIN=$THRU_HOME/sdk/toolchain
export PATH=$THRU_RISCV_TOOLCHAIN/bin:$PATH

COMPILE AND DEPLOY

1. Compile

rm -rf build
make

⚠️ Note Do not run make clean. The Thru C SDK may error during make clean even on a valid setup. To reset the build state, delete the build/ directory instead.

2. Deploy

Deploy your compiled program to the Thru blockchain:

thru-cli program create my_counter ./build/thruvm/bin/tn_counter_program_c.bin

🔍 VERIFY YOUR WORK

Visit scan.thru.org and paste your Program ID to see your program live on the blockchain!


🤝 CONNECT WITH ME

If you found this guide helpful, feel free to reach out!

Thanks for using my guide! Built with ❤️ for the Thru Community.

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

HOW TO CREATE A C COUNTER PROGRAM ON THRU

This repository is a comprehensive, beginner-friendly guide to building your first C program on the Thru blockchain. Whether you are a seasoned developer or just starting out, this guide will walk you through every step of the process.


CLONE THE REPOSITORY

Start by cloning this repository and navigating into the project directory:

git clone https://github.com/namedfarouk/thru-c-tutorial.git
cd thru-c-tutorial

🛠️ SETUP ENVIRONMENT

1. Install Dependencies

Open your terminal and run the following command to install the core build tools:

sudo apt update && sudo apt install -y build-essential pkg-config libssl-dev protobuf-compiler libclang-dev clang npm

2. Install Buf CLI

Thru uses Buf for protocol buffers. Install it globally via npm:

sudo npm install -g @bufbuild/buf

3. Install Rust

The Thru CLI is built with Rust. Install the Rust toolchain:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Press 1 to proceed with the default installationsource$HOME/.cargo/env

4. Install Thru CLI

Now, install the official Thru command-line interface:

cargo install thru-cli --locked

Note: We use --locked to ensure we use the exact versions of dependencies intended by the developers, avoiding version conflicts.


INITIALIZE WALLET & ACCOUNT

1. Create Directories

mkdir -p ~/.thru/cli

2. Generate Wallet

thru-cli keys generate default

🌐 RPC CONFIGURATION (REQUIRED)

By default, the Thru CLI may be configured to use a local RPC endpoint (127.0.0.1), which will not work unless you are running a local Thru node.

For this guide, you should use the Thru Alphanet RPC.

Edit the Thru CLI config file

nano ~/.thru/cli/config.yaml

Update [rpc_base_url]

Change this:

rpc_base_url: http://127.0.0.1:8472

To this:

rpc_base_url: https://rest.alphanet.thruput.org

Save and exit the file.

3. Create and Fund Account

This command will set up your default account on the Thru network:

thru-cli account create default

INSTALL TOOLCHAIN & SDK

To compile C code for the Thru VM (which runs on RISC-V), you need:

  1. System dependencies
  2. The Thru RISC-V toolchain
  3. The Thru C SDK

1. System Dependencies (Linux / Codespaces / WSL)

sudo apt update
sudo apt install -y \
build-essential \
pkg-config \
libssl-dev \
gcc-riscv64-unknown-elf

2. Install the Thru Toolchain

thru-cli dev toolchain install

3. Install the Thru C SDK

thru-cli dev sdk install c

4. Verify Install

ls ~/.thru/sdk
which riscv64-unknown-elf-gcc

Expected output:

c toolchain
/usr/bin/riscv64-unknown-elf-gcc

CREATE YOUR PROGRAM

1. Create the Makefile (GNUmakefile)

The Makefile tells the compiler how to build your project. Create a file named GNUmakefile in your root directory:

## Explicit configuration for the Thru SDK buildTHRU_HOME := $(HOME)/.thru
BASEDIR := $(CURDIR)/build
THRU_C_SDK_DIR := $(THRU_HOME)/sdk/c/thru-sdk
THRU_RISCV_TOOLCHAIN := $(THRU_HOME)/sdk/toolchain
exportTHRU_HOMEexportTHRU_RISCV_TOOLCHAINexportPATH := $(THRU_RISCV_TOOLCHAIN)/bin:$(PATH)include$(THRU_C_SDK_DIR)/thru_c_program.mk

2. Create the Header File (examples/tn_counter.h)

This file defines the "shape" of your data and instructions.

#ifndefTN_COUNTER_H#defineTN_COUNTER_H#include<thru-sdk/c/tn_sdk.h>#defineTN_COUNTER_ERR_INVALID_INSTRUCTION 0x1000UL
#defineTN_COUNTER_INSTRUCTION_CREATE (0U)
#defineTN_COUNTER_INSTRUCTION_INCREMENT (1U)
typedefstruct __attribute__((packed)) {
uintinstruction_type;
ushortaccount_index;
ucharcounter_program_seed[TN_SEED_SIZE];
uintproof_size;
} tn_counter_create_args_t;
typedefstruct __attribute__((packed)) {
ulongcounter_value;
} tn_counter_account_t;
#endif

3. Create the Logic File (examples/tn_counter.c)

This is where the actual "smart" logic of your program lives.

#include<thru-sdk/c/tn_sdk.h>#include"tn_counter.h"TSDK_ENTRYPOINT_FNvoidstart(ucharconst*data, ulongsize) {
if (size<sizeof(uint)) tsdk_revert(TN_COUNTER_ERR_INVALID_INSTRUCTION);
uintconst*type= (uintconst*)data;
if (*type==TN_COUNTER_INSTRUCTION_CREATE) {
// Handle initializationtsdk_return(TSDK_SUCCESS);
} else {
tsdk_revert(TN_COUNTER_ERR_INVALID_INSTRUCTION);
}
}

INSTALL TOOLCHAIN & SDK

...commands...


⚠️ Alphanet RPC Notice

Thru currently operates on Alphanet. You may occasionally encounter errors such as:

  • service is currently unavailable
  • transaction rejected
  • Parse failed

These are network-side issues and NOT caused by your setup. If this happens:

  • Wait 1–2 minutes
  • Retry the command

⚠️ Important
Before building, ensure the RISC-V toolchain is exposed to make:

export THRU_HOME=$HOME/.thru
export THRU_RISCV_TOOLCHAIN=$THRU_HOME/sdk/toolchain
export PATH=$THRU_RISCV_TOOLCHAIN/bin:$PATH

COMPILE AND DEPLOY

1. Compile

rm -rf build
make

⚠️ Note Do not run make clean. The Thru C SDK may error during make clean even on a valid setup. To reset the build state, delete the build/ directory instead.

2. Deploy

Deploy your compiled program to the Thru blockchain:

thru-cli program create my_counter ./build/thruvm/bin/tn_counter_program_c.bin

🔍 VERIFY YOUR WORK

Visit scan.thru.org and paste your Program ID to see your program live on the blockchain!


🤝 CONNECT WITH ME

If you found this guide helpful, feel free to reach out!

Thanks for using my guide! Built with ❤️ for the Thru Community.

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

HOW TO CREATE A C COUNTER PROGRAM ON THRU

This repository is a comprehensive, beginner-friendly guide to building your first C program on the Thru blockchain. Whether you are a seasoned developer or just starting out, this guide will walk you through every step of the process.


CLONE THE REPOSITORY

Start by cloning this repository and navigating into the project directory:

git clone https://github.com/namedfarouk/thru-c-tutorial.git
cd thru-c-tutorial

🛠️ SETUP ENVIRONMENT

1. Install Dependencies

Open your terminal and run the following command to install the core build tools:

sudo apt update && sudo apt install -y build-essential pkg-config libssl-dev protobuf-compiler libclang-dev clang npm

2. Install Buf CLI

Thru uses Buf for protocol buffers. Install it globally via npm:

sudo npm install -g @bufbuild/buf

3. Install Rust

The Thru CLI is built with Rust. Install the Rust toolchain:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Press 1 to proceed with the default installationsource$HOME/.cargo/env

4. Install Thru CLI

Now, install the official Thru command-line interface:

cargo install thru-cli --locked

Note: We use --locked to ensure we use the exact versions of dependencies intended by the developers, avoiding version conflicts.


INITIALIZE WALLET & ACCOUNT

1. Create Directories

mkdir -p ~/.thru/cli

2. Generate Wallet

thru-cli keys generate default

🌐 RPC CONFIGURATION (REQUIRED)

By default, the Thru CLI may be configured to use a local RPC endpoint (127.0.0.1), which will not work unless you are running a local Thru node.

For this guide, you should use the Thru Alphanet RPC.

Edit the Thru CLI config file

nano ~/.thru/cli/config.yaml

Update [rpc_base_url]

Change this:

rpc_base_url: http://127.0.0.1:8472

To this:

rpc_base_url: https://rest.alphanet.thruput.org

Save and exit the file.

3. Create and Fund Account

This command will set up your default account on the Thru network:

thru-cli account create default

INSTALL TOOLCHAIN & SDK

To compile C code for the Thru VM (which runs on RISC-V), you need:

  1. System dependencies
  2. The Thru RISC-V toolchain
  3. The Thru C SDK

1. System Dependencies (Linux / Codespaces / WSL)

sudo apt update
sudo apt install -y \
build-essential \
pkg-config \
libssl-dev \
gcc-riscv64-unknown-elf

2. Install the Thru Toolchain

thru-cli dev toolchain install

3. Install the Thru C SDK

thru-cli dev sdk install c

4. Verify Install

ls ~/.thru/sdk
which riscv64-unknown-elf-gcc

Expected output:

c toolchain
/usr/bin/riscv64-unknown-elf-gcc

CREATE YOUR PROGRAM

1. Create the Makefile (GNUmakefile)

The Makefile tells the compiler how to build your project. Create a file named GNUmakefile in your root directory:

## Explicit configuration for the Thru SDK buildTHRU_HOME := $(HOME)/.thru
BASEDIR := $(CURDIR)/build
THRU_C_SDK_DIR := $(THRU_HOME)/sdk/c/thru-sdk
THRU_RISCV_TOOLCHAIN := $(THRU_HOME)/sdk/toolchain
exportTHRU_HOMEexportTHRU_RISCV_TOOLCHAINexportPATH := $(THRU_RISCV_TOOLCHAIN)/bin:$(PATH)include$(THRU_C_SDK_DIR)/thru_c_program.mk

2. Create the Header File (examples/tn_counter.h)

This file defines the "shape" of your data and instructions.

#ifndefTN_COUNTER_H#defineTN_COUNTER_H#include<thru-sdk/c/tn_sdk.h>#defineTN_COUNTER_ERR_INVALID_INSTRUCTION 0x1000UL
#defineTN_COUNTER_INSTRUCTION_CREATE (0U)
#defineTN_COUNTER_INSTRUCTION_INCREMENT (1U)
typedefstruct __attribute__((packed)) {
uintinstruction_type;
ushortaccount_index;
ucharcounter_program_seed[TN_SEED_SIZE];
uintproof_size;
} tn_counter_create_args_t;
typedefstruct __attribute__((packed)) {
ulongcounter_value;
} tn_counter_account_t;
#endif

3. Create the Logic File (examples/tn_counter.c)

This is where the actual "smart" logic of your program lives.

#include<thru-sdk/c/tn_sdk.h>#include"tn_counter.h"TSDK_ENTRYPOINT_FNvoidstart(ucharconst*data, ulongsize) {
if (size<sizeof(uint)) tsdk_revert(TN_COUNTER_ERR_INVALID_INSTRUCTION);
uintconst*type= (uintconst*)data;
if (*type==TN_COUNTER_INSTRUCTION_CREATE) {
// Handle initializationtsdk_return(TSDK_SUCCESS);
} else {
tsdk_revert(TN_COUNTER_ERR_INVALID_INSTRUCTION);
}
}

INSTALL TOOLCHAIN & SDK

...commands...


⚠️ Alphanet RPC Notice

Thru currently operates on Alphanet. You may occasionally encounter errors such as:

  • service is currently unavailable
  • transaction rejected
  • Parse failed

These are network-side issues and NOT caused by your setup. If this happens:

  • Wait 1–2 minutes
  • Retry the command

⚠️ Important
Before building, ensure the RISC-V toolchain is exposed to make:

export THRU_HOME=$HOME/.thru
export THRU_RISCV_TOOLCHAIN=$THRU_HOME/sdk/toolchain
export PATH=$THRU_RISCV_TOOLCHAIN/bin:$PATH

COMPILE AND DEPLOY

1. Compile

rm -rf build
make

⚠️ Note Do not run make clean. The Thru C SDK may error during make clean even on a valid setup. To reset the build state, delete the build/ directory instead.

2. Deploy

Deploy your compiled program to the Thru blockchain:

thru-cli program create my_counter ./build/thruvm/bin/tn_counter_program_c.bin

🔍 VERIFY YOUR WORK

Visit scan.thru.org and paste your Program ID to see your program live on the blockchain!


🤝 CONNECT WITH ME

If you found this guide helpful, feel free to reach out!

Thanks for using my guide! Built with ❤️ for the Thru Community.

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

HOW TO CREATE A C COUNTER PROGRAM ON THRU

This repository is a comprehensive, beginner-friendly guide to building your first C program on the Thru blockchain. Whether you are a seasoned developer or just starting out, this guide will walk you through every step of the process.


CLONE THE REPOSITORY

Start by cloning this repository and navigating into the project directory:

git clone https://github.com/namedfarouk/thru-c-tutorial.git
cd thru-c-tutorial

🛠️ SETUP ENVIRONMENT

1. Install Dependencies

Open your terminal and run the following command to install the core build tools:

sudo apt update && sudo apt install -y build-essential pkg-config libssl-dev protobuf-compiler libclang-dev clang npm

2. Install Buf CLI

Thru uses Buf for protocol buffers. Install it globally via npm:

sudo npm install -g @bufbuild/buf

3. Install Rust

The Thru CLI is built with Rust. Install the Rust toolchain:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Press 1 to proceed with the default installationsource$HOME/.cargo/env

4. Install Thru CLI

Now, install the official Thru command-line interface:

cargo install thru-cli --locked

Note: We use --locked to ensure we use the exact versions of dependencies intended by the developers, avoiding version conflicts.


INITIALIZE WALLET & ACCOUNT

1. Create Directories

mkdir -p ~/.thru/cli

2. Generate Wallet

thru-cli keys generate default

🌐 RPC CONFIGURATION (REQUIRED)

By default, the Thru CLI may be configured to use a local RPC endpoint (127.0.0.1), which will not work unless you are running a local Thru node.

For this guide, you should use the Thru Alphanet RPC.

Edit the Thru CLI config file

nano ~/.thru/cli/config.yaml

Update [rpc_base_url]

Change this:

rpc_base_url: http://127.0.0.1:8472

To this:

rpc_base_url: https://rest.alphanet.thruput.org

Save and exit the file.

3. Create and Fund Account

This command will set up your default account on the Thru network:

thru-cli account create default

INSTALL TOOLCHAIN & SDK

To compile C code for the Thru VM (which runs on RISC-V), you need:

  1. System dependencies
  2. The Thru RISC-V toolchain
  3. The Thru C SDK

1. System Dependencies (Linux / Codespaces / WSL)

sudo apt update
sudo apt install -y \
build-essential \
pkg-config \
libssl-dev \
gcc-riscv64-unknown-elf

2. Install the Thru Toolchain

thru-cli dev toolchain install

3. Install the Thru C SDK

thru-cli dev sdk install c

4. Verify Install

ls ~/.thru/sdk
which riscv64-unknown-elf-gcc

Expected output:

c toolchain
/usr/bin/riscv64-unknown-elf-gcc

CREATE YOUR PROGRAM

1. Create the Makefile (GNUmakefile)

The Makefile tells the compiler how to build your project. Create a file named GNUmakefile in your root directory:

## Explicit configuration for the Thru SDK buildTHRU_HOME := $(HOME)/.thru
BASEDIR := $(CURDIR)/build
THRU_C_SDK_DIR := $(THRU_HOME)/sdk/c/thru-sdk
THRU_RISCV_TOOLCHAIN := $(THRU_HOME)/sdk/toolchain
exportTHRU_HOMEexportTHRU_RISCV_TOOLCHAINexportPATH := $(THRU_RISCV_TOOLCHAIN)/bin:$(PATH)include$(THRU_C_SDK_DIR)/thru_c_program.mk

2. Create the Header File (examples/tn_counter.h)

This file defines the "shape" of your data and instructions.

#ifndefTN_COUNTER_H#defineTN_COUNTER_H#include<thru-sdk/c/tn_sdk.h>#defineTN_COUNTER_ERR_INVALID_INSTRUCTION 0x1000UL
#defineTN_COUNTER_INSTRUCTION_CREATE (0U)
#defineTN_COUNTER_INSTRUCTION_INCREMENT (1U)
typedefstruct __attribute__((packed)) {
uintinstruction_type;
ushortaccount_index;
ucharcounter_program_seed[TN_SEED_SIZE];
uintproof_size;
} tn_counter_create_args_t;
typedefstruct __attribute__((packed)) {
ulongcounter_value;
} tn_counter_account_t;
#endif

3. Create the Logic File (examples/tn_counter.c)

This is where the actual "smart" logic of your program lives.

#include<thru-sdk/c/tn_sdk.h>#include"tn_counter.h"TSDK_ENTRYPOINT_FNvoidstart(ucharconst*data, ulongsize) {
if (size<sizeof(uint)) tsdk_revert(TN_COUNTER_ERR_INVALID_INSTRUCTION);
uintconst*type= (uintconst*)data;
if (*type==TN_COUNTER_INSTRUCTION_CREATE) {
// Handle initializationtsdk_return(TSDK_SUCCESS);
} else {
tsdk_revert(TN_COUNTER_ERR_INVALID_INSTRUCTION);
}
}

INSTALL TOOLCHAIN & SDK

...commands...


⚠️ Alphanet RPC Notice

Thru currently operates on Alphanet. You may occasionally encounter errors such as:

  • service is currently unavailable
  • transaction rejected
  • Parse failed

These are network-side issues and NOT caused by your setup. If this happens:

  • Wait 1–2 minutes
  • Retry the command

⚠️ Important
Before building, ensure the RISC-V toolchain is exposed to make:

export THRU_HOME=$HOME/.thru
export THRU_RISCV_TOOLCHAIN=$THRU_HOME/sdk/toolchain
export PATH=$THRU_RISCV_TOOLCHAIN/bin:$PATH

COMPILE AND DEPLOY

1. Compile

rm -rf build
make

⚠️ Note Do not run make clean. The Thru C SDK may error during make clean even on a valid setup. To reset the build state, delete the build/ directory instead.

2. Deploy

Deploy your compiled program to the Thru blockchain:

thru-cli program create my_counter ./build/thruvm/bin/tn_counter_program_c.bin

🔍 VERIFY YOUR WORK

Visit scan.thru.org and paste your Program ID to see your program live on the blockchain!


🤝 CONNECT WITH ME

If you found this guide helpful, feel free to reach out!

Thanks for using my guide! Built with ❤️ for the Thru Community.

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

HOW TO CREATE A C COUNTER PROGRAM ON THRU

This repository is a comprehensive, beginner-friendly guide to building your first C program on the Thru blockchain. Whether you are a seasoned developer or just starting out, this guide will walk you through every step of the process.


CLONE THE REPOSITORY

Start by cloning this repository and navigating into the project directory:

git clone https://github.com/namedfarouk/thru-c-tutorial.git
cd thru-c-tutorial

🛠️ SETUP ENVIRONMENT

1. Install Dependencies

Open your terminal and run the following command to install the core build tools:

sudo apt update && sudo apt install -y build-essential pkg-config libssl-dev protobuf-compiler libclang-dev clang npm

2. Install Buf CLI

Thru uses Buf for protocol buffers. Install it globally via npm:

sudo npm install -g @bufbuild/buf

3. Install Rust

The Thru CLI is built with Rust. Install the Rust toolchain:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Press 1 to proceed with the default installationsource$HOME/.cargo/env

4. Install Thru CLI

Now, install the official Thru command-line interface:

cargo install thru-cli --locked

Note: We use --locked to ensure we use the exact versions of dependencies intended by the developers, avoiding version conflicts.


INITIALIZE WALLET & ACCOUNT

1. Create Directories

mkdir -p ~/.thru/cli

2. Generate Wallet

thru-cli keys generate default

🌐 RPC CONFIGURATION (REQUIRED)

By default, the Thru CLI may be configured to use a local RPC endpoint (127.0.0.1), which will not work unless you are running a local Thru node.

For this guide, you should use the Thru Alphanet RPC.

Edit the Thru CLI config file

nano ~/.thru/cli/config.yaml

Update [rpc_base_url]

Change this:

rpc_base_url: http://127.0.0.1:8472

To this:

rpc_base_url: https://rest.alphanet.thruput.org

Save and exit the file.

3. Create and Fund Account

This command will set up your default account on the Thru network:

thru-cli account create default

INSTALL TOOLCHAIN & SDK

To compile C code for the Thru VM (which runs on RISC-V), you need:

  1. System dependencies
  2. The Thru RISC-V toolchain
  3. The Thru C SDK

1. System Dependencies (Linux / Codespaces / WSL)

sudo apt update
sudo apt install -y \
build-essential \
pkg-config \
libssl-dev \
gcc-riscv64-unknown-elf

2. Install the Thru Toolchain

thru-cli dev toolchain install

3. Install the Thru C SDK

thru-cli dev sdk install c

4. Verify Install

ls ~/.thru/sdk
which riscv64-unknown-elf-gcc

Expected output:

c toolchain
/usr/bin/riscv64-unknown-elf-gcc

CREATE YOUR PROGRAM

1. Create the Makefile (GNUmakefile)

The Makefile tells the compiler how to build your project. Create a file named GNUmakefile in your root directory:

## Explicit configuration for the Thru SDK buildTHRU_HOME := $(HOME)/.thru
BASEDIR := $(CURDIR)/build
THRU_C_SDK_DIR := $(THRU_HOME)/sdk/c/thru-sdk
THRU_RISCV_TOOLCHAIN := $(THRU_HOME)/sdk/toolchain
exportTHRU_HOMEexportTHRU_RISCV_TOOLCHAINexportPATH := $(THRU_RISCV_TOOLCHAIN)/bin:$(PATH)include$(THRU_C_SDK_DIR)/thru_c_program.mk

2. Create the Header File (examples/tn_counter.h)

This file defines the "shape" of your data and instructions.

#ifndefTN_COUNTER_H#defineTN_COUNTER_H#include<thru-sdk/c/tn_sdk.h>#defineTN_COUNTER_ERR_INVALID_INSTRUCTION 0x1000UL
#defineTN_COUNTER_INSTRUCTION_CREATE (0U)
#defineTN_COUNTER_INSTRUCTION_INCREMENT (1U)
typedefstruct __attribute__((packed)) {
uintinstruction_type;
ushortaccount_index;
ucharcounter_program_seed[TN_SEED_SIZE];
uintproof_size;
} tn_counter_create_args_t;
typedefstruct __attribute__((packed)) {
ulongcounter_value;
} tn_counter_account_t;
#endif

3. Create the Logic File (examples/tn_counter.c)

This is where the actual "smart" logic of your program lives.

#include<thru-sdk/c/tn_sdk.h>#include"tn_counter.h"TSDK_ENTRYPOINT_FNvoidstart(ucharconst*data, ulongsize) {
if (size<sizeof(uint)) tsdk_revert(TN_COUNTER_ERR_INVALID_INSTRUCTION);
uintconst*type= (uintconst*)data;
if (*type==TN_COUNTER_INSTRUCTION_CREATE) {
// Handle initializationtsdk_return(TSDK_SUCCESS);
} else {
tsdk_revert(TN_COUNTER_ERR_INVALID_INSTRUCTION);
}
}

INSTALL TOOLCHAIN & SDK

...commands...


⚠️ Alphanet RPC Notice

Thru currently operates on Alphanet. You may occasionally encounter errors such as:

  • service is currently unavailable
  • transaction rejected
  • Parse failed

These are network-side issues and NOT caused by your setup. If this happens:

  • Wait 1–2 minutes
  • Retry the command

⚠️ Important
Before building, ensure the RISC-V toolchain is exposed to make:

export THRU_HOME=$HOME/.thru
export THRU_RISCV_TOOLCHAIN=$THRU_HOME/sdk/toolchain
export PATH=$THRU_RISCV_TOOLCHAIN/bin:$PATH

COMPILE AND DEPLOY

1. Compile

rm -rf build
make

⚠️ Note Do not run make clean. The Thru C SDK may error during make clean even on a valid setup. To reset the build state, delete the build/ directory instead.

2. Deploy

Deploy your compiled program to the Thru blockchain:

thru-cli program create my_counter ./build/thruvm/bin/tn_counter_program_c.bin

🔍 VERIFY YOUR WORK

Visit scan.thru.org and paste your Program ID to see your program live on the blockchain!


🤝 CONNECT WITH ME

If you found this guide helpful, feel free to reach out!

Thanks for using my guide! Built with ❤️ for the Thru Community.

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

HOW TO CREATE A C COUNTER PROGRAM ON THRU

This repository is a comprehensive, beginner-friendly guide to building your first C program on the Thru blockchain. Whether you are a seasoned developer or just starting out, this guide will walk you through every step of the process.


CLONE THE REPOSITORY

Start by cloning this repository and navigating into the project directory:

git clone https://github.com/namedfarouk/thru-c-tutorial.git
cd thru-c-tutorial

🛠️ SETUP ENVIRONMENT

1. Install Dependencies

Open your terminal and run the following command to install the core build tools:

sudo apt update && sudo apt install -y build-essential pkg-config libssl-dev protobuf-compiler libclang-dev clang npm

2. Install Buf CLI

Thru uses Buf for protocol buffers. Install it globally via npm:

sudo npm install -g @bufbuild/buf

3. Install Rust

The Thru CLI is built with Rust. Install the Rust toolchain:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Press 1 to proceed with the default installationsource$HOME/.cargo/env

4. Install Thru CLI

Now, install the official Thru command-line interface:

cargo install thru-cli --locked

Note: We use --locked to ensure we use the exact versions of dependencies intended by the developers, avoiding version conflicts.


INITIALIZE WALLET & ACCOUNT

1. Create Directories

mkdir -p ~/.thru/cli

2. Generate Wallet

thru-cli keys generate default

🌐 RPC CONFIGURATION (REQUIRED)

By default, the Thru CLI may be configured to use a local RPC endpoint (127.0.0.1), which will not work unless you are running a local Thru node.

For this guide, you should use the Thru Alphanet RPC.

Edit the Thru CLI config file

nano ~/.thru/cli/config.yaml

Update [rpc_base_url]

Change this:

rpc_base_url: http://127.0.0.1:8472

To this:

rpc_base_url: https://rest.alphanet.thruput.org

Save and exit the file.

3. Create and Fund Account

This command will set up your default account on the Thru network:

thru-cli account create default

INSTALL TOOLCHAIN & SDK

To compile C code for the Thru VM (which runs on RISC-V), you need:

  1. System dependencies
  2. The Thru RISC-V toolchain
  3. The Thru C SDK

1. System Dependencies (Linux / Codespaces / WSL)

sudo apt update
sudo apt install -y \
build-essential \
pkg-config \
libssl-dev \
gcc-riscv64-unknown-elf

2. Install the Thru Toolchain

thru-cli dev toolchain install

3. Install the Thru C SDK

thru-cli dev sdk install c

4. Verify Install

ls ~/.thru/sdk
which riscv64-unknown-elf-gcc

Expected output:

c toolchain
/usr/bin/riscv64-unknown-elf-gcc

CREATE YOUR PROGRAM

1. Create the Makefile (GNUmakefile)

The Makefile tells the compiler how to build your project. Create a file named GNUmakefile in your root directory:

## Explicit configuration for the Thru SDK buildTHRU_HOME := $(HOME)/.thru
BASEDIR := $(CURDIR)/build
THRU_C_SDK_DIR := $(THRU_HOME)/sdk/c/thru-sdk
THRU_RISCV_TOOLCHAIN := $(THRU_HOME)/sdk/toolchain
exportTHRU_HOMEexportTHRU_RISCV_TOOLCHAINexportPATH := $(THRU_RISCV_TOOLCHAIN)/bin:$(PATH)include$(THRU_C_SDK_DIR)/thru_c_program.mk

2. Create the Header File (examples/tn_counter.h)

This file defines the "shape" of your data and instructions.

#ifndefTN_COUNTER_H#defineTN_COUNTER_H#include<thru-sdk/c/tn_sdk.h>#defineTN_COUNTER_ERR_INVALID_INSTRUCTION 0x1000UL
#defineTN_COUNTER_INSTRUCTION_CREATE (0U)
#defineTN_COUNTER_INSTRUCTION_INCREMENT (1U)
typedefstruct __attribute__((packed)) {
uintinstruction_type;
ushortaccount_index;
ucharcounter_program_seed[TN_SEED_SIZE];
uintproof_size;
} tn_counter_create_args_t;
typedefstruct __attribute__((packed)) {
ulongcounter_value;
} tn_counter_account_t;
#endif

3. Create the Logic File (examples/tn_counter.c)

This is where the actual "smart" logic of your program lives.

#include<thru-sdk/c/tn_sdk.h>#include"tn_counter.h"TSDK_ENTRYPOINT_FNvoidstart(ucharconst*data, ulongsize) {
if (size<sizeof(uint)) tsdk_revert(TN_COUNTER_ERR_INVALID_INSTRUCTION);
uintconst*type= (uintconst*)data;
if (*type==TN_COUNTER_INSTRUCTION_CREATE) {
// Handle initializationtsdk_return(TSDK_SUCCESS);
} else {
tsdk_revert(TN_COUNTER_ERR_INVALID_INSTRUCTION);
}
}

INSTALL TOOLCHAIN & SDK

...commands...


⚠️ Alphanet RPC Notice

Thru currently operates on Alphanet. You may occasionally encounter errors such as:

  • service is currently unavailable
  • transaction rejected
  • Parse failed

These are network-side issues and NOT caused by your setup. If this happens:

  • Wait 1–2 minutes
  • Retry the command

⚠️ Important
Before building, ensure the RISC-V toolchain is exposed to make:

export THRU_HOME=$HOME/.thru
export THRU_RISCV_TOOLCHAIN=$THRU_HOME/sdk/toolchain
export PATH=$THRU_RISCV_TOOLCHAIN/bin:$PATH

COMPILE AND DEPLOY

1. Compile

rm -rf build
make

⚠️ Note Do not run make clean. The Thru C SDK may error during make clean even on a valid setup. To reset the build state, delete the build/ directory instead.

2. Deploy

Deploy your compiled program to the Thru blockchain:

thru-cli program create my_counter ./build/thruvm/bin/tn_counter_program_c.bin

🔍 VERIFY YOUR WORK

Visit scan.thru.org and paste your Program ID to see your program live on the blockchain!


🤝 CONNECT WITH ME

If you found this guide helpful, feel free to reach out!

Thanks for using my guide! Built with ❤️ for the Thru Community.

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

HOW TO CREATE A C COUNTER PROGRAM ON THRU

This repository is a comprehensive, beginner-friendly guide to building your first C program on the Thru blockchain. Whether you are a seasoned developer or just starting out, this guide will walk you through every step of the process.


CLONE THE REPOSITORY

Start by cloning this repository and navigating into the project directory:

git clone https://github.com/namedfarouk/thru-c-tutorial.git
cd thru-c-tutorial

🛠️ SETUP ENVIRONMENT

1. Install Dependencies

Open your terminal and run the following command to install the core build tools:

sudo apt update && sudo apt install -y build-essential pkg-config libssl-dev protobuf-compiler libclang-dev clang npm

2. Install Buf CLI

Thru uses Buf for protocol buffers. Install it globally via npm:

sudo npm install -g @bufbuild/buf

3. Install Rust

The Thru CLI is built with Rust. Install the Rust toolchain:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Press 1 to proceed with the default installationsource$HOME/.cargo/env

4. Install Thru CLI

Now, install the official Thru command-line interface:

cargo install thru-cli --locked

Note: We use --locked to ensure we use the exact versions of dependencies intended by the developers, avoiding version conflicts.


INITIALIZE WALLET & ACCOUNT

1. Create Directories

mkdir -p ~/.thru/cli

2. Generate Wallet

thru-cli keys generate default

🌐 RPC CONFIGURATION (REQUIRED)

By default, the Thru CLI may be configured to use a local RPC endpoint (127.0.0.1), which will not work unless you are running a local Thru node.

For this guide, you should use the Thru Alphanet RPC.

Edit the Thru CLI config file

nano ~/.thru/cli/config.yaml

Update [rpc_base_url]

Change this:

rpc_base_url: http://127.0.0.1:8472

To this:

rpc_base_url: https://rest.alphanet.thruput.org

Save and exit the file.

3. Create and Fund Account

This command will set up your default account on the Thru network:

thru-cli account create default

INSTALL TOOLCHAIN & SDK

To compile C code for the Thru VM (which runs on RISC-V), you need:

  1. System dependencies
  2. The Thru RISC-V toolchain
  3. The Thru C SDK

1. System Dependencies (Linux / Codespaces / WSL)

sudo apt update
sudo apt install -y \
build-essential \
pkg-config \
libssl-dev \
gcc-riscv64-unknown-elf

2. Install the Thru Toolchain

thru-cli dev toolchain install

3. Install the Thru C SDK

thru-cli dev sdk install c

4. Verify Install

ls ~/.thru/sdk
which riscv64-unknown-elf-gcc

Expected output:

c toolchain
/usr/bin/riscv64-unknown-elf-gcc

CREATE YOUR PROGRAM

1. Create the Makefile (GNUmakefile)

The Makefile tells the compiler how to build your project. Create a file named GNUmakefile in your root directory:

## Explicit configuration for the Thru SDK buildTHRU_HOME := $(HOME)/.thru
BASEDIR := $(CURDIR)/build
THRU_C_SDK_DIR := $(THRU_HOME)/sdk/c/thru-sdk
THRU_RISCV_TOOLCHAIN := $(THRU_HOME)/sdk/toolchain
exportTHRU_HOMEexportTHRU_RISCV_TOOLCHAINexportPATH := $(THRU_RISCV_TOOLCHAIN)/bin:$(PATH)include$(THRU_C_SDK_DIR)/thru_c_program.mk

2. Create the Header File (examples/tn_counter.h)

This file defines the "shape" of your data and instructions.

#ifndefTN_COUNTER_H#defineTN_COUNTER_H#include<thru-sdk/c/tn_sdk.h>#defineTN_COUNTER_ERR_INVALID_INSTRUCTION 0x1000UL
#defineTN_COUNTER_INSTRUCTION_CREATE (0U)
#defineTN_COUNTER_INSTRUCTION_INCREMENT (1U)
typedefstruct __attribute__((packed)) {
uintinstruction_type;
ushortaccount_index;
ucharcounter_program_seed[TN_SEED_SIZE];
uintproof_size;
} tn_counter_create_args_t;
typedefstruct __attribute__((packed)) {
ulongcounter_value;
} tn_counter_account_t;
#endif

3. Create the Logic File (examples/tn_counter.c)

This is where the actual "smart" logic of your program lives.

#include<thru-sdk/c/tn_sdk.h>#include"tn_counter.h"TSDK_ENTRYPOINT_FNvoidstart(ucharconst*data, ulongsize) {
if (size<sizeof(uint)) tsdk_revert(TN_COUNTER_ERR_INVALID_INSTRUCTION);
uintconst*type= (uintconst*)data;
if (*type==TN_COUNTER_INSTRUCTION_CREATE) {
// Handle initializationtsdk_return(TSDK_SUCCESS);
} else {
tsdk_revert(TN_COUNTER_ERR_INVALID_INSTRUCTION);
}
}

INSTALL TOOLCHAIN & SDK

...commands...


⚠️ Alphanet RPC Notice

Thru currently operates on Alphanet. You may occasionally encounter errors such as:

  • service is currently unavailable
  • transaction rejected
  • Parse failed

These are network-side issues and NOT caused by your setup. If this happens:

  • Wait 1–2 minutes
  • Retry the command

⚠️ Important
Before building, ensure the RISC-V toolchain is exposed to make:

export THRU_HOME=$HOME/.thru
export THRU_RISCV_TOOLCHAIN=$THRU_HOME/sdk/toolchain
export PATH=$THRU_RISCV_TOOLCHAIN/bin:$PATH

COMPILE AND DEPLOY

1. Compile

rm -rf build
make

⚠️ Note Do not run make clean. The Thru C SDK may error during make clean even on a valid setup. To reset the build state, delete the build/ directory instead.

2. Deploy

Deploy your compiled program to the Thru blockchain:

thru-cli program create my_counter ./build/thruvm/bin/tn_counter_program_c.bin

🔍 VERIFY YOUR WORK

Visit scan.thru.org and paste your Program ID to see your program live on the blockchain!


🤝 CONNECT WITH ME

If you found this guide helpful, feel free to reach out!

Thanks for using my guide! Built with ❤️ for the Thru Community.

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages