Solidaty学习笔记(一)
Solidaty学习笔记(一)
简单语法提示代码:
//创建合约contract ZombieFactory {uint dnaDigits = 16;uint dnaModulus = 10 ** dnaDigits;struct Zombie {string name;uint dna;}//定义Person类型的数组Person[] public people;`//定义Person类型的数组Person[] public people;`完整代码: (僵尸工厂第一课)pragma solidity ^0.4.25;contract ZombieFactory {event NewZombie(uint zombieId, string name, uint dna);uint dnaDigits = 16;uint dnaModulus = 10 ** dnaDigits;struct Zombie {string name;uint dna;}Zombie[] public zombies;function _createZombie(string _name, uint _dna) private {uint id = zombies.push(Zombie(_name, _dna)) - 1;emit NewZombie(id, _name, _dna);}function _generateRandomDna(string _str) private view returns (uint) {uint rand = uint(keccak256(abi.encodePacked(_str)));return rand % dnaModulus;}function createRandomZombie(string _name) public {uint randDna = _generateRandomDna(_name);_createZombie(_name, randDna);}}
映射(Mapping)和地址(Address):
Address:每个账户都有一个地址,这是账户唯一的标识符。如:
0x0cE446255506E92DF41614C46F1d6df9Cc969183
Mapping:映射本质上是存储和查找数据所用的键值对。例如:
mapping (address => uint) public accountBalance;
此处,address是键,uint是值。
msg.sender
msg.sender指的是当前调用者(或者智能合约)的address。在solidaty中,功能执行需要从外部开始,有人调用合约里的函数才会起作用,所以msg.sender总是存在的。msg.sender很安全,因为它具有以太坊区块链的安全保障————除非窃取与以太坊地址相关的私钥,否则无法修改其他人的数据。
1. 以太坊中有三个可以存储项目的区域:
- 存储Storage:
是指永远存储在区块链中的变量。
- Memory:
当外部函数对某合约调用完成时,内存型变量即被移除。
internal和external:
两个修饰词军事用于描述函数可见性。
- internal:如果被修饰的函数继承自其父合约,那么父合约里面的函数也可以被此函数调用。
- external:被修饰的函数只能在合约之外被调用,它不能被合约内的函数调用。
view与pure的理解:
在Solidity v4.17之前,只有constant,后来有人嫌constant这个词本身代表变量中的常量,不适合用来修饰函数,所以将constant拆成了view和pure。view的作用和constant一模一样,可以读取状态变量但是不能改;pure则更为严格,pure修饰的函数不能改也不能读状态变量,否则编译通不过。
Others:
1. solidaty支持单继承和多继承;
2. 在solidity 0.6.x 版本之后,接口类似于抽象合约,可以使用interface关键字创建
interface Calculator { function getResult() external view returns(uint);}
基本数据类型:
- uint
- bool
- address
- int
常量:
常量是无法修改的变量。
address public constant MY_ADDRESS = 0x777788889999AaAAbBbbCcccddDdeeeEfFFfCcCc;
Immutable:
不可变变量的值可以在构造函数中修改,但不能随后修改。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;contract Immutable {// coding convention to uppercase constant variablesaddress public immutable MY_ADDRESS;uint public immutable MY_UINT;constructor(uint _myUint) {MY_ADDRESS = msg.sender;MY_UINT = _myUint;}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
