Advertisement
Guest User

address.ts

a guest
Nov 16th, 2020
433
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.76 KB | None | 0 0
  1. import { checkParams, ed25519, blake2b, isHexString } from '~@vite/vitejs-utils';
  2. import { addressIllegal } from '~@vite/vitejs-error';
  3.  
  4. import { Hex, AddressObj, Address } from './type';
  5.  
  6. const { keyPair, getPublicKey } = ed25519;
  7.  
  8. export const ADDR_PRE = 'vite_';
  9. export const ADDR_SIZE = 20;
  10. export const ADDR_CHECK_SUM_SIZE = 5;
  11. export const ADDR_LEN = ADDR_PRE.length + ADDR_SIZE * 2 + ADDR_CHECK_SUM_SIZE * 2;
  12. export enum AddressType {
  13. 'Illegal' = 0,
  14. 'Account',
  15. 'Contract'
  16. }
  17.  
  18.  
  19. export function createAddressByPrivateKey(privateKey?: Hex): AddressObj {
  20. const err = checkParams({ privateKey }, [], [{
  21. name: 'privateKey',
  22. func: isHexString
  23. }]);
  24. if (err) {
  25. throw err;
  26. }
  27.  
  28. // originalAddress = Blake2b(PubKey)(len:20) + (isContract ? 1 : 0)(len:1) // There is false
  29. const addressResult = createAddress(privateKey);
  30. const originalAddress = addressResult.originAddress;
  31.  
  32. // checkSum = isContract ? reverse(Blake2b(address[0:20])(len:5)) : Blake2b(address[0:20])(len:5) // There is false
  33. const checkSum = getAddrCheckSum(originalAddress, false);
  34.  
  35. // address = 'vite_' + Hex(originalAddress[0:20] + checkSum)
  36. const address = getHexAddr(originalAddress, checkSum);
  37. const publicKey: Buffer = getPublicKey(addressResult.privateKey);
  38.  
  39. return {
  40. originalAddress: originalAddress.toString('hex'),
  41. publicKey: Buffer.from(publicKey).toString('hex'),
  42. privateKey: addressResult.privateKey.toString('hex'),
  43. address
  44. };
  45. }
  46.  
  47. export function getAddressFromPublicKey(publicKey: Hex): Address {
  48. const err = checkParams({ publicKey }, ['publicKey'], [{
  49. name: 'publicKey',
  50. func: isHexString
  51. }]);
  52. if (err) {
  53. throw new Error(err.message);
  54. }
  55.  
  56. const publicKeyBuffer = Buffer.from(publicKey, 'hex');
  57.  
  58. const originalAddress = newAddrFromPub(publicKeyBuffer);
  59. const checkSum = getAddrCheckSum(originalAddress, false);
  60.  
  61. return getHexAddr(originalAddress, checkSum);
  62. }
  63.  
  64. export function getOriginalAddressFromAddress(hexAddr: Hex): Hex {
  65. const addrType = isValidAddress(hexAddr);
  66. if (addrType === AddressType.Illegal) {
  67. throw addressIllegal;
  68. }
  69.  
  70. return getOriginalAddress(hexAddr, addrType);
  71. }
  72.  
  73. export function getAddressFromOriginalAddress(originalAddress: Hex): Address {
  74. const err = checkParams({ originalAddress }, ['originalAddress'], [{
  75. name: 'originalAddress',
  76. func: _originalAddress => typeof _originalAddress === 'string' && /^[0-9a-fA-F]+$/.test(_originalAddress) && (_originalAddress.length === ADDR_SIZE * 2 || _originalAddress.length === (ADDR_SIZE + 1) * 2)
  77. }]);
  78. if (err) {
  79. throw new Error(err.message);
  80. }
  81.  
  82. let contractNum = Number(originalAddress.slice(-2));
  83. contractNum = contractNum !== 0 && contractNum !== 1 ? 0 : contractNum;
  84. const isContract = !!Number(contractNum);
  85.  
  86. const originalAddressBuf = Buffer.from(originalAddress, 'hex');
  87. const checkSum = getAddrCheckSum(originalAddressBuf, isContract);
  88. return getHexAddr(originalAddressBuf, checkSum);
  89. }
  90.  
  91. export function isValidAddress(address: Hex): AddressType {
  92. if (!isValidHex(address)) {
  93. return AddressType.Illegal;
  94. }
  95. return isValidCheckSum(address);
  96. }
  97.  
  98.  
  99. function getOriginalAddress(hexAddr: Hex, addrType: AddressType): Hex {
  100. const addr = hexAddr.slice(ADDR_PRE.length, ADDR_PRE.length + ADDR_SIZE * 2);
  101. if (addrType === AddressType.Account) {
  102. return `${ addr }00`;
  103. }
  104. return `${ addr }01`;
  105. }
  106.  
  107. function createAddress(privateKey?: Hex): {
  108. originAddress: Buffer;
  109. privateKey: Buffer;
  110. } {
  111. // Init priveKey
  112. let privateKeyBuffer: Buffer;
  113. if (privateKey) {
  114. privateKeyBuffer = Buffer.from(privateKey, 'hex');
  115. } else {
  116. const _keyPair = keyPair();
  117. privateKeyBuffer = _keyPair.privateKey;
  118. }
  119.  
  120. return {
  121. originAddress: newAddrFromPriv(privateKeyBuffer),
  122. privateKey: privateKeyBuffer
  123. };
  124. }
  125.  
  126. function newAddrFromPub(publicKey: Buffer): Buffer {
  127. const _pre = blake2b(publicKey, null, ADDR_SIZE);
  128.  
  129. const pre = new Uint8Array(21);
  130. pre.set(_pre);
  131. pre.set([0], 20);
  132.  
  133. return Buffer.from(pre);
  134. }
  135.  
  136. function newAddrFromPriv(privateKey: Buffer): Buffer {
  137. const publicKey: Buffer = getPublicKey(privateKey);
  138. return newAddrFromPub(Buffer.from(publicKey));
  139. }
  140.  
  141. function getAddrCheckSum(addr: Buffer, isContract? : boolean): Hex {
  142. const addrPre20 = addr.slice(0, 20);
  143. const _checkSum = blake2b(addrPre20, null, ADDR_CHECK_SUM_SIZE);
  144. const checkSum = Buffer.from(_checkSum);
  145.  
  146. if (!isContract) {
  147. return checkSum.toString('hex');
  148. }
  149.  
  150. const newCheckSum = [];
  151. checkSum.forEach(function (byte) {
  152. newCheckSum.push(byte ^ 0xFF);
  153. });
  154.  
  155. return Buffer.from(newCheckSum).toString('hex');
  156. }
  157.  
  158. function getHexAddr(originalAddress: Buffer, checkSum: Hex): Address {
  159. return ADDR_PRE + originalAddress.slice(0, 20).toString('hex') + checkSum;
  160. }
  161.  
  162. function isValidHex(hexAddr: Address): Boolean {
  163. return hexAddr && hexAddr.length === ADDR_LEN && hexAddr.indexOf(ADDR_PRE) === 0;
  164. }
  165.  
  166. function isValidCheckSum(hexAddr: Address): AddressType {
  167. const currentChecksum = hexAddr.slice(ADDR_PRE.length + ADDR_SIZE * 2);
  168. const _addr = hexAddr.slice(ADDR_PRE.length, ADDR_PRE.length + ADDR_SIZE * 2);
  169. const addr = Buffer.from(_addr, 'hex');
  170.  
  171. const contractCheckSum = getAddrCheckSum(addr, true);
  172. if (contractCheckSum === currentChecksum) {
  173. return AddressType.Contract;
  174. }
  175.  
  176. const checkSum = getAddrCheckSum(addr);
  177. if (currentChecksum === checkSum) {
  178. return AddressType.Account;
  179. }
  180.  
  181. return AddressType.Illegal;
  182. }
  183.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement