Leestijd: 5 min
Overzicht
PHP is erg populair bij het ontwikkelen van de backend van websites of webapplicaties. PHP heeft een enorme schare ontwikkelaars die het als hun favoriete programmeertaal beschouwen. In deze handleiding zullen we bekijken hoe we in PHP een nieuw Ethereum-adres kunnen genereren.
Vereisten
- PHP 7.0 of hoger, geïnstalleerd met de gmp-extensie.
- Composer is geïnstalleerd
- Een teksteditor
- CLI
Wat is een Ethereum-adres?
Wanneer je je aanmeldt bij een platform op internet, moet je je identificeren met een combinatie van inloggegevens. Beschouw een Ethereum-adres als je gebruikersnaam en de bijbehorende privésleutel als het wachtwoord. Hoewel je Ethereum-adres openbaar is en gedeeld kan worden, moet de privésleutel altijd geheim blijven. Met deze combinatie kun je communiceren met de Ethereum-blockchain. Een Ethereum-adres is je identiteit op de blockchain en ziet er als volgt uit: „0x6E0d01A76C3Cf4288372a29124A26D4353EE51BE“. Een geldig Ethereum-adres is vereist voor:
- Ethereum ontvangen/verzenden
- Transacties ondertekenen/verzenden
- Verbinding maken met gedecentraliseerde applicaties
Hoe een Ethereum-adres wordt gegenereerd:
Eerst wordt een willekeurige privésleutel van 64 (hex) tekens (256 bits / 32 bytes) gegenereerd. Bijvoorbeeld:
0xf4a2b939592564feb35ab10a8e04f6f2fe0943579fb3c9c33505298978b74893
Vervolgens wordt met behulp van het Elliptic Curve Digital Signature Algorithm (ECDSA) een openbare sleutel van 128 (hex) tekens (64 bytes) afgeleid uit de gegenereerde privésleutel. Bijvoorbeeld:
0x04345f1a86ebf24a6dbeff80f6a2a574d46efaa3ad3988de94aa68b695f09db9ddca37439f99548da0a1fe4acf4721a945a599a5d789c18a06b20349e803fdbbe
Vervolgens wordt de Keccak-256-hashfunctie toegepast op (128 tekens / 64 bytes) van de openbare sleutel om een hash-string van 64 tekens (32 bytes) te verkrijgen. De laatste 40 tekens / 20 bytes van deze string, voorafgegaan door 0x, vormen het uiteindelijke Ethereum-adres. Bijvoorbeeld:
0xd5e099c71b797516c10ed0f0d895f429c2781142
Opmerking: 0x in de code geeft aan dat het getal of de tekenreeks in hexadecimale notatie is geschreven.
Wat is PHP?
PHP is een recursief acroniem voor Hypertext Preprocessor; PHP is een veelgebruikte open-source scripttaal aan de serverzijde die doorgaans in HTML wordt ingebed. Het wordt gebruikt voor het beheer van databases, het bijhouden van sessies en het genereren van dynamische inhoud; het werkt met vrijwel alle populaire databases, zoals MySQL, PostgreSQL, MS SQL Server, enz. Het heeft een syntaxis die lijkt op die van de programmeertaal C en ondersteunt belangrijke protocollen zoals LDAP, IMAP en POP3. Met PHP4 werd ondersteuning toegevoegd voor Java en gedistribueerde objectarchitecturen (COM en CORBA), waardoor n-tier-ontwikkeling voor het eerst mogelijk werd.
**
Praktische toepassingen van PHP
**
- Om cookie-variabelen in te stellen en op te roepen.
- Om informatie uit webformulieren te verzamelen.
- Om systeemfuncties uit te voeren, zoals het openen en sluiten van bestanden.
- Om elementen in databases toe te voegen, te verwijderen en te wijzigen.
- Gebruikersgebaseerde beperkingen toevoegen aan webpagina’s.
**
Hieronder volgen enkele kenmerken van PHP-
**
- Schaalbaarheid
- Flexibiliteit
- Eenvoud
- Hoofdlettergevoelig
- Losjes getypeerd
- Vertaald
- Open source
PHP en andere afhankelijkheden installeren
Voordat we de afhankelijkheden installeren die we nodig hebben om een adres te genereren, gaan we eerst controleren of PHP op ons systeem is geïnstalleerd. Kopieer en plak hiervoor de volgende tekst en voer deze uit in je terminal/cmd.
$ php -v
Het zou de PHP-versie moeten weergeven; als PHP niet is geïnstalleerd, download dan de voor uw besturingssysteem geschikte versie van PHP volgens de instructies op de downloadpagina van de officiële PHP-website.
We moeten de PHP-extensie gmp installeren; je kunt ofwel de opmerking ervoor in het bestand php.init verwijderen, ofwel de extensie handmatig installeren met behulp van het volgende.
$ sudo apt-get install php-gmp
Opmerking: We moeten gmp inschakelen met behulp van slechts één van de hierboven genoemde methoden.
Voor Mac:
Door PHP opnieuw te installeren met brew kun je de gmp-extensie inschakelen. Voer de volgende opdrachten in:
$ brew reinstall php@7.2
$ export PATH="/usr/local/opt/php@7.2/bin:$PATH"
$ brew services restart php@7.2
$ php -info | grep "GMP"
We gebruiken Composer (een afhankelijkheidsbeheerder voor PHP) om de PHP-bibliotheken en -afhankelijkheden te beheren die nodig zijn voor het genereren van adressen en sleutels. Controleer of Composer op je systeem is geïnstalleerd door het volgende in je terminal/cmd uit te voeren:
Als het nog niet is geïnstalleerd, download en installeer het dan via de downloadpagina op de website van Composer.
Maak nu een JSON-bestand met de naam composer.json aan in je projectmap en kopieer en plak de volgende tekst daarin.
{
"require": {
"sop/asn1": "^3.3",
"sop/crypto-encoding": "^0.2.0",
"sop/crypto-types": "^0.2.1",
"kornrunner/keccak": "^1.0",
"symfony/dotenv": "^4.0",
"sc0vu/web3.php": "dev-master"
}
}
Sla het bestand op en installeer de afhankelijkheden met Composer:
$ composer install
Hiermee worden de benodigde afhankelijkheden in de map geïnstalleerd.
Een Ethereum-adres genereren in PHP
Maak nu een nieuw PHP-bestand met de naam Address.php in de map en kopieer en plak de volgende tekst daarin.
<?
require_once "vendor/autoload.";
use Sop\CryptoTypes\Asymmetric\EC\ECPublicKey;
use Sop\CryptoTypes\Asymmetric\EC\ECPrivateKey;
use Sop\CryptoEncoding\PEM;
use kornrunner\Keccak;
$config = [
'private_key_type' => OPENSSL_KEYTYPE_EC,
'curve_name' => 'secp256k1'
];
$res = openssl_pkey_new($config);
if (!$res) {
echo 'ERROR: Fail to generate private key. -> ' . openssl_error_string();
exit;
}
openssl_pkey_export($res, $priv_key);
$key_detail = openssl_pkey_get_details($res);
$pub_key = $key_detail["key"];
$priv_pem = PEM::fromString($priv_key);
$ec_priv_key = ECPrivateKey::fromPEM($priv_pem);
$ec_priv_seq = $ec_priv_key->toASN1();
$priv_key_hex = bin2hex($ec_priv_seq->at(1)->asOctetString()->string());
$priv_key_len = strlen($priv_key_hex) / 2;
$pub_key_hex = bin2hex($ec_priv_seq->at(3)->asTagged()->asExplicit()->asBitString()->string());
$pub_key_len = strlen($pub_key_hex) / 2;
$pub_key_hex_2 = substr($pub_key_hex, 2);
$pub_key_len_2 = strlen($pub_key_hex_2) / 2;
$hash = Keccak::hash(hex2bin($pub_key_hex_2), 256);
$wallet_address = '0x' . substr($hash, -40);
$wallet_private_key = '0x' . $priv_key_hex;
echo "\r\n SAVE BUT DO NOT SHARE THIS (Private Key): " . $wallet_private_key;
echo "\r\n Address: " . $wallet_address . " \n";
?>
Uitleg bij de bovenstaande code
Regel 1: Het PHP-script begint met de openingscode van PHP.
Regel 3-8: De geïnstalleerde afhankelijkheden worden geïmporteerd.
Regel 10-20: De secp256k1-kromme wordt gebruikt om de privésleutel te genereren.
Regel 22: De privésleutel genereren.
Regel 24-25: De openbare sleutel ophalen.
Regels 29-31: De sleutel wordt eerst omgezet naar het formaat voor privésleutels van elliptische krommen en vervolgens naar een ASN.1-structuur.
Regels 33-36: De privé- en publieke sleutel in hexadecimale notatie ophalen.
Regel 38-39: Het Ethereum-adres afleiden uit de openbare sleutel; elke openbare sleutel begint altijd met 0x04,
de eerste 0x04 verwijderen om de hash correct te berekenen.
Regel 41: Het adres in hash-formaat ophalen.
Regel 43: Het voorvoegsel 0x toevoegen, de laatste 40 tekens van de adres-hash ophalen en deze opslaan in de variabele `wallet_address`.
Regel 44: Het voorvoegsel 0x aan de privésleutel toevoegen en deze opslaan in de variabele `wallet_private_key`.
Regel 46: De privésleutel afdrukken met een waarschuwing.
Regel 47: Het Ethereum-adres weergeven met de tekst „Address:“
Sla het bestand nu op en voer het script uit.
$ php Address.php
Als alles volgens plan verloopt, zou het er zo uit moeten zien.

Conclusie
Gefeliciteerd met het genereren van je eigen Ethereum-adres in PHP; hiermee kun je fantastische gedecentraliseerde wallets maken.
Schrijf je in voor onze nieuwsbrief voor meer artikelen en handleidingen over Ethereum. Als je feedback hebt, neem dan gerust contact met ons op via Twitter. Je kunt ook altijd met ons chatten op onze Discord-communityserver, waar je enkele van de coolste ontwikkelaars tegenkomt die je ooit zult ontmoeten :)
