solidity编写智能合约遇到的各种问题
Posted 一袋芋头
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了solidity编写智能合约遇到的各种问题相关的知识,希望对你有一定的参考价值。
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编程中遇到的各种问题–数据结构篇
以上是关于solidity编写智能合约遇到的各种问题的主要内容,如果未能解决你的问题,请参考以下文章
solidity 智能合约(3):使用truffle编译部署及测试合约