陣列
pragma solidity ^0.4.23;
contract Hello{
uint[5] arr = [1,2,3,4,5];
function Init(){
arr[0] = 100;
arr[2] = 200;
}
function getArr() view returns(uint[5]){
return arr;
}
function add() view returns(uint){
uint sum = 0;
for(uint i = 0;i<5;i++){
sum += arr[i];
}
return sum;
}
}
結構體
pragma solidity ^0.4.23;
contract Hello{
// struct 結構體里面不能包含本身,但是可以是動態長度的陣列,也可是映射
struct boy{
uint money;
string name;
mapping(uint=>string) map;
}
boy my; //默認為storage型別,只能夠用storage型別來操作mapping
//mapping 不能直接獲取
function init() view returns(uint,string,string){
// boy b 是 storage 型別【在鏈上】 boy(1000,"zy") 是 memory型別【在記憶體里】 所以要轉成memory才能使用
boy memory b = boy(1000,"zy");
my.map[0] = "Hello";
return(b.money,b.name,my.map[0]);
}
//結構體作為引數必須是internal
function test(boy memory b) internal{
//注意 memory 到 memory是參考指標
}
function test2(boy storage b) internal{
}
}
傳址
pragma solidity ^0.4.23;
contract Hello{
uint[] arrx; //儲存在區塊鏈的網路上
function test(uint[] arry) returns(uint){
arrx = arry; //將記憶體的array拷貝給區塊鏈上的arrx
//當我們在函式體內部定義了一個可變長度的陣列時,實際上他默認型別是storage型別,他指向了區塊鏈上的arrx,所以當我修改Z的元素的時候實際上我們在操作的是量上的arrx的值
uint[] storage Z = arrx;
//通過指標實際上修改了區塊量上的arrx的值
Z[0] = 100;
//修改了鏈上arrx的長度
Z.length = 100;
}
function test2() returns(uint){
return arrx[0];
}
function test3() returns(uint){
return arrx.length;
}
}
合約銷毀
pragma solidity ^0.4.23;
contract Hello{
address owner;
constructor(){
owner = msg.sender;
}
function kill(){
if(msg.sender == owner){
selfdestruct(owner);
}
}
}
繼承
- public 可以繼承內外部都可以使用
pragma solidity ^0.4.23;
contract Hello{
uint private money = 1000;
function echoStr() public pure returns(string){
return 'str';
}
function echoExternal() external pure returns(string){
return 'external';
}
function externalTest() public view returns(string){
return this.echoExternal();
}
}
contract Hello2 is Hello{
function test() public view returns(string){
return echoStr();
}
}
- internal 只能在繼承的合約內部或合約內部使用,不能在合約的外部使用
- external 只能用this用來外部呼叫 或者 Hello h = new Hello();引入呼叫
- private 只能被自己使用,不能被繼承
pragma solidity ^0.4.23;
contract Hello{
function echoStr() internal pure returns(string){
return 'str';
}
}
contract Hello2 is Hello{
function test() public view returns(string){
return echoStr();
}
function test2() public view returns(string){
return '22222';
}
function test3() public view returns(string){
return this. echoExternal();
}
}
contract Hello3{
Hello h = new Hello();
function externalEcho() view returns(string){
return h.echoExternal() ;
}
}
modifier
pragma solidity ^0.4.23;
contract Hello{
address public owner;
uint public num;
uint lv = 10;
constructor(){
owner = msg.sender;
}
modifier OnlyOwner{
require(msg.sender == owner); //如果不是原來的合約擁有者就停掉
_;
}
modifier OwnerLv( uint _lv){
require(lv >= _lv);
_;
}
//合約的所有者才可以修改
function chabgeIt(uint _num) OnlyOwner OwnerLv(10){
num = _num;
}
}
mapping
pragma solidity ^0.4.0;
contract Hello{
//映射
mapping(address => uint) IdMapping;
mapping(uint => string) NameMapping;
uint public sum = 0;
//防止重復注冊
modifier conrol{
require(IdMapping[msg.sender] == 0);
_;
}
function register(string name) conrol{
address account = msg.sender;
sum++;
IdMapping[account] = sum;
NameMapping[sum] = name;
}
function getIdByAddress(address are) view returns(uint){
return IdMapping[are];
}
function getNameById(uint id) view returns(string){
return NameMapping[id];
}
}
建構式
pragma solidity ^0.4.23;
contract Hello{
uint public a;
// function Hello(){
// a = 100;
// }
// function Hello(uint _a){
// a = _a;
// }
// constructor(){
// a = 100;
// }
constructor(uint _a){
a = _a;
}
}
pragma solidity ^0.4.23;
contract Hello{
address public owner;
constructor(){
owner = msg.sender;
}
}
函式命名引數
pragma solidity ^0.4.23;
contract Hello{
uint public num;
string public name;
function setData(uint _num,string _name){
num = _num;
name = _name;
}
function test(){
setData({_name:"zy",_num:5});
}
}
函式的多載
函式的多載
1,函式的名字相同
2,函式的型別數量不同,
引數數量不同
function func(uint num){}
function func(){}
引數型別不同
function func(uint num){}
function func(uint8 num){}
3,不考慮函式的回傳值是否相同
address 和 uint160 要注意,雖然能通過編譯,但是不能夠被呼叫( address = uint160 無法判斷該呼叫誰)
function func(uint160 num){}
function func(address num){}
一些語法
pragma solidity ^0.4.0;
contract Hello{
string Myname = "zy"; // string 沒有 length 屬性 需要 bytes(_name).length;強轉獲得長度
bool _a ;
// int 可正可負 int256 uint 只能正數 uint256
int _num1 = 1 ;
int _num2 = 200 ;
uint _num3 = 2;
/**
* 權限 private internal external public
* 識別符號 pure constant view payable
* view 可以自由呼叫,因為它只是“查看”區塊鏈的狀態而不改變它,不消耗燃料
* pure 也可以自由呼叫,不寫入區塊鏈 不消耗燃料
* payable 交易操作需要使用
**/
function getName() public view returns(string)
{
return Myname;
}
// 修改 消耗燃料
function changeMyName(string _newName) public{
Myname = _newName;
}
function pureTest(string _name) pure public returns(string){
return _name;
}
function getBool() view public returns(bool){
return _a;
}
function getBool2() view public returns(bool){
return !_a;
}
function panduan() view public returns(bool){
return _num1 == _num2;
}
function panduan2() view public returns(bool){
return _num1 != _num2;
}
function yu() view public returns(bool){
return (_num1 == _num2) && true;
}
function huo() view public returns(bool){
return (_num1 == _num2)||true;
}
function add(uint a,uint b)pure public returns(uint){
return a+b;
}
function fan() view public returns(uint){
return ~_num3;
}
function lyu() view public returns(int){
return _num1<<1;
}
function flow() view public returns(uint){
uint8 mm = 255;
mm++;
return mm;
}
function flow2() view public returns(uint){
uint8 mm = 0;
mm--;
return mm;
}
function interTest() returns(uint){
return 2/4*1000;
}
bytes1 public bynum1 = 0x7a; // 定義的時候加public會默認加個公共方法 1個位元組 8位 bytes 一旦固定長度不得修改長度
function getLength() returns(uint){
return bynum1.length;
}
bytes public name = new bytes(2);
function IniName(){
name[0] = 0x7a;
name[1] = 0x68;
}
function getnameLength() view returns(uint){
return name.length;
}
function changeName(){
name[0] = 0x88;
}
function changeLength(){
name.length = 5; //設定了長度后值會右邊填充0
}
// 陣列后面添加元素
function pushtest(){
name.push(0x99);
}
}
payable
pragma solidity ^0.4.0;
contract Hello{
address public account; // 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4 uint160
// payable 關鍵字用來給合約地址充值轉賬
function pay() payable{
}
function getBalance() view returns(uint){
return this.balance;
}
// 獲取合約地址
function getThis() view returns(address){
return this;
}
function getOneBalance() view returns(uint){
address account = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
return account.balance;
}
// transfer轉賬 到某個賬戶
function transfer() payable{
address account = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
account.transfer(msg.value);
}
// transfer轉賬 到合約中
function transfer2() payable{
this.transfer(msg.value);
}
//轉賬 到合約中 需要一個回滾函式,不然會報錯
function () payable{
}
function transfer3() payable{
address account = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
account.transfer(10 ether);
}
//send 不會報錯 指會回傳 true 或 false
function sends() payable{
address account = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
account.send(10 ether);
}
}
solstring
pragma solidity ^0.4.0;
contract Hello{
string name = "zy"; // string 沒有 length 屬性 需要 bytes(_name).length;強轉獲得長度
string name2 = "!$%^&#@$ada";
function getLenght() view returns(uint){
return bytes(name).length;
}
function changeName() view returns (bytes1){
return bytes(name)[1];
}
function getName() view returns(bytes){
return bytes(name);
}
function changeName2(){
bytes(name)[0] = 'C';
}
function getLenght2() view returns(uint){
return bytes(name2).length;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/209971.html
標籤:其他
上一篇:filecoin官網訊息,filecoin plus測驗版即將上線,10倍算力增量挖礦,ipfs的收益方式
下一篇:瑞波新的網路協議
