use of io.nuls.account.model.Account in project nuls by nuls-io.
the class AliasServiceTest method setAlias.
@Test
public void setAlias() {
List<Account> accounts = accountService.createAccount(1, "nuls123456").getData();
Account account = accounts.get(0);
Result result = aliasService.setAlias(account.getAddress().toString(), "nuls123456", "Charlie555");
assertTrue(result.isSuccess());
}
use of io.nuls.account.model.Account in project nuls by nuls-io.
the class AccountBaseService method getAllPrivateKey.
/**
* 获取所有本地账户账户私钥,必须保证所有账户密码一致,
* 如果本地账户中的密码不一致,将返回错误信息
* Get the all local private keys
*
* @param password
* @return
*/
public Result getAllPrivateKey(String password) {
Collection<Account> localAccountList = accountService.getAccountList().getData();
if (localAccountList == null || localAccountList.isEmpty()) {
return Result.getFailed(AccountErrorCode.ACCOUNT_NOT_EXIST);
}
if (StringUtils.isNotBlank(password) && !StringUtils.validPassword(password)) {
return Result.getFailed(AccountErrorCode.PASSWORD_IS_WRONG);
}
List<String> list = new ArrayList<>();
for (Account account : localAccountList) {
if (account.isEncrypted()) {
if (StringUtils.isBlank(password)) {
// 如果有账户是加密的,但是没有传密码,则返回错误信息;
return Result.getFailed(AccountErrorCode.HAVE_ENCRYPTED_ACCOUNT);
}
try {
byte[] priKeyBytes = account.getPriKey(password);
list.add(Hex.encode(priKeyBytes));
} catch (NulsException e) {
return Result.getFailed(AccountErrorCode.PASSWORD_IS_WRONG);
}
} else {
if (StringUtils.isNotBlank(password)) {
// 账户集合中有未加密账户,但是参数传了密码
return Result.getFailed(AccountErrorCode.HAVE_UNENCRYPTED_ACCOUNT);
}
list.add(Hex.encode(account.getPriKey()));
}
}
Map<String, List<String>> map = new HashMap<>();
map.put("value", list);
return Result.getSuccess().setData(map);
}
use of io.nuls.account.model.Account in project nuls by nuls-io.
the class AliasService method signMultiAliasTransaction.
/**
* A transfers NULS to B 多签交易
*
* @param signAddr 签名地址
* @param password password of A
* @param txdata 需要签名的数据
* @return Result
*/
public Result signMultiAliasTransaction(String signAddr, String password, String txdata) {
try {
Result<Account> accountResult = accountService.getAccount(signAddr);
if (accountResult.isFailed()) {
return accountResult;
}
Account account = accountResult.getData();
if (account.isEncrypted() && account.isLocked()) {
AssertUtil.canNotEmpty(password, "the password can not be empty");
if (!account.validatePassword(password)) {
return Result.getFailed(AccountErrorCode.PASSWORD_IS_WRONG);
}
}
AliasTransaction tx = new AliasTransaction();
TransactionSignature transactionSignature = new TransactionSignature();
byte[] txByte = Hex.decode(txdata);
tx.parse(new NulsByteBuffer(txByte));
transactionSignature.parse(new NulsByteBuffer(tx.getTransactionSignature()));
return accountLedgerService.txMultiProcess(tx, transactionSignature, account, password);
} catch (NulsException e) {
Log.error(e);
return Result.getFailed(e.getErrorCode());
} catch (Exception e) {
Log.error(e);
return Result.getFailed(AccountErrorCode.ACCOUNT_NOT_EXIST);
}
}
use of io.nuls.account.model.Account in project nuls by nuls-io.
the class AccountTool method createAccount.
public static Account createAccount(String prikey) throws NulsException {
ECKey key = null;
if (StringUtils.isBlank(prikey)) {
key = new ECKey();
} else {
try {
key = ECKey.fromPrivate(new BigInteger(1, Hex.decode(prikey)));
} catch (Exception e) {
throw new NulsException(AccountErrorCode.PRIVATE_KEY_WRONG, e);
}
}
Address address = new Address(NulsContext.getInstance().getDefaultChainId(), NulsContext.DEFAULT_ADDRESS_TYPE, SerializeUtils.sha256hash160(key.getPubKey()));
Account account = new Account();
account.setEncryptedPriKey(new byte[0]);
account.setAddress(address);
account.setPubKey(key.getPubKey());
account.setEcKey(key);
account.setPriKey(key.getPrivKeyBytes());
account.setCreateTime(TimeService.currentTimeMillis());
return account;
}
use of io.nuls.account.model.Account in project nuls by nuls-io.
the class AliasService method setMutilAlias.
/**
* 多签账户设置别名
* Initiate a transaction to set alias.
*
* @param addr Address of account
* @param signAddr Address of account
* @param password password of account
* @param aliasName the alias to set
* @return Result
*/
public Result<String> setMutilAlias(String addr, String signAddr, String aliasName, String password) {
// 签名账户
Account account = accountService.getAccount(signAddr).getData();
if (null == account) {
return Result.getFailed(AccountErrorCode.ACCOUNT_NOT_EXIST);
}
if (account.isEncrypted() && account.isLocked()) {
if (!account.validatePassword(password)) {
return Result.getFailed(AccountErrorCode.PASSWORD_IS_WRONG);
}
}
try {
byte[] addressBytes = AddressTool.getAddress(addr);
Result<MultiSigAccount> sigAccountResult = accountService.getMultiSigAccount(addr);
MultiSigAccount multiSigAccount = sigAccountResult.getData();
if (!AddressTool.validSignAddress(multiSigAccount.getPubKeyList(), account.getPubKey())) {
return Result.getFailed(AccountErrorCode.SIGN_ADDRESS_NOT_MATCH);
}
Script redeemScript = accountLedgerService.getRedeemScript(multiSigAccount);
if (redeemScript == null) {
return Result.getFailed(AccountErrorCode.ACCOUNT_NOT_EXIST);
}
AliasTransaction tx = new AliasTransaction();
TransactionSignature transactionSignature = new TransactionSignature();
List<P2PHKSignature> p2PHKSignatures = new ArrayList<>();
List<Script> scripts = new ArrayList<>();
tx.setTime(TimeService.currentTimeMillis());
Alias alias = new Alias(addressBytes, aliasName);
tx.setTxData(alias);
// 交易签名的长度为m*单个签名长度+赎回脚本长度
int scriptSignLenth = redeemScript.getProgram().length + ((int) multiSigAccount.getM()) * 72;
CoinDataResult coinDataResult = accountLedgerService.getMutilCoinData(addressBytes, AccountConstant.ALIAS_NA, tx.size() + scriptSignLenth, TransactionFeeCalculator.OTHER_PRICE_PRE_1024_BYTES);
if (!coinDataResult.isEnough()) {
return Result.getFailed(AccountErrorCode.INSUFFICIENT_BALANCE);
}
CoinData coinData = new CoinData();
coinData.setFrom(coinDataResult.getCoinList());
Coin change = coinDataResult.getChange();
if (null != change) {
// 创建toList
List<Coin> toList = new ArrayList<>();
toList.add(change);
coinData.setTo(toList);
}
Coin coin = new Coin(NulsConstant.BLACK_HOLE_ADDRESS, Na.parseNuls(1), 0);
coinData.addTo(coin);
tx.setCoinData(coinData);
tx.setHash(NulsDigestData.calcDigestData(tx.serializeForHash()));
// 将赎回脚本先存储在签名脚本中
scripts.add(redeemScript);
transactionSignature.setScripts(scripts);
// 使用签名账户对交易进行签名
P2PHKSignature p2PHKSignature = new P2PHKSignature();
ECKey eckey = account.getEcKey(password);
p2PHKSignature.setPublicKey(eckey.getPubKey());
// 用当前交易的hash和账户的私钥账户
p2PHKSignature.setSignData(accountService.signDigest(tx.getHash().getDigestBytes(), eckey));
p2PHKSignatures.add(p2PHKSignature);
Result result = txMutilProcessing(tx, p2PHKSignatures, scripts, transactionSignature, addressBytes);
return result;
} catch (Exception e) {
Log.error(e);
return Result.getFailed(KernelErrorCode.SYS_UNKOWN_EXCEPTION);
}
}
Aggregations