---
sidebar_position: 5
description: Start and experiment with your nameservice blockchain and nameservice module.
---

# Play With Your Blockchain

If you haven't already, start a blockchain node in development:

```bash
ignite chain serve -r
```

The optional `-r` flag is useful in development mode since it resets the blockchain's state if it has been started before. 

After the `serve` command has finished building the blockchain, a `nameserviced` binary is installed by default in the `~/go/bin` directory.

The terminal window where the chain is started must remain open, so open a second terminal window to use `nameserviced` to run commands at the command line.

## Buy a New Name

Purchase a new name using the `buy-name` command. The name is `foo` and the bid is `20token`. 

In the keeper for the buy name transaction, you added code to the `msg_server_buy_name.go` file that hard-coded the minimum bid to `10token`. Any bid lower than that amount results in a rejected purchase. 

```bash
nameserviced tx nameservice buy-name foo 20token --from alice
```

where:

- buy-name is the command that accepts two arguments
- foo is the name 
- 20token is the bid 
- the `--from alice` flag specifies the user account that signs and broadcasts the transaction

This `buy-name` command creates a transaction and prompts the user `alice` to sign and broadcast the transaction.

Here is what an unsigned transaction looks like:

```json
{
  "body": {
    "messages": [
      {
        "@type": "/username.nameservice.nameservice.MsgBuyName",
        "creator": "cosmos1p0fprxtpk497jvczexp96sy2w43hupeph9km5d",
        "name": "foo",
        "bid": "20token"
      }
    ],
    "memo": "",
    "timeout_height": "0",
    "extension_options": [],
    "non_critical_extension_options": []
  },
  "auth_info": {
    "signer_infos": [],
    "fee": { "amount": [], "gas_limit": "200000", "payer": "", "granter": "" }
  },
  "signatures": []
}
```

### Buy Name Transaction Details

Look at the transaction details:

- The transaction contains only one message: `MsgBuyName`.
- The message `@type` matches the package name of the corresponding proto file, `proto/nameservice/tx.proto`. 
- The `creator` field is populated automatically with the address of the account broadcasting the transaction.
- The local account `alice` address is `cosmos1p0f...km5d`.
- Values of `name` and `bid` are passed as CLI arguments.

After the transaction is broadcast and included in a block, the blockchain returns a response where `"code": 0` means the transaction was successfully processed.

```json
{
  "height": "658",
  "txhash": "EDC1842BE4B596DDD9E2D34F2E372354F9BA5F6D2E4B3F1C2664F4FF05D433B7",
  "codespace": "",
  "code": 0,
  "data": "0A090A074275794E616D65",
  "raw_log": "[{\"events\":[{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"BuyName\"}]}]}]",
  "logs": [
    {
      "msg_index": 0,
      "log": "",
      "events": [
        {
          "type": "message",
          "attributes": [{ "key": "action", "value": "BuyName" }]
        }
      ]
    }
  ],
  "info": "",
  "gas_wanted": "200000",
  "gas_used": "47954",
  "tx": null,
  "timestamp": ""
}
```

## Query the Chain for a List of Names

Query the chain for a list of name and corresponding values. Query commands don't need the `--from` flag, because they don't broadcast transactions and make only free requests.

```bash
nameserviced q nameservice list-whois
```

The response confirms that the name `foo` was successfully purchased by `alice` and the current `price` is set to `20token`.

```yaml
Whois:
- creator: cosmos1p0fprxtpk497jvczexp96sy2w43hupeph9km5d
  index: foo
  name: foo
  price: 20token
  value: ""
pagination:
  next_key: null
  total: "0"
```

## Set a Value to the Name

Now that `alice` is an owner of the name, she can set the value to anything she wants. Use the `set-name` command to set the value to `bar`:

```bash
nameserviced tx nameservice set-name foo bar --from alice
```

Query for a list of names again:

```bash
nameserviced q nameservice list-whois 
```

The response shows that `name` is now `foo`.

```yaml
Whois:
- creator: cosmos1p0fprxtpk497jvczexp96sy2w43hupeph9km5d
  index: foo
  name: foo
  price: 20token
  value: bar
pagination:
  next_key: null
  total: "0"
```

## Buy an Existing Name

Use the `bob` account to purchase an existing name from `alice`. A successful bid requires that the buy price is higher than the current value of `20token`. 

```bash
nameserviced tx nameservice buy-name foo 40token --from bob
```

In this `buy-name` command, the bid is updated to the latest bid of `40token` and the `--from bob` flag specifies that the transaction is signed by the `bob` address.

Query for a list of names again:

```bash
nameserviced q nameservice list-whois 
```

The response shows a different creator address than `alice` (it's now the address for `bob`) and the `price` is now `40token`.

```yaml
Whois:
- creator: cosmos1ku6sqpk9rgwgx98u2gs9c05aa9wrps969g0wy5
  index: foo
  name: foo
  price: 40token
  value: bar
pagination:
  next_key: null
  total: "0"
```

## Query the Bank Balance

Use the following command to see how the `alice` bank balance has changed after this transaction:

```bash
nameserviced q bank balances $(nameserviced keys show alice -a)
```

## Test an Unauthorized Transaction

Try updating the value by broadcasting a transaction from the `alice` account: 

```bash
nameserviced tx nameservice set-name foo qoo --from alice
```

An error occurs because `alice` sold the name in a previous transaction. The results show that `alice` is not the owner of the name and is therefore not authorized to change the value.

```json
{
  "height": "981",
  "txhash": "8E9951EDC5C9D76C2164BE9572B336B13CCF46653F45F54B2C1FEA702389FAE8",
  "codespace": "sdk",
  "code": 4,
  "data": "",
  "raw_log": "failed to execute message; message index: 0: Incorrect Owner: unauthorized",
  "logs": [],
  "info": "",
  "gas_wanted": "200000",
  "gas_used": "39214",
  "tx": null,
  "timestamp": ""
}
```

```yaml
Whois:
- creator: cosmos1ku6sqpk9rgwgx98u2gs9c05aa9wrps969g0wy5
  index: foo
  name: foo
  price: 40token
  value: bar
pagination:
  next_key: null
  total: "0"
```

## Conclusion

Congratulations 🎉. You have created the nameservice module and the nameservice application.

You successfully completed these steps:

- Learned how to work with module dependencies
- Use several scaffolding methods
- Learned about Cosmos SDK types and functions
- Used the CLI to broadcast transactions , and so much more

You are now prepared to continue your journey to learn about escrow accounts and IBC.
