使用ABI協(xié)議時必須強(qiáng)制要求類型在編譯時已知。編譯完成后,智能合約的abi接口定義就確定了,例如智能合約生成的字節(jié)碼和abi定義??筛鶕?jù)abi定義生成調(diào)用智能合約函數(shù)的abi格式的數(shù)據(jù)。
函數(shù)調(diào)用的前四個字節(jié)數(shù)據(jù)指定了要調(diào)用的函數(shù)簽名,計算方式是使用函數(shù)簽名的keccak256哈希取四個字節(jié)。如果函數(shù)名有多個參數(shù),需要用逗號隔開,并去掉表達(dá)式中的所有空格。在geth客戶端通過命令可以得到函數(shù)簽名的哈希值。函數(shù)的返回結(jié)果類型可以是任何類型,例如布爾值。
對于固定大小的類型(例如uint256和bytes10),值可以直接編碼。對于動態(tài)內(nèi)容類型(例如uint32[]和bytes),需要先編碼偏移值,即整個值編碼的開始到真正存這個數(shù)據(jù)的偏移值,然后按順序編碼值。除了bytes和string,其他類型的數(shù)據(jù)少于32字節(jié)的需要補(bǔ)0以達(dá)到32字節(jié)長度。動態(tài)長度的編碼規(guī)則在后面的例子中介紹。
綜上,ABI協(xié)議是智能合約與外部世界的橋梁,使得外部應(yīng)用程序可以方便地與智能合約進(jìn)行交互。