Expand description
Piecrust Uplink is the crate for writing WASM smart contracts in Rust targeting the Piecrust virtual machine.
A smart contract is a program exposing a collection of functions that operate on a shared state. These functions can perform a variety of operations, such as reading or modifying the state, or interacting with the host.
§State Model and ABI
Contracts targeting the Piecrust VM represent their state as a WASM memory. The contract is free to represent its data as it sees fit, and may allocate at will.
To communicate with the host, both the contract and the host can emplace data in a special region of this memory called the argument buffer. The argument buffer is used as both the input from the host and as the output of the contract. All functions exposed by the contract must follow the convention:
// A function compatible with the piecrust ABI takes in the number of bytes
// written by the host to the argument buffer and returns the number of
// bytes written by the contract.
uint32_t fname(uint32_t arg_len);The contract also has some functions available to it, offered by the host through WASM imports. Examples of these functions include, but are not limited to:
The functions in this crate are wrappers around a particular way of calling the WASM imports. Take a look at the externs for a full view of what is available.
§Examples
Some of the contracts used for testing purposes function as good examples. Take a look at the contracts/ directory.
§Features
By default, this crate will include no features and build only the types and
functions available when the ABI is not present. To write a contract one
must use the abi feature:
abifor writing contractsdlmallocto using the builtin allocatordebugfor writing contracts with debug capabilities such as thedebug!macro, and logging panics to stdout
Modules§
- arg_buf
abi
Macros§
- debug
abianddebug - Macro to format and send debug output to the host
Structs§
- Argbuf
Writer abi - A small struct that can
fmt::Writeto the argument buffer. - Contract
Id - ID to identify the wasm contracts after they have been deployed
- Contract
IdResolver - The resolver for an archived
ContractId - Event
- And event emitted by a contract.
Enums§
- Archived
Contract Error - An archived
ContractError - Contract
Error - The error possibly returned on an inter-contract-call.
- Contract
Error Resolver - The resolver for an archived
ContractError
Constants§
- ARGBUF_
LEN - The size of the argument buffer in bytes
- CONTRACT_
ID_ BYTES - The length of
ContractIdin bytes - SCRATCH_
BUF_ BYTES - How many bytes to use for scratch space when serializing
Functions§
- call
abi - Calls a
contract’sfn_namefunction with the given argumentfn_arg. The contract will have93%of the remaining gas available to spend. - call_
raw abi - Calls the function with name
fn_nameof the givencontractusingfn_argas argument. - call_
raw_ with_ limit abi - Calls the function with name
fn_nameof the givencontractusingfn_argas argument, allowing it to spend the givengas_limit. - call_
with_ limit abi - Calls a
contract’sfn_namefunction with the given argumentfn_arg, allowing it to spend the givengas_limit. - caller
abi - Returns the ID of the calling contract, or
Noneif this is the first contract to be called. - callstack
abi - Returns IDs of all calling contracts present in the calling stack
- emit
abi - Emits an event with the given data, serializing it using
rkyv. - emit_
raw abi - Emits an event with the given data.
- feed
abi - Feeds the host with data, serializing it using
rkyv. - feed_
raw abi - Feeds the host with data.
- hdebug⚠
- host_
query abi - Execute some code that the host provides under the given name.
- limit
abi - Returns the gas limit with which the contact was called.
- meta_
data abi - Returns data made available by the host under the given name.
- owner
abi - Return the given contract’s owner, if the contract exists.
- self_id
abi - Return the current contract’s id.
- self_
owner abi - Returns the current contract’s owner.
- spent
abi - Returns the amount of gas the contact has spent.
- wrap_
call abi - Wrap a call with its respective (de)serializers. Checks integrity of the arguments.
- wrap_
call_ unchecked abi - Wrap a call with its respective (de)serializers. Does not check the integrity of arguments.
Type Aliases§
- Standard
BufSerializer - Type with
rkyvserialization capabilities for specific types.