ETH交易离线签名

以太坊 区块链

   由于我们做的区块链钱包是只传用用户私匙签名后的hex字符串到服务端, 然后服务端再进行统一的交易处理, 所以客户端就需要做到离线签名的功能, 那么在以太坊的如何签名转账hex呢?

签名代码需要依赖 Java web3j

1、ETH转账签名

public  String sign(Transaction trans, String privateKey) {
		
		 	BigInteger realValue = Convert.toWei(trans.getValue().toString(), Convert.Unit.ETHER).toBigInteger();
			RawTransaction rawTransaction = RawTransaction.createTransaction(trans.getNonce(),trans.getGasPrice(),trans.getGasLimit(),trans.getToAddr(),realValue,trans.getData());

			if (privateKey.startsWith("0x")) {
				privateKey = privateKey.substring(2);
			}
			ECKeyPair ecKeyPair = ECKeyPair.create(new BigInteger(privateKey, 16));
			Credentials credentials = Credentials.create(ecKeyPair);

			
			byte[] raw = TransactionEncoder.signMessage(rawTransaction, credentials);
			
			return Numeric.toHexString(raw);
		 
		
	 }

2、基于以太坊的代币转账签名

 public String sign(Transaction trans, String privateKey) {
		 
		 BigInteger realValue = Convert.toWei(trans.getValue().toString(), Convert.Unit.ETHER).toBigInteger();
		 //0xa9059cbb代表某个代币的转账方法hex(transfer) + 对方的转账地址hex + 转账的值的hex
		 String data = "0xa9059cbb" + HexUtil.encodeHexStr(trans.getToAddr()) + realValue.toString(16);
		 RawTransaction rawTransaction = RawTransaction.createTransaction(trans.getNonce(),trans.getGasPrice(),trans.getGasLimit(),trans.getContractAddress(),realValue,data);

		if (privateKey.startsWith("0x")) {
			privateKey = privateKey.substring(2);
		}
		ECKeyPair ecKeyPair = ECKeyPair.create(new BigInteger(privateKey, 16));
		Credentials credentials = Credentials.create(ecKeyPair);
		
		byte[] raw = TransactionEncoder.signMessage(rawTransaction, credentials);
		
		return Numeric.toHexString(raw);
		
	 }

发表评论