日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

智能合约语言 Solidity 教程系列8 - Solidity API

發布時間:2024/9/21 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 智能合约语言 Solidity 教程系列8 - Solidity API 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這是Solidity教程系列文章第8篇介紹Solidity API,它們主要表現為內置的特殊的變量及函數,存在于全局命名空間里。

<!-- more -->

寫在前面

Solidity 是以太坊智能合約編程語言,閱讀本文前,你應該對以太坊、智能合約有所了解,
如果你還不了解,建議你先看以太坊是什么

歡迎訂閱區塊鏈技術專欄閱讀更全面的分析文章。

Solidity API 主要表現為Solidity 內置的特殊的變量及函數,他們存在于全局命名空間里,主要分為以下幾類:

  • 有關區塊和交易的屬性
  • 有關錯誤處理
  • 有關數學及加密功能
  • 地址相關
  • 合約相關
  • 下面詳細講解下

    區塊和交易的屬性(Block And Transaction Properties)

    用來提供一些區塊鏈當前的信息。

    • block.blockhash(uint blockNumber) returns (bytes32):返回給定區塊號的哈希值,只支持最近256個區塊,且不包含當前區塊。
    • block.coinbase (address): 當前塊礦工的地址。
    • block.difficulty (uint):當前塊的難度。
    • block.gaslimit (uint):當前塊的gaslimit。
    • block.number (uint):當前區塊的塊號。
    • block.timestamp (uint): 當前塊的Unix時間戳(從1970/1/1 00:00:00 UTC開始所經過的秒數)
    • msg.data (bytes): 完整的調用數據(calldata)。
    • msg.gas (uint): 當前還剩的gas。
    • msg.sender (address): 當前調用發起人的地址。
    • msg.sig (bytes4):調用數據(calldata)的前四個字節(例如為:函數標識符)。
    • msg.value (uint): 這個消息所附帶的以太幣,單位為wei。
    • now (uint): 當前塊的時間戳(block.timestamp的別名)
    • tx.gasprice (uint) : 交易的gas價格。
    • tx.origin (address): 交易的發送者(全調用鏈)

    注意:
    msg的所有成員值,如msg.sender,msg.value的值可以因為每一次外部函數調用,或庫函數調用發生變化(因為msg就是和調用相關的全局變量)。

    不應該依據 block.timestamp, now 和 block.blockhash來產生一個隨機數(除非你確實需要這樣做),這幾個值在一定程度上被礦工影響(比如在賭博合約里,不誠實的礦工可能會重試去選擇一個對自己有利的hash)。

    對于同一個鏈上連續的區塊來說,當前區塊的時間戳(timestamp)總是會大于上一個區塊的時間戳。

    為了可擴展性的原因,你只能查最近256個塊,所有其它的將返回0.

    錯誤處理

    • assert(bool condition)

    用于判斷內部錯誤,條件不滿足時拋出異常

    • require(bool condition):

    用于判斷輸入或外部組件錯誤,條件不滿足時拋出異常

    • revert():

    終止執行并還原改變的狀態

    數學及加密功能

    • addmod(uint x, uint y, uint k) returns (uint):

    計算(x + y) % k,加法支持任意的精度且不會在2**256處溢出,從0.5.0版本開始斷言k != 0。

    • mulmod(uint x, uint y, uint k) returns (uint):

    計算 (x y) % k, 乘法支持任意的精度且不會在2*256處溢出, 從0.5.0版本開始斷言k != 0。

    • keccak256(...) returns (bytes32):

    使用以太坊的(Keccak-256)計算HASH值。緊密打包參數。

    • sha256(...) returns (bytes32):

    使用SHA-256計算hash值,緊密打包參數。

    • sha3(...) returns (bytes32):

    keccak256的別名

    • ripemd160(...) returns (bytes20):

    使用RIPEMD-160計算HASH值。緊密打包參數。

    • ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address):

    通過橢圓曲線簽名來恢復與公鑰關聯的地址,或者在錯誤時返回零。可用于簽名數據的校驗,如果返回結果是簽名者的公匙地址,那么說明數據是正確的。

    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("x00x12") 與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>.balance (uint256):

    Address的余額,以wei為單位。

    • <address>.transfer(uint256 amount):

    發送給定數量的ether到某個地址,以wei為單位。失敗時拋出異常。

    • <address>.send(uint256 amount) returns (bool):

    發送給定數量的ether到某個地址,以wei為單位, 失敗時返回false。

    • <address>.call(...) returns (bool):

    發起底層的call調用。失敗時返回false。

    • <address>.callcode(...) returns (bool):

    發起底層的callcode調用,失敗時返回false。
    不鼓勵使用,未來可能會移除。

    • <address>.delegatecall(...) returns (bool):

    發起底層的delegatecall調用,失敗時返回false

    更多信息參考地址篇。

    警告:send() 執行有一些風險:如果調用棧的深度超過1024或gas耗光,交易都會失敗。因此,為了保證安全,必須檢查send的返回值,如果交易失敗,會回退以太幣。如果用transfer會更好。

    合約相關

    • this(當前合約的類型):

    表示當前合約,可以顯式的轉換為Address

    • selfdestruct(address recipient):

    銷毀當前合約,并把它所有資金發送到給定的地址。

    • suicide(address recipient):

    selfdestruct的別名

    另外,當前合約里的所有函數均可支持調用,包括當前函數本身。

    參考視頻

    我們也推出了目前市面上最全的視頻教程:深入詳解以太坊智能合約語言Solidity
    目前我們也在招募體驗師,可以點擊鏈接了解。

    參考文檔

    • Special Variables and Functions

    深入淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。
    如果想與我有更密切的交流可以選擇加入我的知識星球(星球成員可加入微信技術交流群)

    總結

    以上是生活随笔為你收集整理的智能合约语言 Solidity 教程系列8 - Solidity API的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。