ethereum - StateAccessViolation:值必须是文字 - Vyper 以太坊智能合约
问题描述
版本信息
- vyper 版本(输出
vyper --version
):0.2.8+commit.069936f - 操作系统:osx
- Python 版本(输出
python --version
):Python 2.7.16 - 环境(的输出
pip freeze
):
altgraph==0.10.2
bdist-mpkg==0.5.0
bonjour-py==0.3
macholib==1.5.1
matplotlib==1.3.1
modulegraph==0.10.4
numpy==1.8.0rc1
py2app==0.7.3
pyobjc-core==2.5.1
pyobjc-framework-Accounts==2.5.1
pyobjc-framework-AddressBook==2.5.1
pyobjc-framework-AppleScriptKit==2.5.1
pyobjc-framework-AppleScriptObjC==2.5.1
pyobjc-framework-Automator==2.5.1
pyobjc-framework-CFNetwork==2.5.1
pyobjc-framework-Cocoa==2.5.1
pyobjc-framework-Collaboration==2.5.1
pyobjc-framework-CoreData==2.5.1
pyobjc-framework-CoreLocation==2.5.1
pyobjc-framework-CoreText==2.5.1
pyobjc-framework-DictionaryServices==2.5.1
pyobjc-framework-EventKit==2.5.1
pyobjc-framework-ExceptionHandling==2.5.1
pyobjc-framework-FSEvents==2.5.1
pyobjc-framework-InputMethodKit==2.5.1
pyobjc-framework-InstallerPlugins==2.5.1
pyobjc-framework-InstantMessage==2.5.1
pyobjc-framework-LatentSemanticMapping==2.5.1
pyobjc-framework-LaunchServices==2.5.1
pyobjc-framework-Message==2.5.1
pyobjc-framework-OpenDirectory==2.5.1
pyobjc-framework-PreferencePanes==2.5.1
pyobjc-framework-PubSub==2.5.1
pyobjc-framework-QTKit==2.5.1
pyobjc-framework-Quartz==2.5.1
pyobjc-framework-ScreenSaver==2.5.1
pyobjc-framework-ScriptingBridge==2.5.1
pyobjc-framework-SearchKit==2.5.1
pyobjc-framework-ServiceManagement==2.5.1
pyobjc-framework-Social==2.5.1
pyobjc-framework-SyncServices==2.5.1
pyobjc-framework-SystemConfiguration==2.5.1
pyobjc-framework-WebKit==2.5.1
pyOpenSSL==0.13.1
pyparsing==2.0.1
python-dateutil==1.5
pytz==2013.7
scipy==0.13.0b1
six==1.4.1
xattr==0.6.4
这个for
循环调用:
for i in range(self.some_uint256):
# do something...
正在抛出错误:
StateAccessViolation: Value must be a literal
完整的错误输出:
vyper.exceptions.StateAccessViolation: Value must be a literalvyper.exceptions.StateAccessViolation: Value must be a literal
contract "vyper-farm/contracts/Farm.vy", function "_employ", line 152:4
151
---> 152 for i in range(self.num_employees):
-------------^
153 pass
我到底做错了什么?
这是对我的字面意思的误解吗?
解决方案
查看range -function 的描述,只有一种方法可以将变量传递给它:
for i in range(a, a + N):
pass
在您的情况下,它应该是这样的(不确定它是否有用):
num_employees: public(uint256)
@external
def __init__():
self.num_employees = 16
@external
def do_smth():
for i in range(self.num_employees, self.num_employees + 10):
pass
推荐阅读
- sql - 什么是基于列生成字符串的程序方法的更好替代方法?
- python - 如何使用excel表格获取员工ID
- javascript - 在组件初始化外部调用的函数
- html - 不透明度影响文本的 HTML CSS 背景图像
- notifications - 调用 notificationManager.clearAll() 后再次出现通知
- jquery - 如何增加jquery变量大小限制
- javascript - 使用 td 标记内的选择元素克隆表行
- flutter - 如何减慢速度,ScrollPhysics Flutter
- git - 在 git 哪里放置工具分支?
- arrays - 我正在使用 Laravel 7.x Validator 比较使用“lte”或“gte”的 2 个数组的值,但无法让它工作