了解区块链技术(Patrick Collins)(二)

2、solidity基础

2-1 第一个智能合约

// SPDX-License-Identifier: MIT 
pragma solidity ^0.8.19; //稳定的版本,MIT是限制最少的License
​
contract SimpleStorage{
    
}

2-2 数据类型

// SPDX-License-Identifier: MIT 
pragma solidity ^0.8.19; //稳定的版本,MIT是限制最少的License
​
contract SimpleStorage{
    //boolean uint(表明这个数只能是正数) int address bytes
    bool hasFavoriteNum = true ;
    uint256 favoriteNum = 123 ;
    string favoriteNumInText = "string" ;
    address myAddress = 0x5859271132EcEfe96eaCFef8e2CD85cD5Ee88A78 ;
    bytes32 favoriteBytes = "cat" ; //"cat"会自动转换成bytes类型,0x1235467899,bytes32是允许分配的最大空间
}

2-3 函数

在部署后,可以看到按钮的颜色是不一样的

1、view只允许读取合约状态,不允许修改合约状态,不消耗gas,除非在消耗gas的函数中调用

2、pure不允许读取合约状态,也不允许修改合约状态,不消耗gas,除非在消耗gas的函数中调用

// SPDX-License-Identifier: MIT 
pragma solidity ^0.8.19; //稳定的版本,MIT是限制最少的License
​
//javaScript VM(ENVIRONMENTT) 表示合约将会被部署到本地的js虚拟机上,是本地测试用的区块链,可以模拟交易
//不用管测试网的流程,智能合约部署的地址:0xd9145CCE52D386f254917e481eB44e9943F39138
contract SimpleStorage{
    //public private  internal(只对本合约和继承合约有效) external
    uint256 public favoriteNum ;//添加public,实际上就是写了一个getter方法
    function store(uint256 _favoriteNum) public {
        favoriteNum = _favoriteNum;//做更多的操作,消耗更多的gas
    }
    function retrieve()public view returns (uint256){
        return favoriteNum;
    }
}

2-4 数组和结构体

//结构体
// SPDX-License-Identifier: MIT 
pragma solidity ^0.8.19; //稳定的版本,MIT是限制最少的License
​
contract SimpleStorage{
    uint256 public favoriteNum ;//索引为0的索引槽
    People public person = People({favoriteNum: 2 , name: "z-jiawei"});//0 1 表示不同变量的索引
    struct People{
        uint256 favoriteNum;
        string name;
    }
}
//数组
// SPDX-License-Identifier: MIT 
pragma solidity ^0.8.19; //稳定的版本,MIT是限制最少的License
​
contract SimpleStorage{
    uint256[] public favoriteNum ;
    People[] public people;  //部署后的输入框表示想要获取到的数组中元素的索引
    struct People{
        uint256 favoriteNum;
        string name;
    }
    function addPerson1(string memory _name , uint256 _favoriteNum)public {
        people.push(People(_favoriteNum,_name));
    }
    function addPerson2(string memory _name , uint256 _favoriteNum)public {
        People memory newPerson = People({favoriteNum: _favoriteNum, name: _name}); 
        people.push(newPerson);
    }
}

2-5 错误和警告

// SPDX-License-Identifier: MIT 未写出来的话会有警告,未提供SPDX许可证标识符

2-6 Memory,Storage & Calldata

EVM中有六种方式可以存储数据:

1、Stack 2、Memory 3、Storage 4、Calldata 5、Code 6、Logs

2、calldata和memory意味着这个变量只是暂时存在,calldata是不能被修改临时变量,Memory是可以被修改临时变量

3、storage 关键字用于声明永久存储在区块链上的数据

4、string是一个bytes数组,需要加memory加上,让solidity知道数组、结构体、映射的数据位置

2-7 Mappings

// SPDX-License-Identifier: MIT 
pragma solidity ^0.8.19; 
​
contract SimpleStorage{
    uint256[] public favoriteNum ;
​
    mapping (string=>uint256) public nameToFavoriteNum ;
    function addPerson1(string memory _name , uint256 _favoriteNum)public {
        nameToFavoriteNum[_name] = _favoriteNum;
    }   
}

2-8 部署第一个合约

Injected Web3表示我们正在使用Metamask或者其他web3钱包,我们的钱包连接到了那个网络就会部署到那个网络上(测试网ing......),把合约部署到测试网络中,给交易签名,会看到部署合约花费以太币数量,如果出现绿色的小对勾则表示部署成功。

EVM就是向以太坊区块链上部署智能合约的标准,任何某种实现EVM的区块链,都可以把智能合约部署上去

2-9 引入其他合约

使用一个合约来为我们部署其他合约,并进一步使用它和其他合约进行交互,合约间的相互交互,是使用solidity和智能合约工作中重要的一环。合约间无缝的相互交互的能力,就是我们说的可组合性

方法一:直接复制SImpleStorage代码到StorageFactory中

代码冗余,实际上已经有了一个SimpleStorage的文件

// SPDX-License-Identifier: MIT 
pragma solidity 0.8.19;
​
contract storageFactory {
    SimpleStorage public simpleStorage;
​
    function createSimpleFactory() public {
        simpleStorage = new SimpleStorage();
    }
}

方法二:使用import

// SPDX-License-Identifier: MIT 
pragma solidity 0.8.19;
import "./SimpleStorage.sol";//可以指定其他包或者github的路径,注意引入不同合约的版本号问题
contract storageFactory {
    SimpleStorage public simpleStorage;
​
    function createSimpleFactory() public {
        simpleStorage = new SimpleStorage(); //每调用一次都会改变simpleStorage的值
    }
}
ParseError:Source  file  requires  different compoler version compiler is xxxxx 
// 改进:每调用一次都会改变simpleStorage的值
// SPDX-License-Identifier: MIT 
pragma solidity 0.8.19;
import "./SimpleStorage.sol";
contract storageFactory {
    SimpleStorage[] public simpleStoragArray;
​
    function createSimpleFactory() public {
        SimpleStorage simpleStorage = new SimpleStorage();
        simpleStoragArray.push(simpleStorage);
    }
}

2-10 与其他合约进行交互

// SPDX-License-Identifier: MIT 
pragma solidity 0.8.19;
import "./SimpleStorage.sol";
contract storageFactory {
    SimpleStorage[] public simpleStoragArray;
​
    function createSimpleFactory() public {
        SimpleStorage simpleStorage = new SimpleStorage();
        simpleStoragArray.push(simpleStorage);
    }
    function sfStore(uint256 _simpleStorageIndex,uint256 _simpleStorageNumber) public  {
        //要和其他合约进行交互,需要两样东西:
        //Address    
        //ABI   应用程序二进制接口,我们的代码如何和合约进行交互
        //显示了所有不同的输入和输出,即这个合约能做的所有事情
        SimpleStorage simpleStorage = SimpleStorage(simpleStoragArray[_simpleStorageIndex]);
        // SimpleStorage simpleStorage = simpleStoragArray[_simpleStorageIndex];
        simpleStorage.store(_simpleStorageNumber);
    }
    function sfGet(uint256 _simpleStorageIndex)public view returns (uint256) {
        SimpleStorage simpleStorage = SimpleStorage(simpleStoragArray[_simpleStorageIndex]);
        return simpleStorage.retrieve();
    }
}

2-11 继承和重写

如果一个合约想要继承另一个合约,只需要将它引入,并使用is指定继承关系

// SPDX-License-Identifier: MIT
import "./SimpleStorage.sol";
pragma solidity 0.8.19;
contract ExtralStorage is SimpleStorage {//继承
    // override
    // virtual override
    function store(uint256 _favoriteNum) public override  {
        favoriteNum = _favoriteNum + 5 ;
    }
}
  function store(uint256 _favoriteNum) virtual public {
        favoriteNum = _favoriteNum;
    }

  • 44
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值