本文已参与「新人创作礼」活动,一起开启掘金创作之路。
11.可见性
如果想要再合约内部调用合约的一个external函数,需要使用this.function()即可,但是这样会增加gas,不建议(改一下internal就可以。
子合约中也不能对上面的external函数进行重写
12.immutable 再合约构造的时候再确定值,而且还能节约gas
13.payable
function getBalance() external view returns (uint ){
return address(this).balance;
}
有view不能有payable
再变量定义的时候payable需要再public的前面
address payable public owner;
constructor(){
owner=payable(msg.sender);
}
使用这个函数,没法在构造的时候就把eth发进去
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
contract Fallback{
event Log( string func,address sender ,uint value,bytes data);
fallback() external payable{//不需要加function
//可以接受不存在的函数调用
emit Log("fallback",msg.sender,msg.value,msg.data);
}
receive() external payable{
emit Log("receive",msg.sender,msg.value,"");
}
}
14.发送eth的三种方法
call如果对象是一个智能合约,返回值就会在data中体现
15.做一个以太坊钱包
如果require条件不符合,会revert
16.这个function也是view?
写成pure就不行了
function getX(address _test) external view returns(uint){
uint x=TestContract(_test).getX();
return x;
}
17.又发送钱又发送参数
这里是把参数放在()中,把别的东西放到{}里面,可以配合abi.xxx使用
function setXandRecieveEther(address _test,uint _x) external payable{
TestContract(_test).setXandRecieveEther{value:msg.value}(_x);
}
18.函数有两个返回值:
(a,b)=....... //记得要加上括号!
19.interface语法:类似地址引用,在这里你不需要知道函数的情况
注意!!! count这里的.count()其实是对变量的引用,不是调用函数!!!
而且调用的是接口所表示的变量,不是callInterface本身
/SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
interface Icounter{
function count() external view returns (uint);
function inc() external;
}
contract CallInterface{
uint public count;
function example(address _cc) external {
Icounter(_cc).inc();
count=Icounter(_cc).count();
}
}
contract Counter{
uint public count;
function inc() external{
count+=1;
}
function dec() external{
count-=1;
}
}