区块链编程语言Solidity学习:bilibili课(三)

170 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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的三种方法

Image.png
call如果对象是一个智能合约,返回值就会在data中体现

15.做一个以太坊钱包

Image.png 如果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语法:类似地址引用,在这里你不需要知道函数的情况

Image.png

注意!!!   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;

    }

}