Calling a View
The following snippet shows how you can call the view function getString of the smart contract solotutorial without
parameters:
res, err := chain.CallView("example1", "getString")
The call returns a collection of key/value pairs res and an error result err in the typical Go fashion.
The basic principle of calling a view is similar to sending a request to the smart contract. The essential difference is that calling a view does not constitute an asynchronous transaction; it is just a direct synchronous call to the view entry point exposed by the smart contract.
Therefore, calling a view does not involve any token transfers. Sending a request (either on-ledger or off-ledger) to a view entry point will result in an exception, returning all attached tokens to the sender minus fees (if any).
Views are used to retrieve information about the smart contract's state, for example, to display on a website. Certain
Solo methods such as chain.GetInfo, chain.GetGasFeePolicy, and chain.L2Assets call views of
the core smart contracts behind the scenes to retrieve the information
about the chain or a specific smart contract.
Decoding Results Returned by PostRequestSync and CallView
The following is a specific technicality of the Go environment of Solo.
The result returned by the call to an entry point from the Solo environment is an instance of
the dict.Dict type, which is essentially a
map of []byte key/value pairs, defined as:
type Dict map[kv.Key][]byte
Dict is also an implementation of
the kv.KVStore interface. The kv package and
subpackages provide many useful functions to work with the Dict type.
Both view and non-view entry points can produce results. In normal operation, retrieving the result of an on-ledger request is impossible since it is an asynchronous operation.
However, in the Solo environment, the call to PostRequestSync is synchronous, allowing the caller to inspect the
result.
This is a convenient difference between the mocked Solo environment and the distributed ledger used by Wasp nodes.
You can use it to make assertions about the results of a call in the tests.
In the example above, res is a dictionary where keys and values are binary slices. The getString view returns the
value under the "str" key, and the value is a string encoded as a byte slice. The codec package provides functions
to encode/decode frequently used data types, including string. The following is a commonly used pattern to get a value
from the Dict and decode it:
var value string = codec.MustDecodeString(res["str"])
