智慧合約DAPP系統技術開發(功能邏輯講解)

aa111111發表於2023-09-22

Solidity提供了bytes1到bytes32的型別,它們是固定長度的位元組陣列。


使用者可以讀取定長bytes的內容。


function bytesSample() public{


        bytes32 barray;

        //Initialize baarray

        //read brray[0]

        byte b = barray[0];

    }

並且,可以將整數型別轉換為bytes。


uint256 s = 1;

        bytes32 b = bytes32(s);

1.

2.

這裡有一個關鍵細節,Solidity採取大端序編碼,高地址存的是整數的小端。


例如,


b[0]是低地址端,它存整數的高階,所以值為0;


取b[31]才是1。


function bytesSample() public pure returns(byte, byte){


        uint256 value = 1;

        bytes32 b = bytes32(value);

        //Should be (0, 1)

        return (b[0], b[31]);

    }


  變長bytes

從上文中,讀者可瞭解定長byte陣列。此外,Solidity還提供了一個變長byte陣列:bytes。使用方式類似陣列,後文會有介紹。


  string

Solidity提供的string,本質是一串經UTF-8編碼的位元組陣列,它相容於變長bytes型別。


目前Solidity對string的支援不佳,也沒有字元的概念。使用者可以將string轉成bytes。


function stringSample() public view returns(bytes){

        string memory str = "abc";

        bytes memory b = bytes(str);

        //0x616263

        return b;

    }

要注意的是,當將string轉換成bytes時,資料內容本身不會被複製,如上文中,str和b變數指向的都是同一個字串abc。


  address

address表示賬戶地址,它由私鑰間接生成,是一個20位元組的資料。同樣,它也可以被轉換為bytes20。


function addressSample() public view returns(bytes20){


        address me = msg.sender;

        bytes20 b = bytes20(me);

        return b;

    }

  mapping

mapping表示對映, 是極其重要的資料結構。它與java中的對映存在如下幾點差別:


它無法迭代keys,因為它只儲存鍵的雜湊,而不儲存鍵值,如果想迭代,可以用開源的可迭代雜湊類庫


如果一個key未被儲存在mapping中,一樣可以正常讀取到對應value,只是value是空值(位元組全為0)。所以它也不需要put、get等操作,使用者直接去操作它即可。


contract Sample{


    mapping(uint=>string) private values;


    function mappingSample() public view returns(bytes20){

        //put a key value pair

        values[10] = "hello";


        //read value

        string value = values[10];


    }


}

  陣列

如果陣列是狀態變數,那麼支援push等操作:contract Sample{


string[] private arr;


    function arraySample() public view {

        arr.push("Hello");

        uint len = arr.length;//should be 1

        string value = arr[0];//should be Hello

      }


}

陣列也可以以區域性變數的方式使用,但稍有不同:


function arraySample() public view returns(uint){

        //create an empty array of length 2

        uint[] memory p = new uint[](2);

        p[3] = 1;//THIS WILL THROW EXCEPTION 

        return p.length;

}

  struct

Solidity允許開發者自定義結構物件。結構體既可以作為狀態變數儲存,也可以在函式中作為區域性變數存在。  




struct Person{

        uint age;

        string name;

    }


    Person private _person;


    function structExample() {

        Person memory p = Person(1, "alice");

        _person = p;

    }

全域性變數

示例合約程式碼的建構函式中,包含msg.sender。它屬於全域性變數。


在智慧合約中,全域性變數或全域性方法可用於獲取和當前區塊、交易相關的一些基本資訊,如塊高、塊時間、合約呼叫者等。


比較常用的全域性變數是msg變數,表示呼叫上下文,常見的全域性變數有以下幾種:


msg.sender:合約的直接呼叫者。


由於是直接呼叫者,所以當處於 使用者A->合約1->合約2 呼叫鏈下,若在合約2內使用msg.sender,得到的會是合約1的地址。如果想獲取使用者A,可以用tx.origin.


tx.origin:交易的"始作俑者",整個呼叫鏈的起點。


msg.calldata:包含完整的呼叫資訊,包括函式標識、引數等。calldata的前4位元組就是函式標識,與msg.sig相同。


msg.sig:msg.calldata的前4位元組,用於標識函式。


block.number:表示當前所在的區塊高度。


now:表示當前的時間戳。也可以用block.timestamp表示。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010128/viewspace-2985377/,如需轉載,請註明出處,否則將追究法律責任。

相關文章