github.com/badrootd/nibiru-cometbft@v0.37.5-0.20240307173500-2a75559eee9b/docs/app-dev/getting-started.md (about)

     1  ---
     2  order: 1
     3  ---
     4  
     5  # Getting Started
     6  
     7  ## First CometBFT App
     8  
     9  As a general purpose blockchain engine, CometBFT is agnostic to the
    10  application you want to run. So, to run a complete blockchain that does
    11  something useful, you must start two programs: one is CometBFT,
    12  the other is your application, which can be written in any programming
    13  language. Recall from [the intro to
    14  ABCI](../introduction/what-is-cometbft.md#abci-overview) that CometBFT
    15  handles all the p2p and consensus stuff, and just forwards transactions to the
    16  application when they need to be validated, or when they're ready to be
    17  executed and committed.
    18  
    19  In this guide, we show you some examples of how to run an application
    20  using CometBFT.
    21  
    22  ### Install
    23  
    24  The first apps we will work with are written in Go. To install them, you
    25  need to [install Go](https://golang.org/doc/install), put
    26  `$GOPATH/bin` in your `$PATH` and enable go modules. If you use `bash`, 
    27  follow these instructions:
    28  
    29  ```bash
    30  echo export GOPATH=\"\$HOME/go\" >> ~/.bash_profile
    31  echo export PATH=\"\$PATH:\$GOPATH/bin\" >> ~/.bash_profile
    32  ```
    33  
    34  Then run
    35  
    36  ```bash
    37  go get github.com/cometbft/cometbft
    38  cd $GOPATH/src/github.com/cometbft/cometbft
    39  make install_abci
    40  ```
    41  
    42  Now you should have the `abci-cli` installed; run `abci-cli` to see the list of commands:
    43  
    44  ```
    45  Usage:
    46    abci-cli [command]
    47  
    48  Available Commands:
    49    batch            run a batch of abci commands against an application
    50    check_tx         validate a transaction
    51    commit           commit the application state and return the Merkle root hash
    52    completion       Generate the autocompletion script for the specified shell
    53    console          start an interactive ABCI console for multiple commands
    54    deliver_tx       deliver a new transaction to the application
    55    echo             have the application echo a message
    56    help             Help about any command
    57    info             get some info about the application
    58    kvstore          ABCI demo example
    59    prepare_proposal prepare proposal
    60    process_proposal process proposal
    61    query            query the application state
    62    test             run integration tests
    63    version          print ABCI console version
    64  
    65  Flags:
    66        --abci string        either socket or grpc (default "socket")
    67        --address string     address of application socket (default "tcp://0.0.0.0:26658")
    68    -h, --help               help for abci-cli
    69        --log_level string   set the logger level (default "debug")
    70    -v, --verbose            print the command and results as if it were a console session
    71  
    72  Use "abci-cli [command] --help" for more information about a command.
    73  ```
    74  
    75  You'll notice the `kvstore` command, an example application written in Go.
    76  
    77  Now, let's run an app!
    78  
    79  ## KVStore - A First Example
    80  
    81  The kvstore app is a [Merkle
    82  tree](https://en.wikipedia.org/wiki/Merkle_tree) that just stores all
    83  transactions. If the transaction contains an `=`, e.g. `key=value`, then
    84  the `value` is stored under the `key` in the Merkle tree. Otherwise, the
    85  full transaction bytes are stored as the key and the value.
    86  
    87  Let's start a kvstore application.
    88  
    89  ```sh
    90  abci-cli kvstore
    91  ```
    92  
    93  In another terminal, we can start CometBFT. You should already have the
    94  CometBFT binary installed. If not, follow the steps from
    95  [here](../introduction/install.md). If you have never run CometBFT
    96  before, use:
    97  
    98  ```sh
    99  cometbft init
   100  cometbft node
   101  ```
   102  
   103  If you have used CometBFT, you may want to reset the data for a new
   104  blockchain by running `cometbft unsafe-reset-all`. Then you can run
   105  `cometbft node` to start CometBFT, and connect to the app. For more
   106  details, see [the guide on using CometBFT](../core/using-cometbft.md).
   107  
   108  You should see CometBFT making blocks! We can get the status of our
   109  CometBFT node as follows:
   110  
   111  ```sh
   112  curl -s localhost:26657/status
   113  ```
   114  
   115  The `-s` just silences `curl`. For nicer output, pipe the result into a
   116  tool like [jq](https://stedolan.github.io/jq/) or `json_pp`.
   117  
   118  Now let's send some transactions to the kvstore.
   119  
   120  ```sh
   121  curl -s 'localhost:26657/broadcast_tx_commit?tx="abcd"'
   122  ```
   123  
   124  Note the single quote (`'`) around the url, which ensures that the
   125  double quotes (`"`) are not escaped by bash. This command sent a
   126  transaction with bytes `abcd`, so `abcd` will be stored as both the key
   127  and the value in the Merkle tree. The response should look something
   128  like:
   129  
   130  ```json
   131  {
   132    "jsonrpc": "2.0",
   133    "id": "",
   134    "result": {
   135      "check_tx": {},
   136      "deliver_tx": {
   137        "tags": [
   138          {
   139            "key": "YXBwLmNyZWF0b3I=",
   140            "value": "amFl"
   141          },
   142          {
   143            "key": "YXBwLmtleQ==",
   144            "value": "YWJjZA=="
   145          }
   146        ]
   147      },
   148      "hash": "9DF66553F98DE3C26E3C3317A3E4CED54F714E39",
   149      "height": 14
   150    }
   151  }
   152  ```
   153  
   154  We can confirm that our transaction worked and the value got stored by
   155  querying the app:
   156  
   157  ```sh
   158  curl -s 'localhost:26657/abci_query?data="abcd"'
   159  ```
   160  
   161  The result should look like:
   162  
   163  ```json
   164  {
   165    "jsonrpc": "2.0",
   166    "id": "",
   167    "result": {
   168      "response": {
   169        "log": "exists",
   170        "index": "-1",
   171        "key": "YWJjZA==",
   172        "value": "YWJjZA=="
   173      }
   174    }
   175  }
   176  ```
   177  
   178  Note the `value` in the result (`YWJjZA==`); this is the base64-encoding
   179  of the ASCII of `abcd`. You can verify this in a python 2 shell by
   180  running `"YWJjZA==".decode('base64')` or in python 3 shell by running
   181  `import codecs; codecs.decode(b"YWJjZA==", 'base64').decode('ascii')`.
   182  Stay tuned for a future release that [makes this output more
   183  human-readable](https://github.com/tendermint/tendermint/issues/1794).
   184  
   185  Now let's try setting a different key and value:
   186  
   187  ```sh
   188  curl -s 'localhost:26657/broadcast_tx_commit?tx="name=satoshi"'
   189  ```
   190  
   191  Now if we query for `name`, we should get `satoshi`, or `c2F0b3NoaQ==`
   192  in base64:
   193  
   194  ```sh
   195  curl -s 'localhost:26657/abci_query?data="name"'
   196  ```
   197  
   198  Try some other transactions and queries to make sure everything is
   199  working!