Solidaty学习笔记(一)

Solidaty学习笔记(一),第1张

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);
    }
基本数据类型: uintbooladdressint 常量:

常量是无法修改的变量。

address public constant MY_ADDRESS = 0x777788889999AaAAbBbbCcccddDdeeeEfFFfCcCc;
Immutable:

不可变变量的值可以在构造函数中修改,但不能随后修改。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract Immutable {
    // coding convention to uppercase constant variables
    address public immutable MY_ADDRESS;
    uint public immutable MY_UINT;

    constructor(uint _myUint) {
        MY_ADDRESS = msg.sender;
        MY_UINT = _myUint;
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/2991968.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)

保存