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; }