mirror of
https://github.com/Qortal/altcoinj.git
synced 2025-02-15 11:45:51 +00:00
Add a couple of utility methods for working with P2SH scripts.
This commit is contained in:
parent
cebebcef69
commit
54b1054d03
@ -18,10 +18,12 @@ package com.google.bitcoin.core;
|
|||||||
|
|
||||||
import com.google.bitcoin.params.MainNetParams;
|
import com.google.bitcoin.params.MainNetParams;
|
||||||
import com.google.bitcoin.params.TestNet3Params;
|
import com.google.bitcoin.params.TestNet3Params;
|
||||||
|
import com.google.bitcoin.script.Script;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkArgument;
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>A Bitcoin address looks like 1MsScoe2fTJoq4ZPdQgqyhgWeoNamYPevy and is derived from an elliptic curve public key
|
* <p>A Bitcoin address looks like 1MsScoe2fTJoq4ZPdQgqyhgWeoNamYPevy and is derived from an elliptic curve public key
|
||||||
@ -47,11 +49,27 @@ public class Address extends VersionedChecksummedBytes {
|
|||||||
*/
|
*/
|
||||||
public Address(NetworkParameters params, int version, byte[] hash160) throws WrongNetworkException {
|
public Address(NetworkParameters params, int version, byte[] hash160) throws WrongNetworkException {
|
||||||
super(version, hash160);
|
super(version, hash160);
|
||||||
|
checkNotNull(params);
|
||||||
checkArgument(hash160.length == 20, "Addresses are 160-bit hashes, so you must provide 20 bytes");
|
checkArgument(hash160.length == 20, "Addresses are 160-bit hashes, so you must provide 20 bytes");
|
||||||
if (!isAcceptableVersion(params, version))
|
if (!isAcceptableVersion(params, version))
|
||||||
throw new WrongNetworkException(version, params.getAcceptableAddressCodes());
|
throw new WrongNetworkException(version, params.getAcceptableAddressCodes());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Returns an Address that represents the given P2SH script hash. */
|
||||||
|
public static Address fromP2SHScript(NetworkParameters params, byte[] hash160) {
|
||||||
|
try {
|
||||||
|
return new Address(params, params.getP2SHHeader(), hash160);
|
||||||
|
} catch (WrongNetworkException e) {
|
||||||
|
throw new RuntimeException(e); // Cannot happen.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns an Address that represents the script hash extracted from the given scriptPubKey */
|
||||||
|
public static Address fromP2SHScript(NetworkParameters params, Script scriptPubKey) {
|
||||||
|
checkArgument(scriptPubKey.isPayToScriptHash(), "Not a P2SH script");
|
||||||
|
return fromP2SHScript(params, scriptPubKey.getPubKeyHash());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct an address from parameters and the hash160 form. Example:<p>
|
* Construct an address from parameters and the hash160 form. Example:<p>
|
||||||
*
|
*
|
||||||
|
@ -136,4 +136,14 @@ public class ScriptBuilder {
|
|||||||
builder.data(signature);
|
builder.data(signature);
|
||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a scriptPubKey that sends to the given script hash. Read
|
||||||
|
* <a href="https://github.com/bitcoin/bips/blob/master/bip-0016.mediawiki">BIP 16</a> to learn more about this
|
||||||
|
* kind of script.
|
||||||
|
*/
|
||||||
|
public static Script createP2SHOutputScript(byte[] hash) {
|
||||||
|
checkArgument(hash.length == 20);
|
||||||
|
return new ScriptBuilder().op(OP_HASH160).data(hash).op(OP_EQUAL).build();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ package com.google.bitcoin.core;
|
|||||||
|
|
||||||
import com.google.bitcoin.params.MainNetParams;
|
import com.google.bitcoin.params.MainNetParams;
|
||||||
import com.google.bitcoin.params.TestNet3Params;
|
import com.google.bitcoin.params.TestNet3Params;
|
||||||
|
import com.google.bitcoin.script.ScriptBuilder;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.spongycastle.util.encoders.Hex;
|
import org.spongycastle.util.encoders.Hex;
|
||||||
|
|
||||||
@ -110,9 +111,12 @@ public class AddressTest {
|
|||||||
assertEquals(TestNet3Params.get().getId(), testNetParams.getId());
|
assertEquals(TestNet3Params.get().getId(), testNetParams.getId());
|
||||||
|
|
||||||
// Test that we can convert them from hashes
|
// Test that we can convert them from hashes
|
||||||
Address a = new Address(mainParams, MainNetParams.get().p2shHeader, Hex.decode("2ac4b0b501117cc8119c5797b519538d4942e90e"));
|
byte[] hex = Hex.decode("2ac4b0b501117cc8119c5797b519538d4942e90e");
|
||||||
|
Address a = Address.fromP2SHScript(mainParams, hex);
|
||||||
assertEquals("35b9vsyH1KoFT5a5KtrKusaCcPLkiSo1tU", a.toString());
|
assertEquals("35b9vsyH1KoFT5a5KtrKusaCcPLkiSo1tU", a.toString());
|
||||||
Address b = new Address(testParams, TestNet3Params.get().p2shHeader, Hex.decode("18a0e827269b5211eb51a4af1b2fa69333efa722"));
|
Address b = Address.fromP2SHScript(testParams, Hex.decode("18a0e827269b5211eb51a4af1b2fa69333efa722"));
|
||||||
assertEquals("2MuVSxtfivPKJe93EC1Tb9UhJtGhsoWEHCe", b.toString());
|
assertEquals("2MuVSxtfivPKJe93EC1Tb9UhJtGhsoWEHCe", b.toString());
|
||||||
|
Address c = Address.fromP2SHScript(mainParams, ScriptBuilder.createP2SHOutputScript(hex));
|
||||||
|
assertEquals("35b9vsyH1KoFT5a5KtrKusaCcPLkiSo1tU", c.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user