如何编写单独脚本获取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
相关产品推荐
相关产品推荐

