You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写单独脚本获取Cadence State资源中各变量的值?

Cadence State资源变量获取方案与问题排查

完善State资源实现

首先补充缺失的变量获取方法,并确保资源具备初始化逻辑(变量必须有初始值才能正常读取):

pub resource State {
    pub let Name: String
    pub var P: Int
    pub var H: Int
    pub var M: [String]

    // 初始化所有变量
    init(name: String, initialP: Int, initialH: Int, initialM: [String]) {
        self.Name = name
        self.P = initialP
        self.H = initialH
        self.M = initialM
    }

    // 已实现的GetName方法
    pub fun GetName(): String {
        return self.Name
    }

    // 获取P的方法
    pub fun getP(): Int {
        return self.P
    }

    // 获取H的方法
    pub fun getH(): Int {
        return self.H
    }

    // 获取M的方法
    pub fun getM(): [String] {
        return self.M
    }

    // 已实现的addP方法
    pub fun addP(amount: Int) {
        self.P += amount
    }
}

如果需要给H、M赋值,可补充以下方法:

// 设置H的值
pub fun setH(newH: Int) {
    self.H = newH
}

// 向M数组添加元素
pub fun addToM(item: String) {
    self.M.append(item)
}

单独获取变量的脚本

获取Name的脚本

import YourContract from 0xYourContractAddress

pub fun main(): String {
    let account = getAccount(0xAccountAddress)
    let state = account.getCapability<&YourContract.State>(/public/StateCapability).borrow()
        ?? panic("无法获取State资源引用")
    return state.GetName()
}

获取P的脚本

import YourContract from 0xYourContractAddress

pub fun main(): Int {
    let account = getAccount(0xAccountAddress)
    let state = account.getCapability<&YourContract.State>(/public/StateCapability).borrow()
        ?? panic("无法获取State资源引用")
    return state.getP()
}

获取H的脚本

import YourContract from 0xYourContractAddress

pub fun main(): Int {
    let account = getAccount(0xAccountAddress)
    let state = account.getCapability<&YourContract.State>(/public/StateCapability).borrow()
        ?? panic("无法获取State资源引用")
    return state.getH()
}

获取M的脚本

import YourContract from 0xYourContractAddress

pub fun main(): [String] {
    let account = getAccount(0xAccountAddress)
    let state = account.getCapability<&YourContract.State>(/public/StateCapability).borrow()
        ?? panic("无法获取State资源引用")
    return state.getM()
}

常见问题排查

  • 资源权限不足:确保已将State资源的公共能力发布到账户公共路径,否则脚本无法借用引用。发布代码示例:
    // 在合约或交易中执行发布操作
    account.link<&State>(/public/StateCapability, target: /storage/State)
    
  • 类型不匹配:脚本中借用的资源类型必须与合约定义完全一致,包括合约地址、资源名称。
  • 变量未初始化:创建State资源时必须通过init方法传入所有变量的初始值,否则读取时会出现未定义错误。
  • 返回值类型错误:脚本main函数的返回类型必须与对应获取方法的返回类型严格一致,比如获取数组M时返回类型必须写[String]。

内容的提问来源于stack exchange,提问作者Allen Chrisso Dhas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:36:05