標籤:字元 man star number com des manual 延長 檔案
概述
最近在寫合約時遇到一些坑,做一下總結;
介紹主要分一下三個方面:
- 對區塊鏈的簡單描述
- 結合業務情境,編寫簡單智能合約,時遇到的坑(上篇)
- assembly 的使用說明(下篇)
本文
進入正題之前,我稍微簡單介紹一下什麼是區塊鏈,區塊鏈幹嘛用的(特點),智能合約是做什麼的,為什麼要寫只能合約(一下是個人理解僅供參考)
什麼是區塊鏈
A blockchain is a globally shared, transactional database.
譯文:區塊鏈是一個全域共用的事物資料庫;(就是個資料庫)
區塊鏈特點
既然當前區塊鏈這麼火,那麼總要有火的理由吧,它到底用來幹什麼的呢?而體現區塊鏈本身的商業價值,說白了就是能靠它的專屬的特點賺錢;
區塊鏈工作原理
- 用戶端將發起一筆交易,經數位簽章後廣播給網路上的其他節點並等待確認
- 網路中的節點對收到的資料記錄資訊進行校正,通過校正後,資料記錄到一個區塊中
- 全網所有接受節點對區塊執行共識演算法,區塊通過共識演算法過程後正式納入區塊鏈中儲存,全網節點均表示接受該區塊。表示接受的方法,是將該區塊的隨機雜湊值視為最新的去區塊雜湊值,新去塊將提供永久和透明的交易記錄並以該區塊鏈為基礎進行延長,實現資金轉移。
什麼是智能合約
A contract in the sense of Solidity is a collection of code (its functions) and data (its state) that resides at a specific address on the Ethereum blockchain.
譯文:Solidity意義上的合約是代碼(其功能)和資料(其狀態)的集合,它位於以太坊區塊鏈的特定地址。
關鍵字:code (its functions) 、 data (its state)、address
踩坑
在寫合約時遇到一下幾個問題; 其實這些問題google上都能查到,但也是需要大量時間,有些還不一定對,小編對下述問題做一個總結與歸納;以後也給自己方便;
- 合約方法能返回struct結構嗎? 能要怎麼做?
答:Yes, but only in internal function calls.
使用 internal 時,與平時的 function 寫法一樣即可
- 合約方法能對string進行字串拼接操作嗎?
答:You have to do it manually for now.
說白了就是沒有,要自己實現; 方案1:https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol
方案2:這是小編根據google查得做了一些小改的,僅供參考
/// 內部訪問函數,internal /// 實現將string _a, _b1,_b2,_c拼接成一個string function strConcat(string _a, bytes1 _b1,bytes1 _b2, string _c) internal pure returns (string){ bytes memory _ba = bytes(_a); bytes memory _bc = bytes(_c); string memory abcde = new string(_ba.length + _b1.length + _b2.length + _bc.length); bytes memory babcde = bytes(abcde); uint k = 0; for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i]; for (i = 0; i < _b1.length; i++) babcde[k++] = _b1[i]; for (i = 0; i < _b2.length; i++) babcde[k++] = _b2[i]; for (i = 0; i < _bc.length; i++) babcde[k++] = _bc[i]; return string(babcde); }
- 合約方法能返回數群組類型嗎?
答:可以,但不能返回動態數組; 什麼意思呢,就是說可以 int[] uint[] 等等,如果是string[] 則需要給string []定length長度,否則編譯失敗; 那麼業務上就需要 returns(string[])怎麼辦? 小編的解決方案是return string來代替,將每一個string拼接起來,拼接符可以用ASCII碼中不可見字元如:0x01,0x02等等,千萬別用常見字元;(之前做hyperledger fabric的java sdk解析時發現也用到了)
說明編碼這裡順帶說一句,
All identifiers(contract names,function names and variable names) are restricted to the ASCII character set. It is possible to store UTF-8 encoded data in string variables.
- 能對address 類型進行算術操作嗎?
答:The address type is a 160-bit value that does not allow any arithmetic operations.
- solidity 的版本會影響 evm的編譯嗎?
答:據我所知,沒有影響,因為對evm來說它只是執行了,solidity通過solc編譯之後產生的bin、abi檔案,進行編譯;
solidity的版本若高於solc編譯環境的版本則會無法編譯
本文篇幅沒啥乾貨,就隨意聊聊淺談一下;
區塊鏈之智能合約 solidity踩坑 --上篇