コード例 #1
0
 /**
  * @param                                $primaryMnemonic
  * @param                                $primaryPassphrase
  * @param                                $backupMnemonic
  * @param array                          $blocktrailPublicKeys
  * @param BlockchainDataServiceInterface $bitcoinClient
  * @param string                         $network
  * @param bool                           $testnet
  * @throws \Exception
  */
 public function __construct($primaryMnemonic, $primaryPassphrase, $backupMnemonic, array $blocktrailPublicKeys, BlockchainDataServiceInterface $bitcoinClient, $network = 'btc', $testnet = false)
 {
     // normalize network and set bitcoinlib to the right magic-bytes
     list($this->network, $this->testnet) = $this->normalizeNetwork($network, $testnet);
     BitcoinLib::setMagicByteDefaults($this->network . ($this->testnet ? '-testnet' : ''));
     //create BIP32 keys for the Blocktrail public keys
     foreach ($blocktrailPublicKeys as $blocktrailKey) {
         $this->blocktrailPublicKeys[$blocktrailKey['keyIndex']] = BIP32Key::create($blocktrailKey['pubkey'], $blocktrailKey['path']);
     }
     //set the unspent output finder, using the given bitcoin data service provider
     $this->bitcoinClient = $bitcoinClient;
     $this->utxoFinder = new UnspentOutputFinder($this->bitcoinClient);
     // cleanup copy paste errors from mnemonics
     $primaryMnemonic = str_replace("  ", " ", str_replace("\r\n", " ", str_replace("\n", " ", trim($primaryMnemonic))));
     $backupMnemonic = str_replace("  ", " ", str_replace("\r\n", " ", str_replace("\n", " ", trim($backupMnemonic))));
     // convert the primary and backup mnemonics to seeds (using BIP39), then create private keys (using BIP32)
     $primarySeed = BIP39::mnemonicToSeedHex($primaryMnemonic, $primaryPassphrase);
     $backupSeed = BIP39::mnemonicToSeedHex($backupMnemonic, "");
     $this->primaryPrivateKey = BIP32Key::create(BIP32::master_key($primarySeed, $this->network, $this->testnet));
     $this->backupPrivateKey = BIP32Key::create(BIP32::master_key($backupSeed, $this->network, $this->testnet));
 }
コード例 #2
0
 public function testSignP2SH()
 {
     BitcoinLib::setMagicByteDefaults('bitcoin-testnet');
     $redeem_script = "522103c0b1fd07752ebdd43c75c0a60d67958eeac8d4f5245884477eae094c4361418d2102ab1fae8dacd465460ad8e0c08cb9c25871782aa539a58b65f9bf1264c355d0982102dc43b58ee5313d1969b939718d2c8104a3365d45f12f91753bfc950d16d3e82e53ae";
     $inputs = array(array("txid" => "83c5c88e94d9c518f314e30ca0529ab3f8e5e4f14a8936db4a32070005e3b61f", "vout" => 0, "scriptPubKey" => "a9145fe34588f475c5251ff994eafb691a5ce197d18b87", "redeemScript" => $redeem_script, "value" => 0.0001));
     $outputs = array("n3P94USXs7LzfF4BKJVyGv2uCfBQRbvMZJ" => BitcoinLib::toSatoshi(0.0001));
     $raw_transaction = RawTransaction::create($inputs, $outputs);
     /*
      * sign with first key
      */
     $wallet = array();
     RawTransaction::private_keys_to_wallet($wallet, array("cV2BRcdtWoZMSovYCpoY9gyvjiVK5xufpAwdAFk1jdonhGZq1cCm"));
     RawTransaction::redeem_scripts_to_wallet($wallet, array($redeem_script));
     $sign = RawTransaction::sign($wallet, $raw_transaction, json_encode($inputs));
     $this->assertEquals(2, $sign['req_sigs']);
     $this->assertEquals(1, $sign['sign_count']);
     $this->assertEquals('false', $sign['complete']);
     /*
      * sign with second key
      */
     $wallet = array();
     RawTransaction::private_keys_to_wallet($wallet, array("cMps8Dg4Z1ThcwvPiPpshR6cbosYoTrgUwgLcFasBSxsdLHwzoUK"));
     RawTransaction::redeem_scripts_to_wallet($wallet, array($redeem_script));
     $sign = RawTransaction::sign($wallet, $sign['hex'], json_encode($inputs));
     $this->assertEquals(2, $sign['req_sigs']);
     $this->assertEquals(2, $sign['sign_count']);
     $this->assertEquals('true', $sign['complete']);
     /*
      * sign with third key
      */
     $wallet = array();
     RawTransaction::private_keys_to_wallet($wallet, array("cNn72iUvQhuzZCWg3TC31fvyNDYttL8emHgMcFJzhF4xnFo8LYCk"));
     RawTransaction::redeem_scripts_to_wallet($wallet, array($redeem_script));
     $sign = RawTransaction::sign($wallet, $sign['hex'], json_encode($inputs));
     $this->assertEquals(2, $sign['req_sigs']);
     $this->assertEquals(3, $sign['sign_count']);
     $this->assertEquals('true', $sign['complete']);
     BitcoinLib::setMagicByteDefaults('bitcoin');
 }
コード例 #3
0
 /**
  * set BitcoinLib to the correct magic-byte defaults for the selected network
  *
  * @param $network
  * @param $testnet
  */
 protected function setBitcoinLibMagicBytes($network, $testnet)
 {
     BitcoinLib::setMagicByteDefaults($network . ($testnet ? '-testnet' : ''));
 }
コード例 #4
0
 public function setup()
 {
     // ensure we're set to bitcoin and not bitcoin-testnet
     BitcoinLib::setMagicByteDefaults('bitcoin');
 }
コード例 #5
0
 public function testSignMessageTestnet()
 {
     BitcoinLib::setMagicByteDefaults('bitcoin-testnet');
     $this->assertTrue(BitcoinLib::verifyMessage("mkiPAxhzUMo8mAwW3q95q7aNuXt6HzbbUA", "IND22TSMS2uuWyIn2Be49ajaGwNmiQtiCXrozev00cPFXpACe8LQYU/t6xp8YXb5SIVAnqEn/DailZw+OM85TM0=", "mkiPAxhzUMo8mAwW3q95q7aNuXt6HzbbUA"));
     BitcoinLib::setMagicByteDefaults('bitcoin');
 }
コード例 #6
0
 public function setup()
 {
     parent::setup();
     // ensure we're set to bitcoin-testnet and not bitcoin
     BitcoinLib::setMagicByteDefaults('bitcoin-testnet');
 }
コード例 #7
0
<?php

use BitWasp\BitcoinLib\BitcoinLib;
use BitWasp\BitcoinLib\RawTransaction;
require_once __DIR__ . '/../vendor/autoload.php';
/*
 * !! TESTNET !!
 */
BitcoinLib::setMagicByteDefaults("bitcoin-testnet");
/*
 * address: n3P94USXs7LzfF4BKJVyGv2uCfBQRbvMZJ
 * priv:    cV2BRcdtWoZMSovYCpoY9gyvjiVK5xufpAwdAFk1jdonhGZq1cCm
 * pub:     03c0b1fd07752ebdd43c75c0a60d67958eeac8d4f5245884477eae094c4361418d
 *
 * address: mhsywR248h21gCB8oSwse5tmFSPvo9d5ML
 * priv:    cMps8Dg4Z1ThcwvPiPpshR6cbosYoTrgUwgLcFasBSxsdLHwzoUK
 * pub:     02ab1fae8dacd465460ad8e0c08cb9c25871782aa539a58b65f9bf1264c355d098
 *
 * address: mh7gsCxi4pcuNyHU9aWD9pGogHNJJZcCta
 * priv:    cNn72iUvQhuzZCWg3TC31fvyNDYttL8emHgMcFJzhF4xnFo8LYCk
 * pub:     02dc43b58ee5313d1969b939718d2c8104a3365d45f12f91753bfc950d16d3e82e
 *
 * 2of3 address: 2N1zEScjXeBDX2Gy4c6ojLTfqjRjSvf7iEC
 * 2of3 redeem:  522103c0b1fd07752ebdd43c75c0a60d67958eeac8d4f5245884477eae094c4361418d2102ab1fae8dacd465460ad8e0c08cb9c25871782aa539a58b65f9bf1264c355d0982102dc43b58ee5313d1969b939718d2c8104a3365d45f12f91753bfc950d16d3e82e53ae
 *
 * funded in TX: 83c5c88e94d9c518f314e30ca0529ab3f8e5e4f14a8936db4a32070005e3b61f
 */
$redeem_script = "522103c0b1fd07752ebdd43c75c0a60d67958eeac8d4f5245884477eae094c4361418d2102ab1fae8dacd465460ad8e0c08cb9c25871782aa539a58b65f9bf1264c355d0982102dc43b58ee5313d1969b939718d2c8104a3365d45f12f91753bfc950d16d3e82e53ae";
$inputs = array(array("txid" => "83c5c88e94d9c518f314e30ca0529ab3f8e5e4f14a8936db4a32070005e3b61f", "vout" => 0, "scriptPubKey" => "a9145fe34588f475c5251ff994eafb691a5ce197d18b87", "redeemScript" => $redeem_script));
$outputs = array("n3P94USXs7LzfF4BKJVyGv2uCfBQRbvMZJ" => BitcoinLib::toSatoshi(0.0001));
$raw_transaction = RawTransaction::create($inputs, $outputs);