https://blog.csdn.net/weixin_45067603/article/details/105726491
1.### 整型
int
/ uint
:分別表示有符號和無符號的不同位數(shù)的整型變量挠铲。 支持關(guān)鍵字 uint8
到 uint256
(無符號疾嗅,從 8 位到 256 位)以及 int8
到 int256
玻粪,以 8
位為步長遞增愈污。 uint
和 int
分別是 uint256
和 int256
的別名琼蚯。
2.### 定長字節(jié)數(shù)組
關(guān)鍵字有:bytes1地粪, bytes2首量, bytes3荞驴, …不皆, bytes32。 byte 是 bytes1 的別名熊楼。
成員變量:
.length 表示這個字節(jié)數(shù)組的長度(只讀).
變長字節(jié)數(shù)組
bytes
變長字節(jié)數(shù)組霹娄,參見 數(shù)組。它并不是值類型孙蒙。
string
變長 UTF-8 編碼字符串類型项棠,參見 數(shù)組。并不是值類型挎峦。
字符串 轉(zhuǎn) 動態(tài)數(shù)組
string str = "mystr";
bytes b = bytes(str);
動態(tài)數(shù)組 轉(zhuǎn) 字符串
bytes bs = 0x7a4892;
string str = string(b);
定長字節(jié)數(shù)組之前可以互相轉(zhuǎn)換
bytes1 b1= 0x7a;
bytes2 b2=bytes2(b1);
定長字節(jié)數(shù)組 轉(zhuǎn) 動態(tài)字節(jié)數(shù)組
image.png
固定長度數(shù)組:
1.如果不賦值香追,那么默認(rèn)所有位均為0
2.支持直接使用.length查看數(shù)組長度,但不支持對數(shù)組長度做修改
3.不支持通過.push添加數(shù)據(jù)
contract fixedarrtest{
uint[3] testarr1;//不進(jìn)行賦值直接聲明數(shù)組
uint[3] testarr2=[1,2,3];//聲明數(shù)組并進(jìn)行賦值
function showarr1() public view returns(uint[3]){
return testarr1; //如果不賦值坦胶,那么默認(rèn)所有位均為0
}
function showarr2() public view returns(uint[3]){
return testarr2;
}
function initarr() public{
testarr1[0]=12;//進(jìn)行賦值操作
}
function lengthtest() public view returns(uint){
return testarr1.length;//solidity支持直接查看數(shù)組長度
}
可變數(shù)組:
1.支持直接使用.length查看數(shù)組長度透典,也支持對數(shù)組長度做修改。
將數(shù)組長度縮小則會從前往后保留
將數(shù)組長度增長則后面原本沒有值的位會被默認(rèn)置0
2.支持直接通過.push方法在末尾添加數(shù)值
contract dynamicarrtest{
uint[] testarr=[1,2,3,4,5];
function showarr() public view returns (uint[]){
return testarr;
}
function changearr() public{
//for(uint i=0;i<5;i++){
testarr[0] = 2;//如果不使0位有值顿苇,那么該函數(shù)無用
//}
}
function lengthtest() public view returns(uint){
return testarr.length;
}
function changelengthtest1() public{
testarr.length=1;
}
function changelengthtest2() public{
testarr.length=10;//變長之后后面默認(rèn)置0
}
function pushtest() public{
testarr.push(6);//可變數(shù)組支持此操作
}
}
二維數(shù)組
1.初始化時峭咒,uint[ i ] [ j ]表示有j個元素,每個元素包含i個值(和其他許多語言不同)
2.二維數(shù)組可以直接獲取長度纪岁,既可以獲得所有元素個數(shù)凑队,也可以獲得單獨(dú)元素有多少值
3.對二維數(shù)組進(jìn)行增刪改等操作時時是與初始化時反過來的,即uint[ i ] [ j ]表示第i個元素的第j個值(和其他許多語言一樣)
4.不支持push方法幔翰,也不支持對長度進(jìn)行修改
pragma solidity ^0.4.0;
contract TwoArray{
// 定義二維數(shù)組 3行2列: 3個元素 每個元素里有2個值
uint[2][3] grade = [[1,2],[3,4],[6,5]];
//獲取行數(shù)
function getOneLength() returns(uint){
return grade.length; // 3
}
// 獲取列數(shù)
function getTwoLength() returns(uint){
return grade[0].length; //2
}
// 獲取值
function getData() returns(uint[2][3]){
return grade;
}
//求和
function getSum() returns(uint){
uint sum = 0;
for(uint i = 0; i < grade.length; i++){
for(uint j = 0; j < grade[i].length; j++){
sum += grade[i][j];
}
}
return sum;
}
// 改變數(shù)組的值 : 改變第一個元素的第二個值
function changeData() {
grade[1][2] = 100;
}
}
地址類型成員變量
1.以太坊中的地址的長度為20字節(jié)漩氨,一字節(jié)等于8位,一共160位遗增,所以address其實亦可以用uint160來聲明叫惊。比如:0x5B38Da6a701c568545dCfcB03FcB875f56beddC4轉(zhuǎn)uint160就是520786028573371803640530888255888666801131675076(16進(jìn)制轉(zhuǎn)10進(jìn)制)
2.地址之間支持大小比較
1.可以通過地址.balance獲取某個地址的余額
2.this指的是當(dāng)前合約的地址,如此處就是paytest合約的地址
3.轉(zhuǎn)賬可以通過remix圖形界面來進(jìn)行轉(zhuǎn)賬數(shù)目的改變
4.對其他賬戶的轉(zhuǎn)賬需要使用賬戶名稱.transfer(msg.value)或者賬戶名稱.transfer(數(shù)量 單位做修,如1 ether)如果在輸入value的同時又寫的是數(shù)量 單位霍狰,那么多余的value就自動轉(zhuǎn)賬到合約地址里去
5.如果對當(dāng)前合約使用transfer轉(zhuǎn)賬this.transfer(msg.value)則必須需要一個回滾函數(shù)。
6…如果函數(shù)含有payable而函數(shù)里面沒有要求給某個賬戶轉(zhuǎn)賬的話饰及,則會默認(rèn)轉(zhuǎn)賬到合約當(dāng)中
7.send和transfer的區(qū)別是蔗坯,前者是底層函數(shù),返回bool值燎含;后者會直接在調(diào)用時報錯步悠。具體體現(xiàn)在如果轉(zhuǎn)賬金額為0是,send正常運(yùn)行但是返回false 現(xiàn)在嘗試了之后發(fā)現(xiàn)即使轉(zhuǎn)賬金額0瘫镇,兩者均都不報錯鼎兽,返回的為true,見測試5
查看所有的成員铣除,可參考 地址成員谚咬。
-
balance
和transfer
pragma solidity ^0.4.0;
contract addressTest{
address public account = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
// address 轉(zhuǎn) uint160 其實就是 16進(jìn)制 轉(zhuǎn) 10進(jìn)制
function addressToInt16() view returns(uint160){
return uint160(account);
}
// 加上payable 就默認(rèn)是給 當(dāng)前合約轉(zhuǎn)賬 msg.value的數(shù)額
function toContract() payable {
}
// 獲取當(dāng)前合約地址, 合約也是可以轉(zhuǎn)賬的
function getThis() view returns(address){
return this;
}
// 獲取合約余額
function getContractBalance() view returns(uint){
return this.balance;
}
// 獲取指定地址的余額尚粘, address類型默認(rèn)屬性balance
function getAccountBalance(address acc) view returns(uint){
return acc.balance;
}
// 給acc 轉(zhuǎn)賬 msg.value择卦; msg.value是全局變量,轉(zhuǎn)賬的數(shù)額
function transfer(address acc) payable {
acc.transfer(msg.value);
}
// 使用send 進(jìn)行轉(zhuǎn)賬
function send(address acc) payable returns(bool){
return acc 使用send 進(jìn)行轉(zhuǎn)賬(msg.value);
}
}
3.全局變量
2.函數(shù)類型:
函數(shù)類型表示成如下的形式
function (<parameter types>) {internal|external} [pure|constant|view|payable] [returns (<return types>)]
函數(shù)類型有兩類:
內(nèi)部(internal) 函數(shù)類型
外部(external) 函數(shù)類型
public(或 external)函數(shù)都有下面的成員:
-
.address
返回函數(shù)的合約地址郎嫁。 -
.selector
返回 ABI 函數(shù)選擇器
映射類型在聲明時的形式為 mapping(_KeyType => _ValueType)
秉继。 其中 _KeyType
可以是任何基本類型,即可以是任何的內(nèi)建類型加上bytes
和 string
泽铛。 而用戶定義的類型或復(fù)雜的類型如:合約類型尚辑、枚舉、映射盔腔、結(jié)構(gòu)體杠茬、即除 bytes
和 string
之外的數(shù)組類型 是不可以作為 _KeyType
的類型的。
_ValueType
可以是包括映射類型在內(nèi)的任何類型
在映射中弛随,實際上并不存儲 key瓢喉,而是存儲它的 keccak256 哈希值,從而便于查詢實際的值舀透。
映射只能是 存儲 的數(shù)據(jù)位置栓票,因此只允許作為狀態(tài)變量 或 作為函數(shù)內(nèi)的 存儲 引用 或 作為庫函數(shù)的參數(shù)。 它們不能用合約公有函數(shù)的參數(shù)或返回值
可以將映射聲明為 public
愕够,然后來讓 Solidity 創(chuàng)建一個 getter 函數(shù)走贪。 _KeyType
將成為 getter 的必須參數(shù),并且 getter 會返回 _ValueType
链烈。
pragma solidity ^0.4.0;
contract mappingUse{
// 定義mapping
mapping(address => string) myName;
// mapping 賦值
function setName(string name) {
myName[msg.sender] = name;
}
// mapping取值
function getName(address acc) view returns(string) {
return myName[acc];
}
}
引用類型可以通過多個不同的名稱修改它的值厉斟,而值類型的變量,每次都有獨(dú)立的副本强衡。因此擦秽,必須比值類型更謹(jǐn)慎地處理引用類型。 目前漩勤,引用類型包括結(jié)構(gòu)感挥,數(shù)組和映射,如果使用引用類型越败,則必須明確指明數(shù)據(jù)存儲哪種類型的位置(空間)里:
內(nèi)存memory 即數(shù)據(jù)在內(nèi)存中触幼,因此數(shù)據(jù)僅在其生命周期內(nèi)(函數(shù)調(diào)用期間)有效。不能用于外部調(diào)用究飞。
存儲storage 狀態(tài)變量保存的位置置谦,只要合約存在就一直存儲.
調(diào)用數(shù)據(jù)calldata 用來保存函數(shù)參數(shù)的特殊數(shù)據(jù)位置堂鲤,是一個只讀位置。
更改數(shù)據(jù)位置或類型轉(zhuǎn)換將始終產(chǎn)生自動進(jìn)行一份拷貝媒峡,而在同一數(shù)據(jù)位置內(nèi)(對于 存儲 來說)的復(fù)制僅在某些情況下進(jìn)行拷貝瘟栖。
在 存儲 和 內(nèi)存 之間兩兩賦值(或者從 調(diào)用數(shù)據(jù) 賦值 ),都會創(chuàng)建一份獨(dú)立的拷貝谅阿。
從 內(nèi)存 到 內(nèi)存 的賦值只創(chuàng)建引用半哟, 這意味著更改內(nèi)存變量,其他引用相同數(shù)據(jù)的所有其他內(nèi)存變量的值也會跟著改變签餐。
從 存儲 到本地存儲變量的賦值也只分配一個引用寓涨。
其他的向 存儲 的賦值,總是進(jìn)行拷貝氯檐。