WAX Guestbook Smart Contract
Tags: cpp, blockchain, wax, tutorial
Published: 2023-07-26 03:07:16

## Introduction

In this section, we will dive deeper into WAX Smart Contracts but creating a more complex contract that includes storing data on the blockchain and providing actions for accounts to call on the blockchain.

## Writing WAX Smart Contracts

WAX Smart Contracts are written in C++ and typically include header filers, type definitions, and actions. The contract definition may also include persistent data, permissions, and notify hooks.

The **header file** will contain our action definitions and our persistent blockchain data definitions.

The **source file** will contain the actual code implementations for the actions we defined in the header file.

We’ve been using the term action, but what is an action? **Actions** define the core functionality of our smart contracts. When an action runs, events are written to the WAX blockchain.

A transaction is a list of one or more actions executed in the same block. If one of our actions calls another actions, they will show up in the same transaction.

Let’s move onto a real example to see how this all comes together.

## Guestbook Example

For the rest of this chapter, we are going to create a Smart Contract called a Guestbook. Accounts will be able to call an action called `sign` with their name and a message that we will store on the blockchain for all to see.

As before, let’s start with creating the empty project:

```bash
cd wax
eosio-init -project guestbook
```

Then open the project folder in your favorite editor. I’ll be using VSCode throughout these tutorials.

Navigate to `guestbook/include/guestbook.hpp` and we can start defining some actions for our contract.

To start, we can replace the file with the following:

```cpp
#include <eosio/eosio.hpp>
using namespace eosio;
using namespace std;

CONTRACT guestbook : public contract {
   public:
      using contract::contract;

      ACTION sign( name nm, string memo );

   private:
      TABLE guestbook_s {
         uint64_t id;
         name user;
         string memo;
         uint64_t timestamp;

         uint64_t primary_key() const { return id; }
      };
      typedef multi_index<name("guestbook"), guestbook_s> guestbook_t;
      guestbook_t guestbook = guestbook_t(get_self(), get_self().value);
};
```

The `#include` line tells the compile that we will be using definitions defined by eosio. Then we will use the eosio and standard namespaces within our code.

The line `CONTRACT guestbook : public contract {` is the start of our contract definition.

The only public action we define is `ACTION sign( name nm, string memo );`. This is just the header definition, we will fill in the implementation later. This is the method others will call on this contract to add their name and memo to the smart contract’s guestbook table.

The private section of the contract defines the guestbook struct (which is what the `_s` suffix in the name stands for). This defines the data we will store in the smart contract’s table on the blockchain. The next two lines define the table on the blockchain.

## Implementing the sign method

Next, let’s implement the sign method in `guestbook/src/guestbook.cpp`:

```cpp
#include <eosio/eosio.hpp>
#include <eosio/system.hpp>
#include <guestbook.hpp>
using namespace eosio;
using namespace std;

ACTION guestbook::sign( name nm, string memo ) {
   require_auth(nm);

   guestbook.emplace(nm, [&](auto &row) {
     row.id = guestbook.available_primary_key();
     row.user = nm;
     row.memo = memo;
     row.timestamp = current_time_point().sec_since_epoch();
   });
}
```

Here we check that the caller is the same as the `name` given using `require_auth(nm)`, verifying that the current caller has the required authorization to act as that name. This allows chains of authority to act on behalf of signing as other names, which gives more flexibility to the caller on how they sign the contract.

The next section `guestbook.emplace` is where we actually add a row to the guestbook with a unique id, the name of the user, the memo they set, and the timestamp of when it was created.

## Compiling

Let’s compile our contract:

```bash
( cd guestbook/build ; cmake .. ; make )
```

You should have a successfully compiled contract!

## Conclusion

In this section, we covered writing and compiling a simple Smart Contract that stores data on the WAX blockchain.

In the upcoming section, we will deploy this contract to our local blockchain, interact with it, and then deploy to the WAX testnet.

Next post: [Deploying the WAX Guestbook Contract Locally](https://dev.to/idmontie/deploying-the-wax-guestbook-contract-locally-289o)

## E-book

Get this entire WAX tutorial as an [e-book on Amazon](https://amzn.to/3ZjwaK7).

## Additional links

- Github: https://github.com/CapsuleCat/wax-nft-tutorial/tree/main/guestbook
- Photo by [Shubham Dhage](https://unsplash.com/@theshubhamdhage?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/photos/IlUq1ruyv0Q?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)