Free Bitcoins: FreeBitcoin | BonusBitcoin
Coins Kaufen: Bitcoin.de | AnycoinDirekt | Coinbase | CoinMama (mit Kreditkarte) | Paxfull
Handelsplätze / Börsen: Bitcoin.de | KuCoin | Binance | BitMex | Bitpanda | eToro
Lending / Zinsen erhalten: Celsius Network | Coinlend (Bot)
Cloud Mining: Hashflare | Genesis Mining | IQ Mining
Was ist die Funktionssignatur?
Unter der Annahme, dass wir eine Funktion aus einem Vertrag aufrufen möchten, müssen unsere Transaktionsdaten mit der Funktionssignatur beginnen.
Dadurch kann erkannt werden, welche Funktion aufgerufen wird. Die Funktionssignatur wird auch als definiert Funktionswahlschalter.
Die Vertrags-ABI-Spezifikation in der Solidity-Dokumentation enthält eine ausführliche Erläuterung:
Die ersten vier Bytes der Aufrufdaten für einen Funktionsaufruf geben die aufzurufende Funktion an. Es ist das erste (links, höherwertige im Big-Endian) vier Byte des Keccak-256 (SHA-3) -Hashs der Signatur der Funktion.
Die Signatur ist definiert als der kanonische Ausdruck des Basisprototyps ohne Datenstandortspezifizierer, d. H. Der Funktionsname mit der in Klammern gesetzten Liste von Parametertypen. Parametertypen werden durch ein einzelnes Komma getrennt – es werden keine Leerzeichen verwendet.
Wie wird die Funktionssignatur ermittelt?
Die Signatur einer Funktion wird durch Hashing mit bestimmt keccak256
::
- den Namen der Funktion,
- Die Parameter Typen (nur die Typen, nicht die Parameternamen).
Nur die Parameter sind Teil der Signatur, nicht die zurückgegebenen Werte.
Funktionssignatur = Die ersten vier Bytes des zurückgegebenen Hashs
NB: Denken Sie daran, wenn Sie verwenden uint
als Funktionsparameter, wie abheben (uint Betrag)
Die Formel lautet:
keccak256 (zurückziehen (uint256))
Grundlegendes Beispiel
Schauen wir uns an, wie der Hash aussieht. mit einem einfachen Beispiel. Wir werden die Funktion verwenden Gleichgewicht von()
aus dem Open Zeppelin ERC20 Token Vertrag.
/ **
* @dev Siehe {IERC20-balanceOf}.
* /
Funktion balanceOf (Adresse Konto)
Public View Override Returns (uint256)
{
_balances zurückgeben[account];;
}}
Wie gesagt, der Name der Parameter wird nicht berücksichtigt. Also die keccak256
wird auf Fettdruck angewendet (vergiss die schließenden Klammern nicht!). Die Formel lautet:
keccak256 (balanceOf (Adresse))
Hier ist der unten erhaltene Hash, wobei der Funktionswähler fett gedruckt ist.
70a08231b98ef4ca268c9cc3f6b4590e4bfec28280db06bb5d45e689f2a360be
Beispiel mit mehreren Parametern
Hier ist ein Beispiel mit der folgenden Funktion:
Funktion createLime (Zeichenfolge Erinnerung _Name, uint8 Kohlenhydrate, uint8 _Fett, uint8 _Protein) Öffentlichkeit {
benötigen(_Kohlenhydrate! = 0);
Zitronen.drücken(Kalk (_name, _carbohydrates, _fat, _protein));
emittieren FreshLime (_name);
}}
Der Teil, den wir hashen werden, wird sein:
createLime (Zeichenfolge,uint8,uint8,uint8)
Wir wenden dann die an keccak256
Hash…
keccak256 (createLime (Zeichenfolge,uint8,uint8,uint8))
… Und erhalten Sie den folgenden Hash.
e0b6fcfc7ae9d8fec083d9acc9b50973c1325c5528e387ea9a9631ff076b7d17
Auch hier behalten wir die erste 4 Bytes nur. In unserem Beispiel lautet unsere Funktionssignatur 0xe0b6fcfc
.
Abrufen einer Funktionssignatur in Solidity
In Solidity gibt es eine Verknüpfung zum Abrufen der Signatur einer Funktion. Betrachten Sie den folgenden Vertrag mit einer eindeutigen Funktion
Vertragsbeispiel { Funktion f (Adresse _a) public pure return (uint out) {}}
}}
Sie können die Funktionssignatur des erhalten f ()
durch die Nutzung this.f.selector
in einer anderen Funktion. Wähler
ist eine Methode, die den Wert von zurückgibt bytes4
.
Vertragsbeispiel { Funktion f (Adresse _a) public pure return (uint out) {}}
Funktion getSignature () public pure return (bytes4) {
return this.f.selector; // 0xfc68521a }}}}
Free Bitcoins: FreeBitcoin | BonusBitcoin
Coins Kaufen: Bitcoin.de | AnycoinDirekt | Coinbase | CoinMama (mit Kreditkarte) | Paxfull
Handelsplätze / Börsen: Bitcoin.de | KuCoin | Binance | BitMex | Bitpanda | eToro
Lending / Zinsen erhalten: Celsius Network | Coinlend (Bot)
Cloud Mining: Hashflare | Genesis Mining | IQ Mining