BTC交易离线签名

区块链 比特币

前面说了ETH以及基于以太坊的代币转账离线签名方式, 现在我们来说说如何对BTC进行离线签名, ETH及其代币是只用的账户系统, 所以转账签名比较简单, 但是BTC是基于UTXO的方式进行签名的.

依赖条件

需要调用bitcoinj api 

转账签名

 public  String sign(Transaction trans, Map<String,String> privMap) throws ScriptException, DecoderException{
		 
	        Transaction transaction = new Transaction(getParams());
	    	
	    
	    	//inputs 
	    	List<UTXO> utxos = new ArrayList<UTXO>();
	    	for(UnSpentItem it:trans.getInsputs()){
	    		long amount=it.getAmount().multiply(factor).longValue();
	    		UTXO utxo= new UTXO(Sha256Hash.wrap(it.getTxid()),
	    				it.getVout(),
	    				Coin.valueOf(amount),
	    				it.getConfirmations(),
	                    true,
	                    new Script(Hex.decodeHex(it.getScriptPubKey())),
	                    it.getAddress());
	    		utxos.add(utxo);
	    		money=money+ amount;
	    	}

	    	//outputs
	    	for(OutputItem output:trans.getOutputs()){
	    		long temp=output.getAmount().multiply(factor).longValue();
	    		transaction.addOutput(Coin.valueOf(temp), Address.fromBase58(getParams(), output.getAddress()));
	    		value= value + temp;
	    	}
	    
	    	//balance
	    	long leave =  money - value - trans.getFee().multiply(factor).longValue();
	    	
	    	if (leave > 0) {
	    		
	    	  transaction.addOutput(Coin.valueOf(leave),  Address.fromBase58(this.getParams(),trans.getInsputs().get(0).getAddress()));
	    		
	        }
	    
	    	//sign by priv
	    	for(UTXO it:utxos){
	    		TransactionOutPoint outPoint = new TransactionOutPoint(getParams(), it.getIndex(), it.getHash());
	    		transaction.addSignedInput(outPoint, it.getScript(), fromPrivKey(privKey), Transaction.SigHash.ALL, true);
	    	}
	    	
	    	 return Hex.encodeHexString(transaction.bitcoinSerialize());
	    }

发表评论