Though you have direct access to the table data through get_table_rows
(as discussed in the
reading state section of the web applications chapter),
the preferred way to read data from a smart contract is through read-only actions.
A read-only action is an action that does not modify the state of the blockchain.
It is a way to query data from a smart contract without changing its state, while also allowing the contract developer to define alternative structures for the data returned that isn't just the raw table data.
You create these in a similar way to regular actions, but you need to specify that the action is read-only.
[[eosio::action, eosio::read_only]]
bool isactive(name user) {
// Your logic here
return true;
}
You shouldn't use the normal push_transaction
or send_transaction
API methods to call a read-only action.
Read-only actions do not need authorization arrays, or signatures, so to take advantage of this you can
use the send_read_only_transaction
API method instead.
If you are using Wharfkit (and you should be), you can call a read-only action like this:
import { APIClient, Chains } from "@wharfkit/antelope"
import { ContractKit } from "@wharfkit/contract"
const contractKit = new ContractKit({
client: new APIClient('https://history.globalforce.io'),
})
const contract = await contractKit.load("some.contract")
// .readonly(action, data?)
const result = await contract.readonly('isactive', {
user: 'some.user'
});
Read-only actions can return complex data structures, not just simple types like bool
or uint64_t
.
struct Result {
name user;
uint64_t balance;
std::string status;
};
[[eosio::action, eosio::read_only]]
Result getuser(name user) {
return Result{user, 1000, "active"};
}
Read-only actions have some limitations:
However, they also have benefits:
Though you have direct access to the table data through `get_table_rows` (as discussed in the [reading state section](../web-applications/05_reading-state) of