本文首發於深刻淺出區塊鏈社區javascript
原文連接:智能合約語言Solidity教程系列8 - SolidityAPI原文已更新,請讀者前往原文閱讀html
這是Solidity教程系列文章第8篇介紹Solidity API,它們主要表現爲內置的特殊的變量及函數,存在於全局命名空間裏。java
Solidity 是以太坊智能合約編程語言,閱讀本文前,你應該對以太坊、智能合約有所瞭解, 若是你還不瞭解,建議你先看以太坊是什麼web
歡迎訂閱區塊鏈技術專欄閱讀更全面的分析文章。編程
Solidity API 主要表現爲Solidity 內置的特殊的變量及函數,他們存在於全局命名空間裏,主要分爲如下幾類:api
下面詳細講解下安全
用來提供一些區塊鏈當前的信息。bash
注意: msg的全部成員值,如msg.sender,msg.value的值能夠由於每一次外部函數調用,或庫函數調用發生變化(由於msg就是和調用相關的全局變量)。微信
不該該依據 block.timestamp, now 和 block.blockhash來產生一個隨機數(除非你確實須要這樣作),這幾個值在必定程度上被礦工影響(好比在賭博合約裏,不誠實的礦工可能會重試去選擇一個對本身有利的hash)。編程語言
對於同一個鏈上連續的區塊來講,當前區塊的時間戳(timestamp)老是會大於上一個區塊的時間戳。
爲了可擴展性的緣由,你只能查最近256個塊,全部其它的將返回0.
ecrecover函數須要四個參數,須要被簽名數據的哈希結果值,r,s,v分別來自簽名結果串。 r = signature[0:64] s = signature[64:128] v = signature[128:130] 其中v取出來的值或者是00或01。要使用時,咱們先要將其轉爲整型,再加上27,因此咱們將獲得27或28。在調用函數時v將填入27或28。
用javascript表達以下:
var msg = '0x8CbaC5e4d803bE2A3A5cd3DbE7174504c6DD0c1C'
var hash = web3.sha3(msg)
var sig = web3.eth.sign(address, h).slice(2)
var r = `0x${sig.slice(0, 64)}`
var s = `0x${sig.slice(64, 128)}`
var v = web3.toDecimal(sig.slice(128, 130)) + 27
複製代碼
訂閱區塊鏈技術專欄能夠參考到完整的使用例子。
緊密打包參數(tightly packed)意思是說參數不會補位,是直接鏈接在一塊兒的,下面幾個是相等的。
keccak256("ab", "c")
keccak256("abc")
keccak256(0x616263) // hex
keccak256(6382179)
keccak256(97, 98, 99) //ascii
複製代碼
若是須要填充,可使用顯式類型轉換:keccak256("\x00\x12") 與keccak256(uint16(0x12))相同。
注意,常量將使用存儲它們所需的最少字節數來打包,例如keccak256(0) == keccak256(uint8(0))和keccak256(0x12345678) == keccak256(uint32(0x12345678))
在私鏈(private blockchain)上運行sha256,ripemd160或ecrecover可能會出現Out-Of-Gas報錯。由於私鏈實現了一種預編譯合約,合約要在收到第一個消息後纔會真正存在(雖然他們的合約代碼是硬編碼的)。而向一個不存在的合約發送消息,因此纔會致使Out-Of-Gas的問題。一種解決辦法(workaround)是每一個在你真正使用它們以前先發送1 wei到這些合約上來完成初始化。在官方和測試鏈上沒有這個問題。
Address的餘額,以wei爲單位。
發送給定數量的ether到某個地址,以wei爲單位。失敗時拋出異常。
發送給定數量的ether到某個地址,以wei爲單位, 失敗時返回false。
發起底層的call調用。失敗時返回false。
發起底層的callcode調用,失敗時返回false。 不鼓勵使用,將來可能會移除。
發起底層的delegatecall調用,失敗時返回false
更多信息參考地址篇。
警告:send() 執行有一些風險:若是調用棧的深度超過1024或gas耗光,交易都會失敗。所以,爲了保證安全,必須檢查send的返回值,若是交易失敗,會回退以太幣。若是用transfer會更好。
另外,當前合約裏的全部函數都可支持調用,包括當前函數自己。
咱們也推出了目前市面上最全的視頻教程:深刻詳解以太坊智能合約語言Solidity 目前咱們也在招募課程體驗師,能夠點擊連接瞭解。
深刻淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。 若是想與我有更密切的交流能夠選擇加入個人知識星球(星球成員可加入微信技術交流羣)