13个版本 (1个稳定版)

2.0.0 2024年6月5日
2.0.0-rc.12024年5月28日
0.8.0 2023年11月13日
0.7.0 2023年4月23日
0.4.2 2022年9月12日

#16 in #msg

每月44次下载

Apache-2.0

86KB
1.5K SLoC

Nois标准库

nois on crates.io nois on docs.rs

使用此库将您的应用程序与nois代理集成。

存储代理地址

#[entry_point]
pub fn instantiate(
    deps: DepsMut,
    _env: Env,
    _info: MessageInfo,
    msg: InstantiateMsg,
) -> Result<Response, ContractError> {
    let nois_proxy_addr = deps
        .api
        .addr_validate(&msg.nois_proxy)
        .map_err(|_| ContractError::InvalidProxyAddress)?;
    NOIS_PROXY.save(deps.storage, &nois_proxy_addr)?;
    Ok(Response::new()
        .add_attribute("action", "instantiate")
        .add_attribute("nois_proxy", msg.nois_proxy))
}

发送请求

use nois::ProxyExecuteMsg;

pub fn execute_estimate_pi(
    deps: DepsMut,
    _env: Env,
    _info: MessageInfo,
    job_id: String,
) -> Result<Response, ContractError> {
    let nois_proxy = NOIS_PROXY.load(deps.storage)?; // Nois proxy address stored in init

    let res = Response::new().add_message(WasmMsg::Execute {
        contract_addr: nois_proxy.into(),
        msg: to_binary(&ProxyExecuteMsg::GetNextRandomness { job_id })?,
        funds: vec![],
    });
    Ok(res)
}

处理回调

创建一个名为 ExecuteMsg 的枚举情况,称为 Receive

use cosmwasm_schema::{cw_serde, QueryResponses};

use nois::NoisCallback;

#[cw_serde]
pub enum ExecuteMsg {
    // ...

    NoisReceive {
        callback: NoisCallback,
    },
}

并使用它

#[entry_point]
pub fn execute(
    deps: DepsMut,
    env: Env,
    info: MessageInfo,
    msg: ExecuteMsg,
) -> Result<Response, ContractError> {
    match msg {
        // ...

        ExecuteMsg::NoisReceive { callback } => execute_nois_receive(deps, env, info, callback),
    }
}

// ...

pub fn execute_nois_receive(
    deps: DepsMut,
    _env: Env,
    _info: MessageInfo,
    callback: NoisCallback,
) -> Result<Response, ContractError> {
    let proxy = NOIS_PROXY.load(deps.storage)?;
    ensure_eq!(info.sender, proxy, ContractError::UnauthorizedReceive);

    let NoisCallback { job_id, randomness, .. } = callback;
    let randomness: [u8; 32] = randomness
        .to_array()
        .map_err(|_| ContractError::InvalidRandomness)?;

    // use randomness 🎉
}

为JavaScript构建

Nois工具箱可以通过WebAssembly编译成JavaScript。这样,您可以模拟每个随机数值的输出。结果与使用相同工具的CosmWasm合约的结果完全一致。

为了保持JS/Wasm接口简单,模块 lib/js 中有一个包装器,它接受十六进制格式的随机数输入,并使用与JS兼容的类型和错误处理。使用wasm-bindgen创建JS/Wasm绑定。

JS与合约实现不完全匹配。差异在此处有文档记录。

合约函数 JS函数 状态 注意
nois::coinflip coinflip ✅ 已准备好 返回字符串而不是枚举
nois::roll_dice roll_dice ✅ 已准备好
nois::int_in_range int_in_range ✅ 已准备好 仅支持安全整数范围
nois::ints_in_range ints_in_range ✅ 已准备好 仅支持安全整数范围
nois::pick pick ✅ 已准备好
nois::select_from_weighted select_from_weighted ✅ 已准备好
nois::random_decimal random_decimal ✅ 已准备好 将结果Decimal编码为字符串
nois::sub_randomness sub_randomness ✅ 已准备好 接受一个 count 参数并返回一个数组而不是迭代器
nois::shuffle shuffle ✅ 已准备好

安装

我们需要这个

$ cargo install wasm-pack -f
$ wasm-pack --version
wasm-pack 0.10.3

对于Node.js

这创建了一个同步加载的CommonJS模块。

$ wasm-pack build --target nodejs -- --features js
$ node
> const { coinflip, roll_dice, random_decimal, sub_randomness, int_in_range, ints_in_range, pick, select_from_weighted, shuffle } = require('./pkg/nois');

// Round 2497992

> coinflip("c59f098f3c12b8c36ed81f5c17660c72414a1ed63467888a374af529a205c584")
'tails'

// Round 2497994

> coinflip("2267ba7356c01a58e405d4194a31bddc3fd3eb1f0a86758f7a609ba8a47420ba")
'heads'
> roll_dice("2267ba7356c01a58e405d4194a31bddc3fd3eb1f0a86758f7a609ba8a47420ba")
6
> random_decimal("2267ba7356c01a58e405d4194a31bddc3fd3eb1f0a86758f7a609ba8a47420ba")
'0.126047856387596389'
> sub_randomness("2267ba7356c01a58e405d4194a31bddc3fd3eb1f0a86758f7a609ba8a47420ba", 3)
[
  'ac7b151d67cd4263520b16e450e6d1fc01750dab80b5d8b7cdc4075c99daf80a',
  '33622b0865f1ab35142e3e63a91c25cf89311b04b9540ca15e49413a4a114ce1',
  'f08927af18d4995c28f15f07e4038407f32d966087771314b9e64b6a33a9101c'
]
> int_in_range("2267ba7356c01a58e405d4194a31bddc3fd3eb1f0a86758f7a609ba8a47420ba", 5, 9)
9
> ints_in_range("2267ba7356c01a58e405d4194a31bddc3fd3eb1f0a86758f7a609ba8a47420ba", 20, 0, 1)
[
  1, 1, 1, 0, 0, 1, 1,
  0, 0, 1, 1, 1, 1, 1,
  0, 0, 0, 0, 0, 1
]
> shuffle("2267ba7356c01a58e405d4194a31bddc3fd3eb1f0a86758f7a609ba8a47420ba", [1, 2, 3, "a", "b", true])
[ 2, 'a', 1, 'b', 3, true ]
> pick("2267ba7356c01a58e405d4194a31bddc3fd3eb1f0a86758f7a609ba8a47420ba", 4, [1, 2, 3, "a", "b", true])
[ 'a', 'b', 3, true ]
> select_from_weighted("2267ba7356c01a58e405d4194a31bddc3fd3eb1f0a86758f7a609ba8a47420ba", [["red", 20], ["blue", 70]])
'blue'

对于浏览器和其他JS环境

您需要更改目标以获取合适的包。例如。

$ wasm-pack build --target web -- --features js
$ ls ./pkg

对于浏览器。请参阅wasm-bindgen手册 了解有关目标的信息

依赖关系

~4–7.5MB
~151K SLoC