13个版本 (1个稳定版)
2.0.0 | 2024年6月5日 |
---|---|
2.0.0-rc.1 | 2024年5月28日 |
0.8.0 | 2023年11月13日 |
0.7.0 | 2023年4月23日 |
0.4.2 | 2022年9月12日 |
#16 in #msg
每月44次下载
86KB
1.5K SLoC
Nois标准库
使用此库将您的应用程序与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