2017-07-08 2 views
2

Hey je suis nouveau dans geth. J'utilise PHP et curl avec json pour interagir avec mon serveur geth.

Je suis capable de faire tout ce que je veux sauf une chose: vérifier si l'adresse entrée par l'utilisateur est valide selon le format de portefeuille ethereum.

J'ai vu une fonction javascript ici (https://ethereum.stackexchange.com/questions/1374/how-can-i-check-if-an-ethereum-address-is-valid#1379) mais j'utilise principalement PHP, je ne suis pas du tout JS.

Des idées pour convertir?

+1

Aussi, lisez l'algorithme général (comment est-il vérifié généralement) et l'écrire en PHP –

+0

@RiggsFolly Je ne demande pas la conversion, j'aime apprendre et je le pense un endroit agréable. Je réponds aussi à des questions que tu connais? – btc4cash

+0

Pouvez-vous fournir une réponse constructive sur la validation de ethereum/regex en PHP ou vous venez de vous sentir ici par hasard? – btc4cash

Répondre

7

Fondamentalement, vous pouvez convertir le javascript entièrement en PHP. Ici, j'ai pu convertir et tester le code de validation d'une adresse ethereum en PHP.

/** 
* Checks if the given string is an address 
* 
* @method isAddress 
* @param {String} $address the given HEX adress 
* @return {Boolean} 
*/ 
function isAddress($address) { 
    if (!preg_match('/^(0x)?[0-9a-f]{40}$/i',$address)) { 
     // check if it has the basic requirements of an address 
     return false; 
    } elseif (!preg_match('/^(0x)?[0-9a-f]{40}$/',$address) || preg_match('/^(0x)?[0-9A-F]{40}$/',$address)) { 
     // If it's all small caps or all all caps, return true 
     return true; 
    } else { 
     // Otherwise check each case 
     return isChecksumAddress($address); 
    } 
} 

/** 
* Checks if the given string is a checksummed address 
* 
* @method isChecksumAddress 
* @param {String} $address the given HEX adress 
* @return {Boolean} 
*/ 
function isChecksumAddress($address) { 
    // Check each case 
    $address = str_replace('0x','',$address); 
    $addressHash = hash('sha3',strtolower($address)); 
    $addressArray=str_split($address); 
    $addressHashArray=str_split($addressHash); 

    for($i = 0; $i < 40; $i++) { 
     // the nth letter should be uppercase if the nth digit of casemap is 1 
     if ((intval($addressHashArray[$i], 16) > 7 && strtoupper($addressArray[$i]) !== $addressArray[$i]) || (intval($addressHashArray[$i], 16) <= 7 && strtolower($addressArray[$i]) !== $addressArray[$i])) { 
      return false; 
     } 
    } 
    return true; 
} 

Pendant ce temps, pour quelqu'un qui cherche une expression régulière très simple pour vérifier la validité de l'adresse Ethereum (à utiliser est par exemple un attribut pattern d'un champ HTML), cette expression régulière peut suffire.

^(0x)?[0-9a-fA-F]{40}$ 
+0

Merci! J'utilise maintenant jquery et web3.js pour pouvoir utiliser web3.isAddress() :) – btc4cash