Vyper
Vyper 和乙太坊:我如何讀取另一個合約上的公共常量函式?
我想從另一個合約 (Y) 呼叫一個合約 (X) 上的常量函式。我有 X 的 ABI 和地址。X 和 Y 都在 Ropsten 上。我可以使案例如 MEW 與 X 進行良好的互動。
這是 X 的程式碼:
@public @constant def read() -> bytes32: return 0x0000000000000000000000000000000000000000000000059f43ef8557c30000
和 ABI:
[{"name": "read", "outputs": [{"type": "bytes32", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 283}]
契約 Y 如下所示:
feedaddress: public(address) feed: public(bytes[32]) @public def __init__(): self.feedaddress = 0xAb3F6737b0cf41e8a6AE297A3833021f8af2a3aC @public def myread(): self.feed = raw_call(self.feedaddress, 'read', outsize=32, gas=msg.gas) @public def setfeedaddress(_new: address): self.feedaddress = _new
它返回“警告!在合約執行過程中遇到錯誤
$$ Reverted $$“在 etherscan 上。我做錯了什麼?
第二個參數
raw_call
應該是你發送給另一個合約的字節。為了呼叫函式read()
,您應該發送字節0x57de26a4
(函式簽名:keccak256 雜湊的前 4 個字節"read()"
)。
在 github 上的一個問題之後,事實證明 raw_call 是不必要的,因為 Vyper 的合約介面是 ABI 兼容的。使用上面的例子,下面的工作就好了:
contract Beread: def read() -> bytes32: constant feedaddress: public(address) feed: public(bytes32) beread: Beread @public def __init__(): self.feedaddress = 0x161E2Eea68ac57F3C7220170435396Fd7089d9fE @public def myread(): self.beread = self.feedaddress self.feed = self.beread.read() @public def setfeedaddress(_new: address): self.feedaddress = _new
有關如何直接使用該函式的資訊,請參閱raw_call 的幫助。