區塊鏈之智能合約 solidity踩坑 --上篇

來源:互聯網
上載者:User

標籤:字元   man   star   number   com   des   manual   延長   檔案   

概述

最近在寫合約時遇到一些坑,做一下總結;

介紹主要分一下三個方面:

  • 對區塊鏈的簡單描述
  • 結合業務情境,編寫簡單智能合約,時遇到的坑(上篇)
  • assembly 的使用說明(下篇)
本文

進入正題之前,我稍微簡單介紹一下什麼是區塊鏈,區塊鏈幹嘛用的(特點),智能合約是做什麼的,為什麼要寫只能合約(一下是個人理解僅供參考)

什麼是區塊鏈

A blockchain is a globally shared, transactional database.

譯文:區塊鏈是一個全域共用的事物資料庫;(就是個資料庫)

區塊鏈特點

既然當前區塊鏈這麼火,那麼總要有火的理由吧,它到底用來幹什麼的呢?而體現區塊鏈本身的商業價值,說白了就是能靠它的專屬的特點賺錢;

  • 分布式結構
  • 信任機制
  • 公開透明
  • 時序不可篡改
區塊鏈工作原理
  1. 用戶端將發起一筆交易,經數位簽章後廣播給網路上的其他節點並等待確認
  2. 網路中的節點對收到的資料記錄資訊進行校正,通過校正後,資料記錄到一個區塊中
  3. 全網所有接受節點對區塊執行共識演算法,區塊通過共識演算法過程後正式納入區塊鏈中儲存,全網節點均表示接受該區塊。表示接受的方法,是將該區塊的隨機雜湊值視為最新的去區塊雜湊值,新去塊將提供永久和透明的交易記錄並以該區塊鏈為基礎進行延長,實現資金轉移。
什麼是智能合約

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上都能查到,但也是需要大量時間,有些還不一定對,小編對下述問題做一個總結與歸納;以後也給自己方便;

  1. 合約方法能返回struct結構嗎? 能要怎麼做?

答:Yes, but only in internal function calls.

使用 internal 時,與平時的 function 寫法一樣即可

  1. 合約方法能對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);   }
  1. 合約方法能返回數群組類型嗎?

答:可以,但不能返回動態數組; 什麼意思呢,就是說可以 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.
  1. 能對address 類型進行算術操作嗎?

答:The address type is a 160-bit value that does not allow any arithmetic operations.

  1. solidity 的版本會影響 evm的編譯嗎?

答:據我所知,沒有影響,因為對evm來說它只是執行了,solidity通過solc編譯之後產生的bin、abi檔案,進行編譯;

solidity的版本若高於solc編譯環境的版本則會無法編譯

本文篇幅沒啥乾貨,就隨意聊聊淺談一下;

區塊鏈之智能合約 solidity踩坑 --上篇

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.