主頁 > 區塊鏈 > solidity資料型別(四)storage memory calldata modifier前置條件 繼承 介面合約 匯入庫 using...for solc編譯

solidity資料型別(四)storage memory calldata modifier前置條件 繼承 介面合約 匯入庫 using...for solc編譯

2021-10-21 08:28:19 區塊鏈

1 資料存盤位置

資料測存盤型別有storage 和 memory
函式的傳入引數和回傳引數 都是 memory型別(external函式的入參為calldata型別,只可讀,不可重寫)
函式區域變數、合約狀態變數都是storage型別

memory總是會重新分配記憶體,不會釋放記憶體,當有重名未使用的變數時,不會利用前者記憶體空間,而會重新分配新的空間
memory資料的位置標注可以修改,資料可讀可修改

storage存盤在EVM的storage區域,在交易執行之后,storage區域的資料會寫回到合約賬戶的storage中
EVM的slot是32位元組,因此在存盤storage變數的時候,變數值小于32位元組時會把多個變數打包存放在一個slot中,大于32位元組的資料,slot中存放的是資料位元組長度+長度值的位元組數
多變數打包規則:
每一項都按低位對齊
基本資料型別選擇合適的位元組命名
struct和array會從一個新的slot開始存盤,但是strut和array內部的資料還是按照上述打包規則打包存入slot
例如:uint128 a;uint256 b;uint128 c; 按照多量打包的規則應該寫為:
uint128 a; uint128 c;uint256 b;

calldata的資料型別,標識的資料不能被修改也不能持久化
只能用于external函式的入參

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.4.0;
contract CalldataContract {
    
   function calldataTest(uint8 [] array) external pure returns (uint8) {
     assert(array.length > 0 && array.length <= 10);
     uint8 sum = 0;
    //  array[0] = 10;  //external的入參資料型別為calldata 只讀不可修改
     for(uint8 i=0;i<array.length;i++){
         sum += array[i];
     }
     return sum;
  }
   function memoryTest(uint8 [] array) public pure returns (uint8) {
     assert(array.length > 0 && array.length <= 10);
     uint8 sum = 0;
     array[0] = 10;     //array資料型別為storage存盤
     for(uint8 i=0;i<array.length;i++){
         sum += array[i];
     }
     return sum;
  }
}

在這里插入圖片描述
2 變數賦值

|資料型別|執行操作 |
|-----|–|
|1| 狀態變數->狀態變數 | 拷貝操作 |
|2| 狀態變數->區域storage變數 | 指標(參考) |
|3| 狀態變數->memory資料 | 拷貝操作 |
|4| 區域memory資料->狀態變數 | 拷貝操作 |
|5| 區域memory資料->區域memory資料 | 指標拷貝(參考拷貝) |
|6| 區域memory資料->區域storage資料 | X不能進行轉換 |
|7| 區域storage資料->狀態變數 | 拷貝操作 |
|8| 區域storage資料->區域memory變數 | 拷貝操作 |
|9| 區域storage資料->區域storage變數 | 指標拷貝(參考拷貝) |
拷貝操作中 B資料的修改不會影響A
指標操作中 B資料的修改會影響A

//狀態變數賦值給狀態變數 執行拷貝操作
contract StateToStateContract {
    uint8 [3] public arrayF = [1,2,3];
    uint8 [3] public arrayS;
    event LogUint8(uint8);
    function changeArray () public {
        uint8 i = 0;
        for(;i<3;i++){
           emit LogUint8(arrayF[i]);
        }
        arrayS = arrayF;
        arrayF[0] = 10;
        i=0;
        for(;i<3;i++){
           emit LogUint8(arrayS[i]);
        }
    } 
}

在這里插入圖片描述

/**
*  狀態變數賦值給區域storage變數 執行參考傳遞指標操作
**/
contract StateToStateContract {
    uint8 [3] public arrayF = [1,2,3];
    event LogUint8(uint8);
    function changeArray () public {
        uint8 [3] storage arrayS;
        uint8 i = 0;
        for(;i<3;i++){
           emit LogUint8(arrayF[i]);
        }
        arrayS = arrayF;
        arrayF[0] = 10;
        i=0;
        for(;i<3;i++){
           emit LogUint8(arrayS[i]);
        }
    } 
}

在這里插入圖片描述

/**
*  狀態變數賦值給區域memory變數 執行拷貝操作
**/
contract StateToStateContract {
    uint8 [3] public arrayF = [1,2,3];
    event LogUint8(uint8);
    function changeArray () public {
        uint8 [3] memory arrayS;
        uint8 i = 0;
        for(;i<3;i++){
           emit LogUint8(arrayF[i]);
        }
        arrayS = arrayF;
        arrayF[0] = 10;
        i=0;
        for(;i<3;i++){
           emit LogUint8(arrayS[i]);
        }
    } 
}

在這里插入圖片描述

/**
*  區域memory變數賦值給區域memory變數  執行參考傳遞指標操作
**/
contract StateToStateContract {
    event LogUint8(uint8);
    function changeArray () public {
        uint8 [3] memory arrayF = [1,2,3];
        uint8 [3] memory arrayS;
        uint8 i = 0;
        for(;i<3;i++){
           emit LogUint8(arrayF[i]);
        }
        arrayS = arrayF;
        arrayF[0] = 10;
        i=0;
        for(;i<3;i++){
           emit LogUint8(arrayS[i]);
        }
    } 
}

在這里插入圖片描述

/**
區域memory變數賦值給狀態變數 執行拷貝操作
**/

在這里插入圖片描述

/**
區域storage變數賦值給狀態變數 執行拷貝操作
**/

contract StateToStateContract {
    uint8 [3] public arrayF = [1,2,3];
    uint8 [3] public arrayS;
    event LogUint8(uint8);
    function changeArray () public {
    uint8 [3] storage array = arrayF;
    arrayS=array;
        uint8 i = 0;
        for(;i<3;i++){
           emit LogUint8(arrayF[i]);
        }
        array[0] = 10;
        i=0;
        for(;i<3;i++){
           emit LogUint8(arrayS[i]);
        }
    } 
}

在這里插入圖片描述

/**
區域storage變數賦值給區域storage變數 執行指標參考操作
**/

在這里插入圖片描述

/**
區域storage變數賦值給區域memory變數 執行拷貝操作
**/

在這里插入圖片描述
3 函式修改器

modifier修飾符標識函式修改器 有函式名稱 可以接受引數,方法內部的_;為修飾函式插入的地方
用來檢查函式運行的前置條件和后置的清理作業
示例代碼:
判斷當前陳述句的執行地址需要是合約部署的賬戶地址
在切換賬戶后,再次執行應該報錯

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.4.0;
contract ModifierContract {
	uint public a = 0;
	address owner = msg.sender;
	event LogStringUint(string id,uint data);

	modifier modifierA(uint arga) { 
        emit LogStringUint("modifierA before a=:",a);
        emit LogStringUint("modifierA before arga=:",arga);
        //identity msg 
        require(owner==msg.sender,"not satisfify identity");
		_;
		emit LogStringUint("modifierA after a=:",a);
		emit LogStringUint("modifierA after arga=:",arga);
	}

	function modifierTest () public modifierA(a) returns(uint res) {
	    emit LogStringUint("modifierTest1 a:",a);
		a = 5;
		emit LogStringUint("modifierTest2 a:",a);
		return a;
	}
}

在這里插入圖片描述

切換賬戶執行合約
不滿足require判斷,會報錯

在這里插入圖片描述

一個函式可以使用多個修改器驗證前置條件,前置條件的驗證順序按照修改器順序執行,后置條件的清理按照修改器逆向順序執行 即前置和后置條件的執行順序相反,先執行前置條件的最后執行后置條件

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.4.0;
contract ModifierSummaryContract {
	uint public a = 0;
	event LogStringUint(string id,uint data);
	modifier modifierA(uint arga) { 
        emit LogStringUint("modifierA before a=:",a);
        emit LogStringUint("modifierA before arga=:",arga);
		_;
		emit LogStringUint("modifierA after a=:",a);
		emit LogStringUint("modifierA after arga=:",arga);
	}
	modifier modifierB { 
        emit LogStringUint("modifierB before a=:",a);
     //   return;
		_;
		emit LogStringUint("modifierB after a=:",a);
	}
	function modifierTest () public modifierA(10) modifierB returns(uint res) {
	    emit LogStringUint("modifierTest1 a:",a);
		a = 5;
		emit LogStringUint("modifierTest2 a:",a);
		return a;
	}
}

執行的日志:

[
{
“from”: “0x417Bf7C9dc415FEEb693B6FE313d1186C692600F”,
“topic”: “0xfb812593d6d1d6fbf5e981f61205a76acc217dd9dcc7b95c4f58247fb09f2658”,
“event”: “LogStringUint”,
“args”: {
“0”: “modifierA before a=:”,
“1”: “0”,
“id”: “modifierA before a=:”,
“data”: “0”
}
},
{
“from”: “0x417Bf7C9dc415FEEb693B6FE313d1186C692600F”,
“topic”: “0xfb812593d6d1d6fbf5e981f61205a76acc217dd9dcc7b95c4f58247fb09f2658”,
“event”: “LogStringUint”,
“args”: {
“0”: “modifierA before arga=:”,
“1”: “10”,
“id”: “modifierA before arga=:”,
“data”: “10”
}
},
{
“from”: “0x417Bf7C9dc415FEEb693B6FE313d1186C692600F”,
“topic”: “0xfb812593d6d1d6fbf5e981f61205a76acc217dd9dcc7b95c4f58247fb09f2658”,
“event”: “LogStringUint”,
“args”: {
“0”: “modifierB before a=:”,
“1”: “0”,
“id”: “modifierB before a=:”,
“data”: “0”
}
},
{
“from”: “0x417Bf7C9dc415FEEb693B6FE313d1186C692600F”,
“topic”: “0xfb812593d6d1d6fbf5e981f61205a76acc217dd9dcc7b95c4f58247fb09f2658”,
“event”: “LogStringUint”,
“args”: {
“0”: “modifierTest1 a:”,
“1”: “0”,
“id”: “modifierTest1 a:”,
“data”: “0”
}
},
{
“from”: “0x417Bf7C9dc415FEEb693B6FE313d1186C692600F”,
“topic”: “0xfb812593d6d1d6fbf5e981f61205a76acc217dd9dcc7b95c4f58247fb09f2658”,
“event”: “LogStringUint”,
“args”: {
“0”: “modifierTest2 a:”,
“1”: “5”,
“id”: “modifierTest2 a:”,
“data”: “5”
}
},
{
“from”: “0x417Bf7C9dc415FEEb693B6FE313d1186C692600F”,
“topic”: “0xfb812593d6d1d6fbf5e981f61205a76acc217dd9dcc7b95c4f58247fb09f2658”,
“event”: “LogStringUint”,
“args”: {
“0”: “modifierB after a=:”,
“1”: “5”,
“id”: “modifierB after a=:”,
“data”: “5”
}
},
{
“from”: “0x417Bf7C9dc415FEEb693B6FE313d1186C692600F”,
“topic”: “0xfb812593d6d1d6fbf5e981f61205a76acc217dd9dcc7b95c4f58247fb09f2658”,
“event”: “LogStringUint”,
“args”: {
“0”: “modifierA after a=:”,
“1”: “5”,
“id”: “modifierA after a=:”,
“data”: “5”
}
},
{
“from”: “0x417Bf7C9dc415FEEb693B6FE313d1186C692600F”,
“topic”: “0xfb812593d6d1d6fbf5e981f61205a76acc217dd9dcc7b95c4f58247fb09f2658”,
“event”: “LogStringUint”,
“args”: {
“0”: “modifierA after arga=:”,
“1”: “10”,
“id”: “modifierA after arga=:”,
“data”: “10”
}
}
]

修改器中可以包含return ,return陳述句之后的修改器不觸發
再修改器函式return后,執行return之前的修改器的后置清理條件

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.4.0;
contract ModifierSummaryContract {
	uint public a = 0;
	event LogStringUint(string id,uint data);
	modifier modifierA(uint arga) { 
        emit LogStringUint("modifierA before a=:",a);
        emit LogStringUint("modifierA before arga=:",arga);
		_;
		emit LogStringUint("modifierA after a=:",a);
		emit LogStringUint("modifierA after arga=:",arga);
	}
	modifier modifierB { 
        emit LogStringUint("modifierB before a=:",a);
        //return;
		_;
		emit LogStringUint("modifierB after a=:",a);
	}
	modifier modifierC { 
        emit LogStringUint("modifierC before a=:",a);
        return;  //return之后的陳述句不在執行,回傳執行前面兩個修飾器的后置條件
		_;
		emit LogStringUint("modifierC after a=:",a);
	}
	//C中有return  執行順序 A前置 B前置 Creturn 之前的陳述句 B后置 A后置
	function modifierTest () public modifierA(10) modifierB modifierC returns(uint res) {
	    emit LogStringUint("modifierTest1 a:",a);
		a = 5;
		emit LogStringUint("modifierTest2 a:",a);
		return a;
	}
}

執行的日志:

[
{
“from”: “0xDf9D0C45d97f134151a386E0AA23b09CA903c13f”,
“topic”: “0xfb812593d6d1d6fbf5e981f61205a76acc217dd9dcc7b95c4f58247fb09f2658”,
“event”: “LogStringUint”,
“args”: {
“0”: “modifierA before a=:”,
“1”: “0”,
“id”: “modifierA before a=:”,
“data”: “0”
}
},
{
“from”: “0xDf9D0C45d97f134151a386E0AA23b09CA903c13f”,
“topic”: “0xfb812593d6d1d6fbf5e981f61205a76acc217dd9dcc7b95c4f58247fb09f2658”,
“event”: “LogStringUint”,
“args”: {
“0”: “modifierA before arga=:”,
“1”: “10”,
“id”: “modifierA before arga=:”,
“data”: “10”
}
},
{
“from”: “0xDf9D0C45d97f134151a386E0AA23b09CA903c13f”,
“topic”: “0xfb812593d6d1d6fbf5e981f61205a76acc217dd9dcc7b95c4f58247fb09f2658”,
“event”: “LogStringUint”,
“args”: {
“0”: “modifierB before a=:”,
“1”: “0”,
“id”: “modifierB before a=:”,
“data”: “0”
}
},
{
“from”: “0xDf9D0C45d97f134151a386E0AA23b09CA903c13f”,
“topic”: “0xfb812593d6d1d6fbf5e981f61205a76acc217dd9dcc7b95c4f58247fb09f2658”,
“event”: “LogStringUint”,
“args”: {
“0”: “modifierC before a=:”,
“1”: “0”,
“id”: “modifierC before a=:”,
“data”: “0”
}
},
{
“from”: “0xDf9D0C45d97f134151a386E0AA23b09CA903c13f”,
“topic”: “0xfb812593d6d1d6fbf5e981f61205a76acc217dd9dcc7b95c4f58247fb09f2658”,
“event”: “LogStringUint”,
“args”: {
“0”: “modifierB after a=:”,
“1”: “0”,
“id”: “modifierB after a=:”,
“data”: “0”
}
},
{
“from”: “0xDf9D0C45d97f134151a386E0AA23b09CA903c13f”,
“topic”: “0xfb812593d6d1d6fbf5e981f61205a76acc217dd9dcc7b95c4f58247fb09f2658”,
“event”: “LogStringUint”,
“args”: {
“0”: “modifierA after a=:”,
“1”: “0”,
“id”: “modifierA after a=:”,
“data”: “0”
}
},
{
“from”: “0xDf9D0C45d97f134151a386E0AA23b09CA903c13f”,
“topic”: “0xfb812593d6d1d6fbf5e981f61205a76acc217dd9dcc7b95c4f58247fb09f2658”,
“event”: “LogStringUint”,
“args”: {
“0”: “modifierA after arga=:”,
“1”: “10”,
“id”: “modifierA after arga=:”,
“data”: “10”
}
}
]

4合約繼承

solodity合約的繼承是使用關鍵字is
當一個合約繼承另一個合約時,只會部署一個合約,子合約會復制父合約的代碼
建構式的引數傳遞可以在繼承時傳遞
在繼承時傳遞或者通過構造器在建構式時傳遞

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.4.0;
contract LevelOne {
    uint8 num;
    constructor(uint8 numArg) public{
        num = numArg;
    }
    event LogUint8(string,uint8);
    function printNum() public {
       emit LogUint8("LevelOne",num);
    }
}
//繼承時傳遞引數
contract LevelTwoOne is LevelOne(2){
    //重寫父合約的方法
    function printNum() public {
       emit LogUint8("LevelTwoOne",num);
    }
}
//建構式中傳遞引數
contract LevelTwoTwo is LevelOne{
    constructor() LevelOne(31) public{
        
    }
    //重寫父合約的方法
    function printNum() public {
       emit LogUint8("LevelTwoTwo",num);
    }
}
//在建構式中傳遞引數,呼叫父合約的PrintNum方法
contract LevelTwoThree is LevelOne{
    constructor() LevelOne(31) public{
        
    }
}

LevelTwoOne 部署日志:

[
{
“from”: “0xa42b1378D1A84b153eB3e3838aE62870A67a40EA”,
“topic”: “0xa9b4ee9b4192341ff2079d8152ddc2cdebd57d8a9df0609fa13cff40ef51d1f7”,
“event”: “LogUint8”,
“args”: {
“0”: “LevelTwoOne”,
“1”: 2
}
}
]

LevelTwoTwo 部署日志:

[
{
“from”: “0x3cA38E089Cd3BF3cF24Dabc40dF0c988075b2729”,
“topic”: “0xa9b4ee9b4192341ff2079d8152ddc2cdebd57d8a9df0609fa13cff40ef51d1f7”,
“event”: “LogUint8”,
“args”: {
“0”: “LevelTwoTwo”,
“1”: 31
}
}
]

LevelTwoThree 部署日志:

[
{
“from”: “0xa6165bbb69f7e8f3d960220B5F28e990ea5F630D”,
“topic”: “0xa9b4ee9b4192341ff2079d8152ddc2cdebd57d8a9df0609fa13cff40ef51d1f7”,
“event”: “LogUint8”,
“args”: {
“0”: “LevelOne”,
“1”: 31
}
}
]

函式繼承多個函式時,后面的函式會重寫前面的函式方法
super關鍵字,當使用super時,呼叫的是繼承的該函式

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.4.0;
contract LevelOneOne{
    event LogString(string);
    function printNum() public {
      emit LogString("LevelOneOne");
    }
}

contract LevelOneTwo{
    event LogString(string);
    function printNum() public {
      emit LogString("LevelOneTwo");
    }
}
   //同時繼承多個合約時,后面的合約會重寫前面合約的同名方法
contract LevelTwoOne is LevelOneOne,LevelOneTwo{
    function printNum() public {
      emit LogString("LevelTwoone");
    }
    //super關鍵字標識 方法為繼承的方法
    //同時繼承多個合約時,后面的合約會重寫前面合約的同名方法
    function testSuper() public {
        super.printNum();
    }
}

contract LevelTwoTwo is LevelOneTwo,LevelOneOne{
    //override function 
    function printNum() public {
      emit LogString("LevelTwoTwo");
    }
    //super- function is  contract-inherited 's function 
    function testSuper() public {
        super.printNum();
    }
}

LevelTwoOne部署日志
printNum()日志:

[
{
“from”: “0xC1144C9dbf6F3489CE9C808a1Da653FB4465403d”,
“topic”: “0xa95e6e2a182411e7a6f9ed114a85c3761d87f9b8f453d842c71235aa64fff99f”,
“event”: “LogString”,
“args”: {
“0”: “LevelTwoone”
}
}
]

testSuper()日志:

[
{
“from”: “0xC1144C9dbf6F3489CE9C808a1Da653FB4465403d”,
“topic”: “0xa95e6e2a182411e7a6f9ed114a85c3761d87f9b8f453d842c71235aa64fff99f”,
“event”: “LogString”,
“args”: {
“0”: “LevelOneTwo”
}
}
]

LevelTwoTwo部署日志
printNum()日志:

[
{
“from”: “0xC8CF29d9D1595a3588AD36E6349A0E9a5b632720”,
“topic”: “0xa95e6e2a182411e7a6f9ed114a85c3761d87f9b8f453d842c71235aa64fff99f”,
“event”: “LogString”,
“args”: {
“0”: “LevelTwoTwo”
}
}
]

testSuper()日志:

[
{
“from”: “0xC8CF29d9D1595a3588AD36E6349A0E9a5b632720”,
“topic”: “0xa95e6e2a182411e7a6f9ed114a85c3761d87f9b8f453d842c71235aa64fff99f”,
“event”: “LogString”,
“args”: {
“0”: “LevelOneOne”
}
}
]

抽象合約
如果一個合約中至少有一個方法沒有被實作,那么這個合約就是抽象合約
抽象合約無法被編譯部署
一個合約繼承了抽象合約但是沒有實作抽象合約內方法的話,也會被定義為抽象合約
抽象合約中有幾個為實作的方法,繼承的子合約中就需要實作幾個方法

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.4.0;
/**
 * 抽象合約 
 */
contract CalcContract{
    constructor()public{
        
    }
    //定義抽象方法
    function calc(uint8 a,uint8 b) public view returns(uint8);
   // function minus(uint8 a,uint8 b) public returns(uint8);
    function mul(uint a,uint b)public pure returns(uint){
        return a*b;
    }
}
// /**
//  * 繼承抽象合約
//  */
contract Add is CalcContract{
    //實作抽象方法
     function calc(uint8 a,uint8 b) public view returns(uint8){
         return a + b;
     }
     function getBalance()public view returns(address addr,uint256 num){
         //return(msg.sender,msg.sender.balance);
         return(address(this),address(this).balance); 
     }
}

介面合約
介面合約和抽象合約類似 定義合約方法 用于子合約繼承實作
介面合約比較嚴格
不能繼承其它合約和介面
不能定義建構式
不能定義結構體
不能定義變數
不能定義列舉
可以定義事件,通過emit拋出

5 solidity庫

通過library 關鍵字標識solidity庫
庫的呼叫方式是delegatecall方式

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.4.0;
library TestLibrary{
    struct Student{
        uint32 id;
        string name;
    }
	function add(uint8 a,uint8 b) public pure returns(uint8) {
		return a + b;
	}
}

contract RefLibrary{
    TestLibrary.Student tim = TestLibrary.Student(1,"tim");
    function getTim() public view returns(uint32,string){
        return(tim.id,tim.name);
    }
    function callAdd(uint8 a,uint8 b) public pure returns(uint8){
        return TestLibrary.add(a,b);
    }
}

引入solidity庫
通過import引入目錄下的sol合約

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.4.0;
import "./Calc.sol";
import "./AddLib.sol";
contract AddCalc is Calc{
 function calc (uint a,uint b)public pure returns(uint){
     return AddLib.add(a,b);
 }
}

using…for
讓庫函式attach到指定的型別上,指定的型別具備庫函式的方法

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.4.0;
library CalcLib {
    function add(uint8 a, uint8 b) public pure returns(uint8){
    	return a + b;
    }
    function sub(uint8 a, uint8 b) public pure returns(uint8){
    	return a - b;
    }
}

contract UsingForContract {
    using CalcLib for uint8;
    function add(uint8 a,uint8 b) public pure returns(uint8) {
    	return a.add(b);
    } 
    function sub(uint8 a,uint8 b) public pure returns(uint8) {
    	return a.sub(b);
    }  
}
// // SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.4.0;
library CalcLib{
    function sum(uint8[] storage arrs)public view returns(uint8){
        uint8 totls=0;
        for(uint8 i=0;i<arrs.length;i++){
            totls+=arrs[i];
        }
        return totls;
    }
}
contract usingForContract{
    using CalcLib for uint8[];
    uint8[] array=[2,3,4,5];
    function sum()public view returns(uint8){
        return array.sum();
    }
}

6 solc編譯合約

solc -o build --combined-json abi,bin getNum.sol
-o引數表示輸出目錄的名稱 --combined-json以json的形式組合輸出后面的問價 abi介面 bin十六進制輸出合約的位元組碼
solc -o build --abi --bin getNum.sol

合約中有匯入庫的情況時:
在編譯合約時需要設定匯入合約的檔案前綴
solc /=/ Hello.sol
舉例 import “/lib/sub/Sub.sol”
solc /lib/sub=/lib/sub Hello.sol

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/328172.html

標籤:區塊鏈

上一篇:香gang正大琪貨;開主巾賬戶為什么一定要香gang卡

下一篇:Trister‘s Lend告訴你如何選對借貸平臺

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more