bytes32[] remix solidity

// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; contract Fix { bytes32[] questionList= [ bytes32(0x52a6eb687cd22e80d3342eac6fcc7f2e19209e8f83eb9b82e81c6f3e6f30743b), bytes32(0x257f3de9149acf0a49d3f7668956aeb52490202fae9ec2e92c3caa7d5223c6ef) ]; // constructor() { // // questionList = [ // // bytes32(0x52a6eb687cd22e80d3342eac6fcc7f2e19209e8f83eb9b82e81c6f3e6f30743b), // // bytes32(0x257f3de9149acf0a49d3f7668956aeb52490202fae9ec2e92c3caa7d5223c6ef) // // ]; // } // function addQuestion(bytes32 questionKey) // public // returns(bool success) // { // questionList.push(questionKey); // return true; // } function getQuestionCount() public view returns(uint questionCount) { return questionList.length; } function getQuestionAtIndex(uint row) public view returns(bytes32 questionkey) { return questionList[row]; } }

2022-05-11 · 1 min · 75 words · Me

ethereum Solidity v0.5.0 Breaking Changes

https://solidity.readthedocs.io/en/v0.5.0/050-breaking-changes.html#example https://github.com/ethereum/solidity/blob/develop/Changelog.md

2019-07-16 · 1 min · 2 words · Me

[轉]以太坊智能合约Solidity 0.5.0版本重大变化

https://zhuanlan.zhihu.com/p/54169418 随着solidity 0.5.0 nightly build版本的稳步推进,正式版也将在不久的将来与开发者见面.作为一个大版本更新,新版引入了很多特性,也废弃了很多关键字,比如 .call()不仅可以获知远程调用执行成功与否,还将获得远程调用执行的返回值 ABI解码做了新的处理规范,有效防御了"短地址攻击" address地址类型细分成 address和 address payable uintY和 bytesX不能直接转换 回退函数必须显式声明为 external可见性 构造函数必须用 constructor关键字定义 用于抛出异常的 throw关键字弃用, 函数状态可变性修饰符必须用 view,不能混用 constant和 view … 下面我们将对这些改变一一予以介绍,最后给出一个示例代码,对比展示新旧版solidity代码写法的区别,供大家参考. 显式声明 函数可见性 函数可见性必须显式声明. 之前, 函数如果不显式声明,将默认 public可见性. public: constructor构造函数必须声明为 public可见性,否则编译报错. external: 回退函数(fallback function), 接口(interface)的函数必须声明为 external可见性,否则编译报错. 存储位置 结构体(struct),数组(array),映射(mapping)类型的变量必须显式声明存储位置( storage, memeory, calldata),包括函数参数和返回值变量都必须显式声明. external 的函数参数需显式声明为 calldata. 合约与地址 contract合约类型不再包括 address类型的成员函数,必须显式转换成 address地址类型才能使用 send(), transfer(), balance等与之相关的成员函数/变量成员. address地址类型细分为 address和 address payable,只有 address payable可以使用 transfer(), send()函数. address payable类型可以直接转换为 address类型, 反之不能. 但是 address x可以通过 address(uint160(x)),强制转换成 address payable类型. 如果 contract A不具有 payable的回退函数, 那么 address(A)是 address类型. 如果 contract A具有 payable的回退函数, 那么 address(A)是 address payable类型. msg.sender属于 address payable类型. 转换与填充(padding) uintY与 bytesX 因为填充(padding)的时候, bytesX是右填充(低比特位补0),而 uintY是左填充(高比特位补0),二者直接转换可能会导致不符合预期的结果,所以现在当 bytesX和 uintY长度大小不一致(即X*8 != Y)时,不能直接转换,必须先转换到相同长度,再转换到相同类型. 10进制数值不能直接转换成 bytesX类型, 必须先转换到与 bytesX相同长度的 uintY,再转换到 bytesX类型 16进制数值如果长度与 bytesX不相等,也不能直接转换成 byteX类型 ABI 字面值必须显式转换成类型才能使用 abi.encodePacked() ABI编码器在构造外部函数入参和 abi.encode()会恰当地处理 bytes和 string类型的填充(padding),若不需要进行填充,请使用 abi.encodePacked() ABI解码器在解析函数入参和 abi.decode()时,如果发现 calldata太短或超长,将直接抛出异常,而不是像之前自动填充(补0)和截断处理,从而有效地遏制了短地址攻击. .call()族函数( .call(), .delegatecall(), .staticcall())和 哈希函数( keccak256(), sha256(), ripemd160())只接受一个参数 bytes,且不进行填充(padding)处理. .call()空参数必须写成 .call("") .call(sig,a,b,c)必须写成 .call(abi.encodeWithSignature(sig,a,b,c)),其他类推 keccak256(a,b,c)必须写成 keccak256(abi.encodePacked(a,b,c)),其他类推 另外, .call()族函数之前只返回函数执行成功是否的 bool, 现在还返回函数执行的返回值,即 (bool,bytes memory). 所以之前 boolresult=.call(sig,a,b,c)现在必须写成 (boolresult,bytes memory data)=.call(sig,a,b,c). 不允许的写法 在之前版本的solidity编译,以下不允许的写法只会导致 warnings报警,现在将直接 errors报错. ...

2019-07-16 · 3 min · 563 words · Me