Solidity virtual和override关键字
关键字virtual和override在Solidity中可用于函数覆盖。 这些关键字的目的在于,当合约被继承后子合约覆盖函数将更为明确。如果父合约的某个函数被标记为virtual关键字,那么他的子合约可以通过override关键字来覆盖父函数。 但在使用这两个关键字的同时需要注意以下几点:对于多重继承,必须在override关键字后指定定义相同函数的派生最基础的合约;具有private可见性的函数是不能被virtual修饰的;在抽象合约中,没有实现的函数(抽象函数)必须要被virtual关键字修饰。而在接口合约中,所有的函数都会被自动修饰上virtual(不需要添加virtual关键字);virtual和override关键字示例:// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; contract Base { function foo() virtual public {} } contract Middle is Base {} contract Inherited is Middle { function f...
Solidity virtual和override关键字
关键字virtual和override在Solidity中可用于函数覆盖。 这些关键字的目的在于,当合约被继承后子合约覆盖函数将更为明确。如果父合约的某个函数被标记为virtual关键字,那么他的子合约可以通过override关键字来覆盖父函数。 但在使用这两个关键字的同时需要注意以下几点:对于多重继承,必须在override关键字后指定定义相同函数的派生最基础的合约;具有private可见性的函数是不能被virtual修饰的;在抽象合约中,没有实现的函数(抽象函数)必须要被virtual关键字修饰。而在接口合约中,所有的函数都会被自动修饰上virtual(不需要添加virtual关键字);virtual和override关键字示例:// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; contract Base { function foo() virtual public {} } contract Middle is Base {} contract Inherited is Middle { function f...
发送以太币(transfer、send、call)
发送以太币(transfer、send、call)在以太坊中send, transfer, call都可以进行转账操作,那么他们究竟有什么区别呢?那么如何发送以太币呢?transfer(2300gas,如果失败则throw)send(2300gas,如果失败则返回false)call(默认情况下将所有可用的gas传输过去,gas传输量可调,如果失败则返回false)如何接收以太币?接收以太币的合约必须至少具有以下功能之一:receieve() external payablefallback() external payable如果发送方的msg.data为空,那么将调用receive(),否则调用fallback()。send与transfer对比简析相同之处均是向目标地址发送以太币(以Wei为单位)发送以太币,都需要消耗固定的2300gas(gas数量少,只允许接收方合约执行最简单的操作)不同之处send执行失败会返回false,不阻碍程序的运行。transfer执行失败后会抛出异常。// SPDX-License-Identifier: MIT pragma solidit...
发送以太币(transfer、send、call)
发送以太币(transfer、send、call)在以太坊中send, transfer, call都可以进行转账操作,那么他们究竟有什么区别呢?那么如何发送以太币呢?transfer(2300gas,如果失败则throw)send(2300gas,如果失败则返回false)call(默认情况下将所有可用的gas传输过去,gas传输量可调,如果失败则返回false)如何接收以太币?接收以太币的合约必须至少具有以下功能之一:receieve() external payablefallback() external payable如果发送方的msg.data为空,那么将调用receive(),否则调用fallback()。send与transfer对比简析相同之处均是向目标地址发送以太币(以Wei为单位)发送以太币,都需要消耗固定的2300gas(gas数量少,只允许接收方合约执行最简单的操作)不同之处send执行失败会返回false,不阻碍程序的运行。transfer执行失败后会抛出异常。// SPDX-License-Identifier: MIT pragma solidit...
Ubuntu配置shadowsocks
Ubuntu配置shadowsocks从官网下载shadowsocks软件apt-get install python-pip pip install shadowsocks 配置/etc/shadowsocks.json(没有就新建一个){ "server":"代理服务器IP", "server_port":代理服务器ss服务端口, "password":"密码", "timeout":300, "method":"加密类型" } 启动服务sudo sslocal -c /etc/shadowsocks.json 这时配置系统代理为127.0.0.1:8080即可科学上网export http_proxy=127.0.0.1:8080 export https_proxy=127.0.0.1:8080 可能遇到的问题在输入加密类型为aes-256-gcm后启动服务可能会遇到“ERROR method aes-256-gcm not supported”的版本不支持的错误。 shadowsocks解决method aes-256-gcm not supported方法。pip i...
Ubuntu配置shadowsocks
Ubuntu配置shadowsocks从官网下载shadowsocks软件apt-get install python-pip pip install shadowsocks 配置/etc/shadowsocks.json(没有就新建一个){ "server":"代理服务器IP", "server_port":代理服务器ss服务端口, "password":"密码", "timeout":300, "method":"加密类型" } 启动服务sudo sslocal -c /etc/shadowsocks.json 这时配置系统代理为127.0.0.1:8080即可科学上网export http_proxy=127.0.0.1:8080 export https_proxy=127.0.0.1:8080 可能遇到的问题在输入加密类型为aes-256-gcm后启动服务可能会遇到“ERROR method aes-256-gcm not supported”的版本不支持的错误。 shadowsocks解决method aes-256-gcm not supported方法。pip i...
Solidity接口合约和抽象合约
Solidity接口合约和抽象合约一、抽象合约在solidity中,抽象合约指的是没有函数体的合约。// SPDX-License-Identifier: MIT pragma solidity >=0.7.0 <0.9.0; contract Abstract { function utterance() returns (bytes32); function bubbleSort(uint[] memory a) public pure virtual returns (uint[] memory); } 但是这样的合约不能通过编译,即使他们同时包含具体函数和抽象函数,但其他合约可以继承该抽象合约: 其中抽象函数要使用virtual关键字修饰,以便子合约重写。 另外如果一个合约是从抽象合约中继承的,但没有实现所有的函数,则他也是抽象合约。二、接口合约接口合约类似于抽象合约,但他们不能实现任何功能。接口的限制有如下:不能继承其他合约或接口不能定义构造函数不能定义状态变量函数可见性只能被external修饰,以外部调用方式调用不能定义结构体不能定义枚举变量接口合约由in...
Solidity接口合约和抽象合约
Solidity接口合约和抽象合约一、抽象合约在solidity中,抽象合约指的是没有函数体的合约。// SPDX-License-Identifier: MIT pragma solidity >=0.7.0 <0.9.0; contract Abstract { function utterance() returns (bytes32); function bubbleSort(uint[] memory a) public pure virtual returns (uint[] memory); } 但是这样的合约不能通过编译,即使他们同时包含具体函数和抽象函数,但其他合约可以继承该抽象合约: 其中抽象函数要使用virtual关键字修饰,以便子合约重写。 另外如果一个合约是从抽象合约中继承的,但没有实现所有的函数,则他也是抽象合约。二、接口合约接口合约类似于抽象合约,但他们不能实现任何功能。接口的限制有如下:不能继承其他合约或接口不能定义构造函数不能定义状态变量函数可见性只能被external修饰,以外部调用方式调用不能定义结构体不能定义枚举变量接口合约由in...
Solidity实现存钱罐合约
使用solidity编写合约实现类似存钱罐功能。具体功能是:可以通过任何人的地址向存钱罐合约发送以太坊主币。任何人都可以查看存钱罐合约里的主币余额。只有存钱罐的拥有者才能从存钱罐中取出主币,拥有者在取出主币后合约就自毁掉,像现实世界中的存钱罐一样被打碎,不能再被使用。接下来我们看一下实现代码:// SPDX-License-Identifier: MIT pragma solidity >=0.7.0 <0.9.0; contract PiggyBank{ event Deposit(uint amount); event Withdraw(uint amount); address public owner=msg.sender; receive() external payable{ emit Deposit(msg.value); } function getBalance() external view returns (uint ){ return address(this).balance; } function withdraw() external{ r...
Solidity实现存钱罐合约
使用solidity编写合约实现类似存钱罐功能。具体功能是:可以通过任何人的地址向存钱罐合约发送以太坊主币。任何人都可以查看存钱罐合约里的主币余额。只有存钱罐的拥有者才能从存钱罐中取出主币,拥有者在取出主币后合约就自毁掉,像现实世界中的存钱罐一样被打碎,不能再被使用。接下来我们看一下实现代码:// SPDX-License-Identifier: MIT pragma solidity >=0.7.0 <0.9.0; contract PiggyBank{ event Deposit(uint amount); event Withdraw(uint amount); address public owner=msg.sender; receive() external payable{ emit Deposit(msg.value); } function getBalance() external view returns (uint ){ return address(this).balance; } function withdraw() external{ r...