Clarity扩展v0.7.1代码通知问题及解决方案咨询
解决Clarity扩展v0.7.1中lock函数的安全提示问题
问题描述
- 编写
lock函数时,工具提示source of untrusted input here:(define-public (lock (new-beneficiary principal) (unlock-at uint) (amount uint)) - 执行变量赋值代码时,工具提示
use of potentially unchecked data:(var-set beneficiary (some new-beneficiary))
解决方案
这两个提示是Clarity扩展的安全检查机制,用于规避不可信输入带来的风险,具体解决方法如下:
1. 消除source of untrusted input here提示
函数的三个参数均为外部传入的不可信输入,必须添加针对性的合法性校验:
new-beneficiary校验:用is-principal函数确认其为有效主体地址unlock-at校验:确保解锁时间晚于当前区块高度,用(> unlock-at (block-height))判断amount校验:校验金额大于0,且不超过调用者的可用余额(可结合get-balance实现)
示例校验代码:
(asserts! (is-principal new-beneficiary) (err u100)) ; 拦截无效主体地址 (asserts! (> unlock-at (block-height)) (err u101)) ; 拦截早于当前时间的解锁设置 (asserts! (> amount u0) (err u102)) ; 拦截零金额操作
2. 消除use of potentially unchecked data提示
必须先完成上述所有输入校验,确认new-beneficiary合法安全后,再执行var-set赋值操作,避免未校验的数据存入变量。
完整代码示例片段:
(define-public (lock (new-beneficiary principal) (unlock-at uint) (amount uint)) (let () ; 执行所有输入合法性校验 (asserts! (is-principal new-beneficiary) (err u100)) (asserts! (> unlock-at (block-height)) (err u101)) (asserts! (> amount u0) (err u102)) ; 校验通过后再赋值变量 (var-set beneficiary (some new-beneficiary)) ; 后续业务逻辑... (ok true) ) )
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

