智能合约常见问题

发布时间:2023-09-14 来源:本站


学习区块链就是不断踩坑积累的过程,为方便大家更好地从前人中总结经验,我们将FISCO BCOS社群中高频次、高质量的技术提问与探讨沉淀下来,集合成常见FAQ,作为一手学习材料,供大家随时查阅。


本篇收录了关于“智能合约”的常见问题。智能合约是应用开发中必不可少的一环,帮助区块链实现复杂的业务逻辑,极大地推动了区块链技术发展,加速应用落地。


Q1 空值校验是放在合约上合适还是链下处理合适呢?

A1 链下。


Q2 在使用WeBASE的IDE进行合约开发时,require判断不通过时不会提示信息,只是在交易回执中返回0x16的错误代码,那有什么办法能够获知合约执行失败是因为哪一个条件不通过吗?

A2 可以看这个字段。


Q3 智能合约部署后,这个CALLDATA位置应该如何输入进行测试?

contract StorageStructure { address public implementation; address public owner; mapping (address => uint) internal points;uint internal totalPlayers;}contract ImplementationV1 is StorageStructure {modifier onlyOwner() { require (msg.sender == owner); _; }function addPlayer(address _player, uint _points) public onlyOwner { require (points[_player] == 0); points[_player] = _points; }function setPoints(address _player, uint _points) public onlyOwner { require (points[_player] != 0); points[_player] = _points; }}

A3 :input对应的位置,calldata相当于直接把input传进去。


Q4 FISCO BCOS智能合约的开发IDE用什么?

A4 可以用WeBASE的IDE。


Q5 使用国密版本部署合约出现这个错误怎么解决?[group:1]> deploy HelloWorldTransaction receipt timeout. .gas used: 0

A5 :1、控制台的 solcJ 需要替换为国密版 ;2、applicationContext.xml 中的如下配置也需要相应的修改。


Q6 在同一个群组里,用户是不是能够看到群组里所有(智能合约)的数据?包括智能合约中未提供对外查询接口的状态变量。

A6 是的。


Q7 在区块链浏览器的web端有个js用来编译合约,但是如果链搭建的是国密版的,是不是应该还有个国密版的js。我这个浏览器现在编译始终不能通过,是不是这个原因呢?

A7 编译不通过的情况,请检查合约。


Q8 WeBASE-Front 的合约IDE里面编写并编译好了一个合约,复制合约内容保存到本地文件以后,再重新导入这个合约文件编译生成的bytecodeBin为什么后面的一小段不一样呢?我在windows电脑上操作的,使用We-Front 1.2.4版本,当合约参数为bytes32类型的时候会报错unable to create instance of type:org.fisco.bcos.web3j.abi.datatypes.generated.Bytes32,使用webase-front1.2.0就没问题。

A8 bytes32要用这种格式输入,长度要一致,在页面加个限制;

0x50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb20。


Q9 使用不同账本部署相同的合约出现了合约地址是一样的情况,部署另外一个合约又出现了,但在不同群组部署合约返回的地址是一样的。按我理解,部署合约返回合约地址相同的概率应该特别小,看起来不是巧合。为什么只是偶尔出现几个一样的,大多数都不一样?不过地址虽然是一样的,但数据都是对的。

A9 :合约地址是通过部署合约的这个账户地址+nonce,算一个哈希之后取前面一段得到,用户的nonce每次用户部署的时候递增;相同的账户,不同的群组,nonce是独立的,都是从相同的值开始递增。


Q10 智能合约能访问数据库吗?

A10 不能。


Q11 有没有方法可以获取在合约里面创建过的用户表?

A11 :SDK暂时没有接口可以查询这个信息。如果使用mysql存储了,可以链下查询_sys_tables_表,用户表以u_前缀开头。


Q12 智能合约有bug怎么修复?是否直接使用原来的合约地址重新部署新的合约?

A12 合约地址不会被复用。部署新合约,使用新地址,通过接口或表访问老数据即可。


Q13 如何通过SDK发布我的合约, 没有发现 deployByCNS 这个方法,是这个类部署合约?

A13 通过SDK发布合约,需要调用java合约类的deploy静态方法,和deployByCNS无关。


Q14 子合约通过父合约的方法修改了父合约里的一个参数值,那父合约里的参数变化吗?

A14 如果子合约没有重写父合约的函数,则父合约里的值不会变化,因为被调用的函数是子合约的函数;否则父合约里的值会变化,因为被调用的函数是父合约的函数。


Q15 合约中的某些数据如果需要加密要如何操作呢?

A15 可以在本地把数据加密。


Q16 部署合约时,选中user地址以后,报私钥为空怎么处理?

A16 将yml中keyServer配置加上Webase-node-manager的ip port 。


Q17 在2.4版本master分支拉取的代码,编译时出现这个问题的原因是什么?

A17 把evmc文件夹删掉,重新执行cmake,然后再编译试试。

Q18 FISCO BCOS的合约能直接调用外部接口吗?比如发送http请求之类的。

A18 在智能合约中可以调用其他合约的接口,但是不能访问外部的数据和外部的接口。


Q19 部署合约时报这个错误。

A19 文件编码格式有问题,最好都是utf-8。


Q20 在复杂的表结构里需要连接操作和复杂查询 ,但是Solidity本身应该是不支持的。所以要用传统sql进行CRUD,只用区块链做同步操作,但是这样具体怎么做?怎么在区块链用sql语句对数据库里进行操作?

A20 不支持,也不建议这样用。写一个 sendSQL(string sqlstr) 接口的合约,发交易调用它发送sql其他节点同步区块和交易列表,获得这个交易,再执行sql。但这里面会有很多复杂的不一致性问题,不是区块链应该的用法。


Q21 我想照着这个配置测试自己的合约,怎么操作?

A21 参照示例即可,测试脚本需要像示例那样实现自己的init, run, end逻辑,然后写好配置文件,caliper就会按照配置自动跑测试了。


Q22 交易服务的合约地址查询接口:响应参数返回的合约地址,永远都是0x0000000000000000000000000000000000000000

A22 合约地址为0x0可能是合约部署失败了。


Q23 合约是否可调外部接口拉取数据上链呢?

A23 合约是被调用方,一般是外部服务调用合约,将数据或校验结果上链,上链的时候会带上身份,合法的身份信息能被合约认可。


Q24 用caliper测试智能合约时,transaction返回的status是0x16,官方文档里说是revert指令异常,这个问题应该怎么解决?这是我的测试函数:

A24 修改为bid(uint256,uint256,uint256)。


Q25 怎么查找合约地址?

A25 制台的话会有个getDeployLog的命令,查看已经部署的合约地址的列表 。


Q26 有没有方法可以通过控制台来获取目前链上所有的合约地址?

A26 没有,这是个批量查询操作,用webase,浏览器或者自行实现检索。


Q27 sdk2.4.0连接2.4.0国密版节点,部署不上去合约,报这样的错,但是我授权链管理员又可以,通过链管理员账号grantDeployAndCreateManage一个账号又报错没权限,请问这是怎么回事呢?

A27 要用链管理员授权另一个管理员,sdk要配置了encryptType为1,编译的合约要用国密版的进行编译。


Q28 请问合约abi中的constant代表什么意思?

A28 类似数据库的查询,是一次调用而非交易,不消耗gas, 不需要共识。


参考资料

智能合约开发技术文档http://www.fisco-bcos.org/developer/docs/manual/smart_contract.html

《FISCO BCOS智能合约开发快速入门》

《如何优雅地编写智能合约》

《16大技巧快速实现高水准智能合约》


公众号对话框回复【学习资料】可获得FISCO BCOS全套学习材料。


如果在FAQ中未能找到您的问题,可以添加小助手微信(FISCOBCOS010)进技术群提问交流,点击下方“阅读原文”,告诉我们您对内容的意见与建议。


如果您发现平台中有错误或是想提出功能请求,欢迎进入项目GitHub界面,提issue反馈遇到的问题和建议;如果只是小问题,您也可以顺手提PR进行修改。提交issue/PR的流程请参考揭秘FISCO BCOS开源项目开发协作




分享至: