重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
slot-vrng by cartridge-gg/docs
npx skills add https://github.com/cartridge-gg/docs --skill slot-vrngCartridge 的可验证随机数生成器为链上游戏提供廉价、原子化、可验证的随机性。随机数的生成和验证在单笔交易内完成。
| 网络 | 地址 |
|---|---|
| 主网 | 0x051fea4450da9d6aee758bdeba88b2f665bcbf549d2c61421aa724e9ac0ced8f |
| Sepolia 测试网 | 0x051fea4450da9d6aee758bdeba88b2f665bcbf549d2c61421aa724e9ac0ced8f |
#[starknet::interface]
trait IVrfProvider<TContractState> {
fn request_random(self: @TContractState, caller: ContractAddress, source: Source);
fn consume_random(ref self: TContractState, source: Source) -> felt252;
}
#[derive(Drop, Copy, Clone, Serde)]
pub enum Source {
Nonce: ContractAddress,
Salt: felt252,
}
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
Source::Nonce(ContractAddress): 使用地址的内部 nonce。每次请求生成不同的种子。Source::Salt(felt252): 使用提供的盐值。相同的盐值 = 相同的随机值。const VRF_PROVIDER_ADDRESS: starknet::ContractAddress =
starknet::contract_address_const::<0x051fea4450da9d6aee758bdeba88b2f665bcbf549d2c61421aa724e9ac0ced8f>();
fn roll_dice(ref self: ContractState) {
let vrf_provider = IVrfProviderDispatcher { contract_address: VRF_PROVIDER_ADDRESS };
let player_id = get_caller_address();
let random_value = vrf_provider.consume_random(Source::Nonce(player_id));
// 在游戏逻辑中使用 random_value
}
request_random 必须是多重调用中的第一个调用。Cartridge Paymaster 会使用 submit_random 和 assert_consumed 包装该多重调用。
const call = await account.execute([
// 第一步:request_random
{
contractAddress: VRF_PROVIDER_ADDRESS,
entrypoint: 'request_random',
calldata: CallData.compile({
caller: GAME_CONTRACT,
// Source::Nonce(address)
source: { type: 0, address: account.address },
// 或者 Source::Salt(felt252)
// source: { type: 1, salt: 0x123 },
}),
},
// 然后:你的游戏调用
{
contractAddress: GAME_CONTRACT,
entrypoint: 'roll_dice',
// ...
},
]);
request_random 中的 source 必须与 consume_random 中的 source 匹配。
将 vRNG 合约添加到你的控制器策略中:
const policies: Policy[] = [
// ... 你现有的策略 ...
{
target: VRF_PROVIDER_ADDRESS,
method: "request_random",
description: "允许从 VRF 提供者请求随机数",
},
];
阶段 0 假设提供者未泄露私钥且不与玩家串通。未来计划包括将提供者迁移到可信执行环境中。
每周安装量
48
代码仓库
GitHub 星标数
4
首次出现
2026年2月13日
安全审计
安装于
opencode47
codex46
github-copilot45
cursor45
kimi-cli44
gemini-cli44
Cartridge's Verifiable Random Number Generator provides cheap, atomic, verifiable randomness for onchain games. Randomness is generated and verified within a single transaction.
| Network | Address |
|---|---|
| Mainnet | 0x051fea4450da9d6aee758bdeba88b2f665bcbf549d2c61421aa724e9ac0ced8f |
| Sepolia | 0x051fea4450da9d6aee758bdeba88b2f665bcbf549d2c61421aa724e9ac0ced8f |
#[starknet::interface]
trait IVrfProvider<TContractState> {
fn request_random(self: @TContractState, caller: ContractAddress, source: Source);
fn consume_random(ref self: TContractState, source: Source) -> felt252;
}
#[derive(Drop, Copy, Clone, Serde)]
pub enum Source {
Nonce: ContractAddress,
Salt: felt252,
}
Source::Nonce(ContractAddress): Uses the address's internal nonce. Each request generates a different seed.Source::Salt(felt252): Uses a provided salt. Same salt = same random value.const VRF_PROVIDER_ADDRESS: starknet::ContractAddress =
starknet::contract_address_const::<0x051fea4450da9d6aee758bdeba88b2f665bcbf549d2c61421aa724e9ac0ced8f>();
fn roll_dice(ref self: ContractState) {
let vrf_provider = IVrfProviderDispatcher { contract_address: VRF_PROVIDER_ADDRESS };
let player_id = get_caller_address();
let random_value = vrf_provider.consume_random(Source::Nonce(player_id));
// Use random_value in game logic
}
request_random must be the first call in the multicall. The Cartridge Paymaster wraps the multicall with submit_random and assert_consumed.
const call = await account.execute([
// First: request_random
{
contractAddress: VRF_PROVIDER_ADDRESS,
entrypoint: 'request_random',
calldata: CallData.compile({
caller: GAME_CONTRACT,
// Source::Nonce(address)
source: { type: 0, address: account.address },
// Or Source::Salt(felt252)
// source: { type: 1, salt: 0x123 },
}),
},
// Then: your game call
{
contractAddress: GAME_CONTRACT,
entrypoint: 'roll_dice',
// ...
},
]);
The source in request_random must match the source in consume_random.
Add the vRNG contract to your Controller policies:
const policies: Policy[] = [
// ... your existing policies ...
{
target: VRF_PROVIDER_ADDRESS,
method: "request_random",
description: "Allows requesting random numbers from the VRF provider",
},
];
Phase 0 assumes the Provider has not revealed the private key and does not collude with players. Future plans include moving the Provider to a Trusted Execution Environment (TEE).
Weekly Installs
48
Repository
GitHub Stars
4
First Seen
Feb 13, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode47
codex46
github-copilot45
cursor45
kimi-cli44
gemini-cli44
CoinGecko API 集成 - 实时加密货币价格、市场数据与区块链分析工具
4,200 周安装
Vue JSON 渲染器:@json-render/vue - 动态生成 Vue 3 组件树
301 周安装
Three.js游戏开发指南 - WebGL 3D网页游戏制作教程与代码示例
297 周安装
营销活动执行指南:规划、跨渠道执行与效果分析全流程
299 周安装
LangGraph智能体架构指南:构建生产级AI智能体的图结构与状态管理
299 周安装
AgentOps技能转换器 - 一键将技能转换为Codex、Cursor等AI平台格式
307 周安装
BlockRun:AI 微支付网关,集成 GPT-5.2、DALL-E、Grok 实时搜索,按需付费
300 周安装