简单的智能合约开发

智能合约简介

智能合约(Smart Contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。它允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约的概念最早由美国计算机科学家Nick Szabo于1994年提出,其设计初衷是在无需第三方介入的情况下,通过自动化的程序来执行合同条款。

智能合约是基于区块链技术实现的,它通过编程语言定义并存储在区块链上。智能合约可以自动执行各种任务,例如验证和执行合同、管理数字资产和执行金融交易。智能合约的运行环境通常是以太坊等区块链平台,这些平台提供了必要的硬件和软件支持,使得智能合约能够在全球范围内安全地运行。

智能合约的主要优势包括去中心化、透明性和不可篡改性。去中心化意味着没有中央权威机构来控制或干预交易过程,从而降低了欺诈和滥用的风险。透明性则确保所有参与方都能看到交易的详细记录,而不可篡改性保证了一旦交易被确认,就无法更改。

Remix IDE

刚开始学习,就先用Remix IDE网页版来进行简单的开发,先介绍一下

Remix Solidity IDE 是一款基于浏览器的IDE,它用于开发智能合约,也是目前比较推荐的一款开发以太坊智能合约的IDE,特别是对于新手来说。由于是基于浏览器的IDE,有一个很大的好处就是不用安装,也不用去安装Solidity运行环境,打开即用。

官方网址:https://remix.ethereum.org/

详细的使用教程可以参考Remix IDE的官方文档登链社区的视频教程

代码部分

首先新建一个文件,叫做Simple_Storage.sol

首先先选择solidity的版本,我使用6.6.0的版本,要注意的你的版本要和编译器里的一致

pragma solidity 0.6.6;

 Solidty语言和java有点像,这段代码定义了一个名为SimpleStorage的智能合约,变量可以像下面这样定义,其中uint、int、bytes有很多类型,可以根据需要选择

contract SimpleStorage {
    uint256 FavoriteNumber = 5;
    bool favorateBool = true;
    string favorateString = "String";
    int256 favorateInt = -5 ;
    address favorateAddress = 0x6cfe16119a86Ac17d123F0EAd15507B0798afeD2;
    bytes32 favorareByte = "dog";
}

 写个store测试一下,功能是用户更新并存储最喜欢的数字

pragma solidity ^0.6.0;

contract SimpleStorage {

    uint256 favoriteNumber = 5;

    function store(uint256 _favoriteNumber) public {
        favoriteNumber = _favoriteNumber;
    }
}

点击部署可以发现账户里的gas变少了

部署完成后可以在这里存储和更新一个喜欢的数字,同时又花费了一点gas 

这是一个最简单的实验,另外,我们可以像java一样修改变量favorateNumber或store函数的属性像public、private等,具体可以参考官方文档,快去自己尝试一下吧

我们可以通过view查看存储的数字

pragma solidity ^0.6.0;

contract SimpleStorage {

    uint256 favoriteNumber = 5;

    function store(uint256 _favorateNumber) public {
        favoriteNumber = _favorateNumber;
    }

    function retieve() public view returns(uint256){
        return favoriteNumber;
    }
}

要记得编译

 到目前为止,这个程序知允许一个人存储一个最喜欢的数字,然后可以检索这个数字,但是如果我们想让一群人存储存储数字并用编号将人和数字联系起来呢

我们要用到struct,创建people的结构体,详细可以参考官方文档

    struct People{
        uint256 favoriteNumber;
        string name;
    }

    People public person = People({favoriteNumber: 2, name: "jack"});

我们定义了一个名为People的结构体(或称为类),其中包含了两个成员变量:favoriteNumbername,再创建一个名为personPeople类型的对象,并且初始化它的favoriteNumber为2,name为"jack"

编译后再部署

但是我们实际上是想要创建一个完整的列表,我们需要用数组来实现

    People[] public people;

我们可以添加人到people数组,通过改变索引查看不同的人。先写add_person函数

    function addPerson(string memory _name, uint256 _favoriteNumber) public {
        people.push(People({favoriteNumber: _favoriteNumber, name: _name}));
    }
  • people.push(People({favoriteNumber: _favoriteNumber, name: _name}));:这行代码创建了一个新的People对象,并将其添加到people数组中。People对象有两个属性:favoriteNumbername,它们分别被初始化为函数参数_favoriteNumber_name的值。

细心的可以发现使用了memory来声明参数,在Solidity语言中,storage 和 memory 是用来指定变量存储位置的关键字。

  • storage:指的是变量被永久存储在区块链上,即合约的状态变量。这些变量在合约的生命周期内一直存在,并且可以通过交易来修改。由于它们存储在区块链上,因此访问和修改这些变量通常比较昂贵(消耗更多的gas)。

  • memory:指的是变量只在函数调用期间临时存储在内存中。这些变量在函数调用结束时会被销毁,不会永久存储在区块链上。由于它们只存储在内存中,因此访问和修改这些变量通常比较便宜。

接下来我们尝试添加一个人:jack,favoriteNumber:2,可以看到people数组索引为0的就是我们添加的jack

再添加一个Partrick,666,可以看到索引1的people就是Partrick

那如果想要通过名字知道某个人喜欢的数字呢,我们可以通过映射来实现

    People[] public people;

    mapping(string => uint256) public  nameToFavoriteNumber;
    ......

    function addPerson(string memory _name, uint256 _favoriteNumber) public {
        ......
        nameToFavoriteNumber[_name] = _favoriteNumber;
    }

我们定义了一个名为 nameToFavoriteNumber 的公开映射(mapping)。这个映射将 string 类型的键映射到 uint256 类型的值。

重新部署,先添加Partrick,666,然后可以通过nameToFavoritrNumber知道Partrick最喜欢的数字了

总结

完整代码

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.6.0;

contract SimpleStorage {

    uint256 favoriteNumber = 5;

    struct People{
        uint256 favoriteNumber;
        string name;
    }

    People[] public people;

    mapping(string => uint256) public  nameToFavoriteNumber;

    function store(uint256 _favorateNumber) public {
        favoriteNumber = _favorateNumber;
    }

    function retieve() public view returns(uint256){
        return favoriteNumber;
    }

    function addPerson(string memory _name, uint256 _favoriteNumber) public {
        people.push(People({favoriteNumber: _favoriteNumber, name: _name}));
        nameToFavoriteNumber[_name] = _favoriteNumber;
    }
}

这段代码定义了一个名为SimpleStorage的Solidity智能合约,它实现了以下几个功能:

  1. 状态变量存储
    • favoriteNumber:一个uint256类型的状态变量,用于存储一个无符号的256位整数。初始值为5。
  2. 结构体定义
    • People:一个结构体,包含两个字段:favoriteNumberuint256类型)和namestring类型)。用于表示一个人的喜好数字和姓名。
  3. 动态数组
    • people:一个People结构体的动态数组,用于存储多个People实例。这是一个公开的状态变量,可以从外部访问。
  4. 映射
    • nameToFavoriteNumber:一个从stringuint256的映射,用于根据人的姓名查找其喜好数字。这也是一个公开的状态变量。
  5. 函数
    • store:一个公开函数,接受一个uint256类型的参数_favorateNumber(注意这里有个拼写错误,应该是_favoriteNumber),并将其赋值给favoriteNumber状态变量。
    • retieve:一个公开且只读的函数,返回favoriteNumber状态变量的值。
    • addPerson:一个公开函数,接受一个string类型的参数_name和一个uint256类型的参数_favoriteNumber,创建一个新的People实例并将其添加到people数组中,同时更新nameToFavoriteNumber映射。

总的来说,这个合约允许用户存储和检索一个喜好数字,以及添加和查询人的姓名和喜好数字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值