堅牢性 + 例

目次

Ethereum で実行できるスマート コントラクトになるには、Solidity ソース コードは次の手順を実行する必要があります。

Solidity コンパイラ

リミックス

ソルクス

 注意: 警告: SPDX ライセンス識別子がソース ファイルに提供されていません

 エラー: TypeError: データの場所は、関数内のパラメーターの "memory" または "calldata" である必要がありますが、指定されていません

 ケースナンバーワン

ケース2 


Ethereum で実行できるスマート コントラクトになるには、Solidity ソース コードは次の手順を実行する必要があります。

  1. Solidityで書かれたスマートコントラクトのソースコードは、まずコンパイラでバイトコード(Bytecode)にコンパイルする必要があり、その間にスマートコントラクトのバイナリインターフェース仕様(Application Binary Interface、略してABI)が同時に生成されます。コンパイルプロセス;
  2. トランザクション (トランザクション)を介してバイトコードをEthereum ネットワークにデプロイします。デプロイが成功するたびに、新しいスマート コントラクト アカウントが生成されます。
  3. Javascript で記述された DApps は通常、web3.js + ABI を使用してスマート コントラクト内の関数を呼び出しデータの読み取りと変更を行います

Solidity コンパイラ

リミックス

  • Remix は Web ブラウザー ベースの Solidity IDE で、何もインストールせずにオンラインで利用できます
  • http://remix.ethereum.org

ソルクス

  •  solc は、Solidity ソース コード ライブラリのビルド ターゲットの 1 つであり、Solidity のコマンドライン コンパイラです。
  • Solidity コンパイラ solicjs は npm を使用して簡単にインストールできます
npm install -g solc
# -g是全局安装,也可以不加自己选择目的文件夹

注意: 警告: SPDX ライセンス識別子がソース ファイルに提供されていません

エラー:警告: SPDX ライセンス識別子がソース ファイルに提供されていません。公開する前に、「SPDX-License-Identifier: <SPDX-License>」を含むコメントを各ソース ファイルに追加することを検討してください。非オープンソース コードには「SPDX-License-Identifier: UNLICENSED」を使用します。詳細については、https://spdx.org を参照してください。 

原因: SPDX ライセンスは、Solidity ^0.6.8 から導入されました。したがって、コードで SPDX-License-Identifier を使用する必要があります

解決策: .sol ファイルの最初の文を追加します。 

// SPDX-License-Identifier: MIT

 エラー: TypeError: データの場所は、関数内のパラメーターの "memory" または "calldata" である必要がありますが、指定されていません

理由:これは solidity バージョン 0.5.0 の更新が原因です.文字列が使用された後にのみメモリを追加する

解決:

 ケースナンバーワン

// 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);
    }
}

ケース2 

// 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;
    }
}

ケース3

// 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);
    }
}

ケース4

// 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);
        }
    }
}

おすすめ

転載: blog.csdn.net/m0_46262108/article/details/123316069