https://www.youtube.com/watch?v=xv9OmztShIw&list=PLO5VPQH6OWdVQwpQfw9rZ67O6Pjfo6q-p
helloworld
// SPDX-License-Identifier: MIT
// 如果没有上面的license就会出现黄色warning, 挺难看的..
pragma solidity ^0.8; // 指定solidity编译版本, 带了^号说明要在该版本(0.8)以上, 不加的话就是指定在(0.8)版本
contract HelloWorld {
/**
* @dev Prints Hello World string
*/
function print() public pure returns (string memory) {
// public是指明这个函数/变量能在合约部署后能够访问, 所以后面我能执行这个function
return "Hello World!";
}
}
编译(compile)和部署(deploy)
Remix的环境做得非常友好了, 它还自带了Remix VM
测试用账号. 在Environment
下设置. 我用的是之前配置好的MetaMask
账号. 这两个是有区别的.
- 前者是部署在仅在浏览器内运行的本地区块链上, 一般不用等什么交易确认的, 非常快
- 后者是部署到
MetaMask
连接到的mainnet
上. 我用的是holesky
测试网, 所以在测试网上会有我的交易记录. 我还需要等区块链确认了我才能用我部署的合约.
部署完成后,Deploy
下会有显示, 如下图.
(常见的)数据类型
和Java
类似, solidity
数据类型是分为了值类型和引用类型.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8;
contract ValueTypes {
bool public b = true;
uint public u = 123; // uint = uint256 0 to 2**256 - 1
// uint8 0 to 2**8 - 1, and uint16...
int public i = -123; // int = int256 -2**255 to 2**255 -1, and int128...
int public minInt = type(int).min;
int public maxInt = type(int).max;
// address和bytes32都是格式不对就立马报错.
// 后者跟加密算法keccak256有关.
address public addr = 0x02342Ea564978abBf379b377eE58A0d7142121d4;
bytes32 public b32 = 0x000000000000000000000000000000000000000000000000000000000000007b;
}
函数(function)
external
表示部署合约后可以调用这个函数, pure
表示这个函数是只读的, 不会向区块链写入其它内容.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8;
contract FunctionInfo {
function add(uint x, uint y) external pure returns(uint){
return x + y;
}
function sub(uint x, uint y) external pure returns(uint){
return x - y;
}
}
编译, 部署后执行. 注意solidity可以处理溢出错误是在它0.8
版本之后. 我在执行sub
的时候是先用了参数2,3
, 溢出后就是图中的内容.
变量类型
视频说得有点复杂, 实际上可以理解为作用范围和生命周期的不同.
state variable
state variable
是在区块链上存储的变量. 定义在合约内部, 函数外部.
local variable
局部变量相对于状态变量, 是定义在函数内部.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8;
contract StateVariable {
uint public stateval = 123;
function foo() external {
uint localval = 123;
stateval = localval + stateval + 10;
}
}
state variable
和local variable
作用就如上所示了. state variable
会一直存在, 而local variable
在函数执行完之后就被销毁了.
global variable
一般是存储区块链交易/事务或者账户地址之类的. 普通用户没法定义global variable
.view
关键字修饰的函数可以从state variable
和global variable
读取数据, pure
函数不行.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8;
contract GlobalVariables {
function globalVars() external view returns(address, uint, uint){
address addr = msg.sender; // 调用此函数的地址
uint timestamp = block.timestamp; // uinx时间戳
uint num = block.number; // 当前block的编号
return (addr, timestamp, num);
}
}
view 和 pure
其实用错了的话编译器是有提示的, 就不多说了.
简单案例: Counter
// SPDX-License-Identifier: MIT
pragma solidity ^0.8;
contract Counter {
uint public count;
function inc() external {
count += 1;
}
function dec() external {
count -= 1;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/199803.html