const tweetnacl=require('tweetnacl') const crypto = require('crypto') import {CurveTypeStr} from './type' import {PublicKey} from './public_key' import {PrivateKey} from './private_key' export class KeyPair{ CurveType:string=CurveTypeStr.Ed25519 PrivateKey:PrivateKey PublicKey:PublicKey Address:string constructor(privateKey:PrivateKey,publicKey:PublicKey,address:string){ this.PrivateKey=privateKey this.PublicKey=publicKey this.Address=address } static pubKeyToAddress(publicKey){ let hasherContract =crypto.createHash('sha256') hasherContract.write(Buffer.from(publicKey,'hex')) return Buffer.from(hasherContract.digest('hex'),'hex').slice(0, 20).toString('hex') } static generate(){ let nckp=tweetnacl.sign.keyPair() let privateKey=Buffer.from(nckp.secretKey).toString('hex').toUpperCase() let publicKey=Buffer.from(nckp.publicKey).toString('hex').toUpperCase() let address=KeyPair.pubKeyToAddress(Buffer.from(nckp.publicKey).toString('hex')).toUpperCase() return new KeyPair(new PrivateKey(privateKey),new PublicKey(publicKey),address) } sign(msg:Buffer){ return this.PrivateKey.sign(msg) } verify(msg:Buffer,signData:Uint8Array){ return this.PublicKey.verify(msg,signData) } }