IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> Solidity + 案例 -> 正文阅读

[区块链]Solidity + 案例

目录

Solidity 源代码要成为可以运行在以太坊上的智能合约需要经历如下的步骤

Solidity编译器

Remix

solcjs

?问题:Warning: SPDX license identifier not provided in source file

?问题:TypeError: Data location must be "memory" or "calldata" for parameter in function, but none was give

?案例一

案例二?


Solidity 源代码要成为可以运行在以太坊上的智能合约需要经历如下的步骤

  1. 用 Solidity 编写的智能合约源代码需要先使用编译器编译为字节码( Bytecode ),编译过程中会同时产生智能合约的二进制接口规范( Application Binary Interface ,简称 ABI );
  2. 通过交易( Transaction )的方式将字节码部署到以太坊网络,每次成功部署都会产生产生一个新的智能合约账户
  3. 使用 Javascript 编写的 DApp 通常通过 web3.js + ABI 去调用智能合约中的函数来实现数据的读取和修改

Solidity编译器

Remix

solcjs

  • ?solc 是 Solidity 源码库的构建目标之一,它是 Solidity 的命令行编译器
  • 使用 npm 可以便捷地安装 Solidity 编译器 solicjs
npm install -g solc
# -g是全局安装,也可以不加自己选择目的文件夹

问题:Warning: SPDX license identifier not provided in source file

问题:Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information.?

原因:从 Solidity ^0.6.8 引入 SPDX 许可证。所以你需要在代码中使用SPDX-License-Identifier

解决方案:在.sol文件第一句加上?

// SPDX-License-Identifier: MIT

?问题:TypeError: Data location must be "memory" or "calldata" for parameter in function, but none was give

原因:这是由于solidity 0.5.0版本的更新导致的,只需要在用到 string 的时候,在后面加上 memory 就可以了

解决方法:

?案例一

// SPDX-License-Identifier: MIT
// pragma solidity >0.4.22 <0.5.0;
pragma solidity ^0.8.3;
contract SimpleStorage{
    uint myData;
    function setData(uint newData) public{
        myData = newData;
    
    }
    // 返回值类型需要加上 returns + 返回值类型, 例如 returns(uint)
    // view 表示只读不写
    function getData() public view returns(uint){
        return myData;
    }

    // 返回两个数
    function pureAdd(uint a,uint b) public pure returns(uint sum, uint _a){
        return (a + b, a);
    }
}

案例二?

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;
contract Car{
    string brand;       // 车牌
    uint public price;     // 价格

    // 构造函数,合约创建时自动调用
    constructor(string memory initBrand,uint initPrice){
        brand = initBrand;
        price = initPrice;
    }

    function setBrand(string memory newBrand) public {
        brand = newBrand;
    }

    function getBrand() public view returns(string memory){
        return brand;
    }

    function setPrice(uint newPrice) public {
        price = newPrice;
    }
}

案例三

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

contract Coin{
    address public minter;  // 铸币者
    mapping(address => uint) public balances;    // 所有账号
    event Sent(address from,address to,uint amount);

   /**
    * 功能: 初始化
    */
    constructor(){
        minter = msg.sender;
    }

   /**
    * 功能: 铸币
    * @param receiver
    * @param amount
    */
    function mint(address receiver, uint amount) public{
        // 调用铸币的人必须是规定的铸币人
        require(msg.sender == minter);
        // 铸币人的 账户余额 += amount
        balances[receiver] += amount;
    }

   /**
    * 功能: 发币
    * @param receiver
    * @param amount
    */
    function send(address receiver, uint amount) public{
        // msg.sender 代表调用这个函数的人
        // 发币人的账户要大于等于 amount
        require(balances[msg.sender] >= amount);
        // 发币人的 账户余额 -= amount
        balances[msg.sender] -= amount;
        // 接收人的 账户余额 += amount
        balances[receiver] += amount;
        emit Sent(msg.sender, receiver, amount);
    }
}

案例四

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

contract Try{
    uint public a;
    uint public b;
    uint[] public data;
    function f() public{
        uint[] storage x = data;
        x.push(2);
        data = x;
    }
}

contract FakeHoneyPot{
    uint public luckyNum = 12;
    struct Guess{
        address player;
        uint number;
    }
    Guess[] guessHistory;
    address owner = msg.sender;
    function guess(uint _num) public payable{
        guessHistory.push(Guess({
            player:msg.sender,
            number:_num
        }));
        if(_num == luckyNum){
            payable(msg.sender).transfer(msg.value * 2);
        }
    }
}

  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:27:08  更:2022-03-16 22:27:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:57:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码