目次
Ethereum で実行できるスマート コントラクトになるには、Solidity ソース コードは次の手順を実行する必要があります。
注意: 警告: SPDX ライセンス識別子がソース ファイルに提供されていません
エラー: TypeError: データの場所は、関数内のパラメーターの "memory" または "calldata" である必要がありますが、指定されていません
Ethereum で実行できるスマート コントラクトになるには、Solidity ソース コードは次の手順を実行する必要があります。
- Solidityで書かれたスマートコントラクトのソースコードは、まずコンパイラでバイトコード(Bytecode)にコンパイルする必要があり、その間にスマートコントラクトのバイナリインターフェース仕様(Application Binary Interface、略してABI)が同時に生成されます。コンパイルプロセス;
- トランザクション (トランザクション)を介してバイトコードをEthereum ネットワークにデプロイします。デプロイが成功するたびに、新しいスマート コントラクト アカウントが生成されます。
- 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);
}
}
}