06 / 26Part 1: Define your first entityBeginner
Add your first operation
Here you build the create_book operation, which lets you add new book entries to the blockchain by changing the dApp's state.
Define the create_book operation
An operation in Rell is a public function that must be signed and that changes blockchain state, specifically the state of your dapp. Operations are the main way you interact with your dapp and modify its state.
Add the following Rell code to src/main/operations.rell:
operation create_book(isbn: text, title: text, author: text) { create book(isbn = isbn, title = title, author = author);}Breakdown of the code
operationkeyword: Declares a new operation. It behaves like a public function you can call to perform actions that modify your dapp's state.- Parameters:
create_bookacceptsisbn,title, andauthor, which map to the attributes of thebookentity. createcommand: Within the operation,createadds a new book entry to the dApp's state from the supplied parameters.
Understanding the process
The following shows, at a high level, what occurs when you run create_book:
The diagram below shows the transaction flow in more detail:
- User signs a transaction: The user starts a transaction that calls
create_book. - Transaction validation: A Chromia node checks the transaction and passes it on to the blockchain.
- State update:
create_bookwrites a new book entry to the dApp's state. - Blockchain confirmation: Once confirmed, the transaction becomes part of the blockchain and the dApp's state reflects the change.
Add unit tests
Tests confirm that your operations behave correctly. Next, you add one for create_book.
Update src/test/book_review_test.rell with the test code so the file matches the following:
@test module;import main.{ book, create_book };function test_add_book() { rell.test.tx() .op(create_book("123", "Book1", "Author1")) .op(create_book("124", "Book2", "Author2")) .run(); val all_books = book @* { }; assert_equals(all_books.size(), 2); assert_equals(all_books[0].title, "Book1"); assert_equals(all_books[0].author, "Author1");}Breakdown of the test
- Transaction creation:
rell.test.tx()builds a test transaction. - Adding operations: The transaction receives two
create_bookoperations. - Execution:
run()runs the transaction. - Assertions: The test fetches every book and checks that exactly two entries exist, each with the expected attributes.
Running the test
From your project folder, run this command in the terminal:
chr testTesting on a local node
You can also try create_book against a local Chromia node:
-
Start a local Chromia node: In your terminal, run:
shell chr node start -
Add a book: Open a separate terminal window or tab and run:
shell chr tx --await create_book "ISBN1234" "'1984'" "George Orwell"
You should see:
transaction with rid TxRid(rid=<RID>) was posted CONFIRMEDThis output means the transaction is now on the blockchain and the book table holds a new row containing the book's data.