solidity编写智能合约遇到的各种问题
合约部署
该篇文章中介绍了一些合约部属时遇到的简单问题,Mark一下省的以后我也遇到。
https://blog.csdn.net/qq_41066280/article/details/103946600?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242
1.creation of XXXXX errored: transaction execution failed
编译完事后直接部署有可能失败,查看具体信息发现gas不够,在编译时选择启用优化即可
2.creation of CS errored: Error encoding arguments: SyntaxError: Unexpected token x in JSON at position 47
这篇文章中也讲述了一些遇见的问题
https://www.jianshu.com/p/6140660d4dd8?utm_campaign=maleskine
通常遇到上述错误是因为json数据格式出现问题,说明编译.sol文件生成.json文件解析出现了问题。而且这种问题可能是truffle不同版本进行编译产生的error
或者是传递参数时出现了问题,比如说字符串没加双引号什么的了,我的合约需要两个address型参数.
当时怀疑传递的格式有问题,但是在这个界面怎么改也改不过来。。直到发现了这里的展开按钮。。
输入地址竟然部署成功,然后再折叠对比一下
竟然多了双引号!!!
总算成功解决。强烈建议展开输入参数!
总结:传递地址型参数时要加""
字符串也要加""
合约调用
1.通过接口调用其他.sol文件内的函数
需求:将主合约中的部分功能模块化,拆分成独立的子合约,然后通过调用该子合约的接口来实现所需功能。
要将子合约先行部署
测试实例:子合约two实现数组求和
pragma solidity ^0.4.18;
contract two{
uint summ = 0;
function sum(uint[] datas)public returns(uint) {
for(uint i =0; i< datas.length; i++){
summ += datas[i];
}
return summ;
}
}
Remix编译通过后部署,合约地址为:0x08970fed061e7747cd9a38d680a601510cb659fb
主合约cs中设接口及其实例化
pragma solidity ^0.4.18;
contract two{
function sum(uint[] datas)public returns(uint);
}
contract cs{
uint[] public scores;
uint public scoresum;
function init() public{
for(uint i = 0; i < 5;i++){
scores.push(i * 10);
}
}
two mytwo = two(0x08970fed061e7747cd9a38d680a601510cb659fb);//部署two的地址
function ssum()public {
scoresum = mytwo.sum(scores);
}
}
代码说明
步骤:
1.主合约中定义接口
2.实例化接口
3.调用接口,传递参数。
部署主合约
注意两张图画方框的地方,子合约的地址要一致
验证通过,开始干活!
solidity的数据结构
1.Mapping的删除
情景:在完成操作后要将本次使用过的一些mapping数据删除(或重置),以供下次或其他人使用合约的状态变量
注意:
mapping的delete:只是删除对应某个key的value,而不能直接删除整个mapping,所以要想删除该mapping的每一个key时,往往要把每一个key放进一个动态数组,然后遍历该数组进行删除。
问题:如果要删除一个mapping里的另一个mapping,是直接删除外层mapping,还是要把里层mapping的每个Key都删除?
篇幅太长,移步:
solidity编程中遇到的各种问题–数据结构篇