Ich verwende einen Delegiertenruf auf niedriger Ebene, um meine Anrufe an eine Bibliothek weiterzuleiten.
Ich muss (in dieser Reihenfolge):
Lade bytes4 sig aus dem Speicher in _message
Kopfgeld (STRUCT) aus dem Speicher in _message laden
Lade Bytes _data in _message
Delegiertenruf mit der neuen Nachricht
Rückgabewerte abrufenDer Vertrag funktioniert (z. B. die getBounty-Funktion wird funktionieren), aber ich habe Probleme mit der Assemblierung in meiner forwarder()-Funktion. https://ethfiddle.com/po3wHGQraJ
Ich habe jedoch Probleme damit, dass mein Forwarder (in der Montage) richtig funktioniert.
function forward(bytes32 _sig, bytes memory _data) public payable {
bytes memory data = _data;
bytes4 sig = bytes4(_sig);
address _impl = impl;
require(_impl != address(0));
assembly {
let _message := mload(0x40) //find empty memory location
mstore(_message, sig) //place sig at beginning of empty storage
//add _bounty
mstore(add(_message, 4), sload(bounty_slot))
//add _data
calldatacopy(add(_message, 36), 100, sub(calldatasize,100))
//mstore(add(_message, 36), data)
let size := returndatasize
let result := delegatecall(gas, _impl, _message, msize, 0, 0)
//return data ??????
returndatacopy(_message, 0, size)
switch result
case 0 {revert(_message, size) }
default { return(_message, size) }
}
}
So sieht der Speicher aus:
0x00
0x687474703a2f2f6170692e6269746275636b65742e636f6d2f33303433303430
0xe1bb4acb579f780cbaf21cef9ac3641b8e3fcd69
0x5b7eaef7
0x3334303330340000000000000000000000000000000000000000000000000000
0x012a05f200
0x00
0x00
0x059ce9161d4fb0
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
Das returndatacopy
ist der richtige Ansatz, aber Sie haben ein Problem mit _data
.
Die _data
Variable ist ein Zeiger auf den Speicher, da bytes
es sich um einen Array-Typ handelt. Sie müssen die Daten in den Meldepuffer kopieren.
Dies kann entweder erfolgen, indem Sie die Funktion extern machen und dann verwenden calldatacopy
, oder Sie können eine Schleife verwenden, um Wort für Wort zu kopieren, oder Sie können den vorkompilierten Identitätsvertrag unter Adresse verwenden0x04
Nico Vergauwen
Tjaden Hess
Nico Vergauwen
Tjaden Hess
calldatacopy(add(_message, 36), 100, sub(calldatasize,100))
oder etwas ähnliches funktionieren sollteNico Vergauwen
Nico Vergauwen
Nico Vergauwen
Tjaden Hess
Nico Vergauwen
das Fett