【问题标题】:PHP - Validate Multisig Bitcoin Wallet Address (with Leading 2 or 3)PHP - 验证多重签名比特币钱包地址(带前导 2 或 3)
【发布时间】:2015-05-01 02:50:47
【问题描述】:

我使用this function 来验证比特币钱包地址,看看它是否是比特币地址。但是,它不适用于以“3”(多重签名)开头的地址。例如,3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX

谁能帮助我使用该功能,使其能够验证所有主要形式的比特币钱包地址?

【问题讨论】:

  • 您的要求太模糊了。您是否已验证该功能是否适合该地址?你有错误吗?你研究过替代函数吗?
  • @belwood 我试图验证示例地址。它在if (hexdec(substr($address,0,2)) > 0) { return false; } 处返回 false
  • 我刚刚在phpfiddle.org 上用十几个不同的比特币地址尝试了该代码,是的,以 3 开头的那些是一个问题。我对比特币 aglos 一无所知,但也许代码发布者的评论有一些线索:“小修正。实际上没有‘多重地址’,只有 Pay2PubKeyHash 地址和 Pay2ScriptHash 地址。提供的代码只能正确处理前者”

标签: php bitcoin


【解决方案1】:

我刚刚发现了这个here:p

function validate($address){
        $decoded = decodeBase58($address);

        $d1 = hash("sha256", substr($decoded,0,21), true);
        $d2 = hash("sha256", $d1, true);

        if(substr_compare($decoded, $d2, 21, 4)){
                throw new \Exception("bad digest");
        }
        return true;
}
function decodeBase58($input) {
        $alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";

        $out = array_fill(0, 25, 0);
        for($i=0;$i<strlen($input);$i++){
                if(($p=strpos($alphabet, $input[$i]))===false){
                        throw new \Exception("invalid character found");
                }
                $c = $p;
                for ($j = 25; $j--; ) {
                        $c += (int)(58 * $out[$j]);
                        $out[$j] = (int)($c % 256);
                        $c /= 256;
                        $c = (int)$c;
                }
                if($c != 0){
                    throw new \Exception("address too long");
                }
        }

        $result = "";
        foreach($out as $val){
                $result .= chr($val);
        }

        return $result;
}

function main () {
  $s = array(
                "1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9",
                "1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i",
                "1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nJ9",
                "1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62I",
        );
  foreach($s as $btc){
    $message = "OK";
    try{
        validate($btc);
    }catch(\Exception $e){ $message = $e->getMessage(); }
    echo "$btc: $message\n";
  }
}

main();

它确实做多重签名:

【讨论】:

  • +1 @Frankenmint:与 zebpay、bitstamp、coinsecure、blockchain.info...等不同的比特币提供商合作非常棒
猜你喜欢
  • 2020-09-18
  • 1970-01-01
  • 2014-02-28
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
相关资源
最近更新 更多