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编程中遇到的各种问题–数据结构篇

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值