Nervosj使用几个注意事项


#1

Nervosj的使用的时候可能会遇到的几个问题,先写在这里,hope it helps。
Nervosj 0.18在部署合约和调用合约方法的时候,不管是通过哪种方式与合约进行交互,都需要通过solc编译器将solidity编译为java class或者将合约方法编码为binary。
如果一个合约有构造方法,且构造方法需要传参,那么要注意在部署合约时发送交易,有这几个注意:

  1. 正确的交易格式是binary(smart contract) + encodedConstructor。在拼接两个binary的时候记得在encodedConstructor中去掉”0x”,因为在签名时,SDK没有判断binary非头部的0x的逻辑。记得在encodedConstructor中去掉构造函数名,只保留参数部分。

  2. 无法先部署合约再进行构造方法的调用,因为构造方法执行一次,所以合约的部署和构造方法的encode必须在一个交易中签名并且发送。

  3. 不要使用solcjs来编译solidity smart contract,测试过在0.4.19中(0.4.19以后的没有试过),solcjs和solc编译出的binary不一样,且solcjs编译出的binary无法正常使用,报错“out of gas”,但通过增加quota并不能解决问题。solc编译的bin是可以使用的,有没有–optimize 对于成功与否没有影响。

  4. 在构造function encode的时候,solidity String类型通常对应nervosj abi中的Utf8String类型而不是dynamicBytes,dynamicBytes对应是bytes类型,如果这个地方写错了会出现错误“reverted”,“reverted”通常表示传参错误或者函数名错误。

  5. 如果在部署合约的时候没有调用构造方法,那么这个合约也是可以部署成功的,但是它要在constructor中初始化的变量不会初始化。在判断合约部署失败或者是部署成功单没有初始化的依据:除了可以使用txhash获取receipt还可以调用合约方法,返回0x通常是为成功0x000000000则是部署成功未初始化。