#virtual-machine #contract #smart-contracts #virtual #machine #smart #wasm

nightly no-std piecrust-uplink

Build smart contracts directly on top of Dusk’s piecrust virtual machine

19 releases (10 breaking)

0.11.0 Feb 14, 2024
0.10.0 Jan 24, 2024
0.9.0 Dec 13, 2023
0.8.0 Oct 11, 2023
0.1.0 Mar 15, 2023

#73 in #smart

Download history 22/week @ 2023-12-17 9/week @ 2023-12-24 11/week @ 2024-01-07 76/week @ 2024-01-14 38/week @ 2024-01-21 185/week @ 2024-01-28 299/week @ 2024-02-04 773/week @ 2024-02-11 1122/week @ 2024-02-18 542/week @ 2024-02-25 99/week @ 2024-03-03 91/week @ 2024-03-10 68/week @ 2024-03-17 44/week @ 2024-03-24 256/week @ 2024-03-31

472 downloads per month
Used in 6 crates (3 directly)

MPL-2.0 license

31KB
568 lines

π-crust Uplink

Repository Build Status Documentation

Piecrust Uplink is the library that allows you to build smart contracts directly on top of Dusk's Piecrust virtual machine.

Usage

The library allows users of the contract platform to manage the interface and state with the host environment of the contracts. The example below describes a barebones contract. For more detailed examples, see the contracts folder.

Add piecrust_uplink as a dependency to your contract project:

cargo install piecrust_uplink

To make use of uplink, import the dependency in your project and mark it as no_std:

#![no_std]

use piecrust_uplink as uplink;

To attach state to a contract:

/// Struct that describe the state for your contract
pub struct Counter {
    value: i64,
};

/// State of the contract
static mut STATE: Counter = Counter { value: 0x1 };

To define logic for your contract, define an implementation:

impl Counter {
    pub fn read_value(&self) -> i64 {
        self.value
    }

    pub fn increment(&mut self) {
        let value = self.value + 1;
    }
}

Read and write operations need to be exposed to the host. Add the following below the implementation:

unsafe fn read_value(arg_len: u32) -> u32 {
    uplink::wrap_call(arg_len, |_: ()| STATE.read_value())
}

#[no_mangle]
unsafe fn increment(arg_len: u32) -> u32 {
    uplink::wrap_call(arg_len, |panic: bool| STATE.increment(panic))
}

Release History

To see the release history for this crate, please see the CHANGELOG file.

License

This code is licensed under the Mozilla Public License Version 2.0 (MPL-2.0). Please see the LICENSE for further details.

Contribute

If you want to contribute to this project, please check the CONTRIBUTING file.

Dependencies

~4–13MB
~149K SLoC