Remix-Solidity IDE中如何传参?合约部署参数未生效求助
搞定你的Solidity合约参数问题!
嘿,我看你在部署OreOreCoin合约时遇到了参数不生效的问题——调用name返回空字符串,而不是预期的"OreOreCoin"。这问题其实很常见,根源就是你的合约没写构造函数来初始化这些状态变量!
为啥会出问题?
在Solidity ^0.4.8这个版本里,如果你想在部署合约时给name、symbol这些变量赋值,必须通过构造函数来实现。你的代码里只声明了这些公共变量,但没给它们设置初始值的逻辑,所以部署后它们都会保持默认值(字符串默认是空,数值默认是0),自然调用name会返回空啦。
修复后的完整代码
我给你补全了构造函数,还加了基础的transfer函数实现(毕竟代币合约少不了这个):
pragma solidity ^0.4.8; contract OreOreCoin{ string public name; string public symbol; uint8 public decimals; uint256 public totalSupply; mapping (address => uint256) public balanceOf; event Transfer(address indexed from, address indexed to, uint256 value); // 构造函数:部署时传参初始化所有变量 function OreOreCoin( string _name, string _symbol, uint8 _decimals, uint256 _totalSupply ) public { name = _name; symbol = _symbol; decimals = _decimals; totalSupply = _totalSupply; // 顺便把初始代币全给部署合约的地址 balanceOf[msg.sender] = _totalSupply; } // 实现代币转账功能 function transfer(address _to, uint256 _value) public returns (bool success) { // 检查发送者余额足够 require(balanceOf[msg.sender] >= _value); // 防止整数溢出(0.4.x版本没有自动检查,得手动加) require(balanceOf[_to] + _value >= balanceOf[_to]); balanceOf[msg.sender] -= _value; balanceOf[_to] += _value; // 触发转账事件 Transfer(msg.sender, _to, _value); return true; } }
部署时要做的事
部署这个合约的时候,记得传入对应的参数:
- 第一个参数填
"OreOreCoin"(就是你想要的name) - 第二个参数可以填代币符号,比如
"OOC" - 第三个参数填小数位数,通常用
18 - 第四个参数填总供应量,比如
1000000000000000000000(对应1000个代币,因为18位小数)
部署完成后再调用name(),就能得到你预期的"OreOreCoin"啦!
小提醒
Solidity 0.4.8是挺老的版本了,存在一些安全隐患(比如整数溢出),如果项目允许的话,建议升级到0.8.x版本——这个版本自带溢出检查,而且构造函数改用constructor()关键字,写法更规范。
内容的提问来源于stack exchange,提问作者jinkook Lee
相关产品推荐
相关产品推荐

