(1)賬戶地址
創建賬號,無需上鏈,其實地址在鏈上非真實存在的,轉賬的接收方地址可以是任一符合規則的地址碼,也能轉賬成功,只是沒有人有與之匹配的私鑰來操作此賬戶
geth節點重啟,上鏈的資料還是保存著的
(2)合約內常用變數
msg.sender就是當前呼叫方法的用戶地址this指的是當前合約的地址address支持各種算數運算子tx.origin交易的發送者
(3)函式的可見性 public external internal private
-
public:函式默認宣告為public 是合約對外介面的一部分 -
external:宣告為external的可以從其它合約或通過Transaction進行呼叫, 是合約對外介面的一部分- 合約內變數沒標名public或external,外部dapp無法獲取
-
internal:在當前的合約或繼承的合約中,只允許以internal的方式呼叫 -
private:只能在當前合約中被訪問(不可在被繼承的合約中訪問)- 即使宣告為private,仍能被所有人查看到里面的資料,訪問權限只是阻止了其它合約訪問函式或修改資料,
(4)合約的繼承
存在繼承關系的合約,只需要布置子合約(它的abi和bin資訊中已經包含父合約的資訊)
dapp中通過子合約的地址可以直接調父合約的函式
(5)合約A呼叫合約B
- 合約A內定義一個合約B型別的變數,需要先部署合約B,再將B的address賦值給A內的合約B變數
- 合約B變數未賦值時,無法使用
- 合約B變數賦值后,dapp中通過A合約的地址可以間接調B合約的函式(封裝成介面函式)
- 合約A內呼叫帶
payable標識的合約B變數的函式,呼叫方法如下 :- 合約B變數.函式.value(給多少錢 將做為msg.value的值)(函式形參);
例如:siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);
- 合約B變數.函式.value(給多少錢 將做為msg.value的值)(函式形參);
(6)函式標識 payable 的作用
函式上有一個payable關鍵字,如果一個函式需要進行貨幣操作,必須要帶上payable關鍵字,這樣才能正常接收msg.value,
(7)字串比較
Solidity 并不支持原生的字串比較, 只能通過比較兩字串的 keccak256 哈希值來進行判斷
require(keccak256(_name) == keccak256("Vitalik"));
(8)多個合約檔案
在 Solidity 中,當你有多個檔案并且想把一個檔案匯入另一個檔案時,可以使用 import 陳述句: 相同目錄也必須用"./"開頭
import "./someothercontract.sol";
(9)存盤
Storage 變數是指永久存盤在區塊鏈中的變數, Memory 變數則是臨時的,當外部函式對某合約呼叫完成時,記憶體型變數即被移除
- 當函式內使用
Storage時,相當于指標Sandwich storage mySandwich = sandwiches[_index]; - 當函式內使用
Memory時,相當于拷貝Sandwich memory anotherSandwich = sandwiches[_index + 1];
(10)位元組對齊
當 uint 定義在一個 struct 中的時候,盡量使用最小的整數子型別以節約空間,
并且把同樣型別的變數放一起(即在 struct 中將把變數按照型別依次放置),這樣 Solidity 可以將存盤空間最小化
(11)如果合約想回傳一個struct,得改用多個引數
如果合約回傳多個引數,代碼中定義一個結構體來接收,
且在定義的結構前使用[FunctionOutput],且使用CallDeserializingToObjectAsync來獲取
(12)陣列下標從0開始
(13)函式修飾符
view的作用和constant一模一樣,可以讀取狀態變數但是不能改;pure則更為嚴格,pure修飾的函式不能改也不能讀狀態變數,否則編譯通不過,
(14)require(), assert(), revert()
在 0.4.10 版的 solidity,新增了 require(), assert(), revert() ,
require()用來檢查較不嚴重的錯誤,可以退回未使用到的 gas,assert()用來檢查較嚴重的錯誤,會像以前一樣拿走所有 gasLimit 的手續費,寫法基本上都相同,只是處理方式不一樣,revert跟 require 基本上相同,但是 revert 沒有包括狀態檢查,
(15)tx.origin 和 msg.sender 有什么區別?
tx.origin交易的發送者,msg.sender訊息的發送者,
交易 transaction 可以包含1個或多個合約 contract,
- 一個合約時,對于合約本身來說,tx.origin 和 msg.sender 是同一個地址,
- 多個合約時,場景如: 用戶,合約A ,合約B . 用戶 通過合約A ,調合約B. 此時
- 對于合約A:
tx.origin和msg.sender都是用戶, - 對于合約B:
tx.origin是用戶msg.sender是合約A.
- 對于合約A:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/261442.html
標籤:區塊鏈
上一篇:LightHouse是什么?
下一篇:區塊鏈金融科技
