2017-01-11 8 views
1

다음 코드는 nodejs에 있습니다. var keythereum = require ('keythereum'); var crypto = require ("crypto"); var eccrypto = require ("eccrypto"); var pubToAddress = require ("ethereumjs-util"). pubToAddress; var ecdsa = new (필수 ("elliptic"). ec) ("secp256k1");ethereumjs-util에서 pubToAddress 메서드를 던집니다 AssertionError : false == true

// A new random 32-byte private key. 
var privateKey = crypto.randomBytes(32); 

// console.log(privateKey); 
// <Buffer 06 79 35 4c 5e dd a2 1d b3 cf 70 8d e7 92 06 50 a7 f3 a3 88 3c e0 8c 57 3a 45 7c 53 d1 71 46 a5> 

// Corresponding uncompressed (65-byte) public key. 
var publicKey = eccrypto.getPublic(privateKey); 

console.log(publicKey); 
// <Buffer 04 fa c7 15 ed c6 41 86 1e 18 fb e8 8d 6c e4 f7 75 1e d6 13 d9 b1 b5 f9 ba dc bc c6 48 1b c7 06 cb 28 4d b8 71 e6 74 75 5b e1 9e 49 15 07 76 80 21 3e ... > 

var address = pubToAddress(publicKey).toString("hex"); 

코드의 실행 마지막 행하면서 :

: 아웃 발견

AssertionError: false == true 
    at exports.pubToAddress.exports.publicToAddress (/myHomeDir/node_modules/ethereumjs-util/index.js:323:3) 
    at repl:1:15 
    at realRunInThisContextScript (vm.js:22:35) 
    at sigintHandlersWrap (vm.js:98:12) 
    at ContextifyScript.Script.runInThisContext (vm.js:24:12) 
    at REPLServer.defaultEval (repl.js:346:29) 
    at bound (domain.js:280:14) 
    at REPLServer.runBound [as eval] (domain.js:293:12) 
    at REPLServer.onLine (repl.js:544:10) 
    at emitOne (events.js:101:20) 

실패 주장이 하나인지 :

var address = pubToAddress(publicKey).toString("hex"); 

그것은 이런 주장 오류 발생

/** 
* Returns the ethereum address of a given public key. 
* Accepts "Ethereum public keys" and SEC1 encoded keys. 
* @param {Buffer} pubKey The two points of an uncompressed key, unless sanitize is enabled 
* @param {Boolean} [sanitize=false] Accept public keys in other formats 
* @return {Buffer} 
*/ 
exports.pubToAddress = exports.publicToAddress = function (pubKey, sanitize) { 
    pubKey = exports.toBuffer(pubKey) 
    if (sanitize && (pubKey.length !== 64)) { 
    pubKey = secp256k1.publicKeyConvert(pubKey, false).slice(1) 
    } 
    assert(pubKey.length === 64) 
    // Only take the lower 160bits of the hash 
    return exports.sha3(pubKey).slice(-20) 
} 

주소에서 첫 번째 바이트 (04)를 제거 하시겠습니까?

이 코드는 https://github.com/ethereumjs/keythereum/blob/master/test/keys.js에 기반하여 Ethereum 개인 키를 만들고 해당 공개 키와 주소를 얻으려고합니다. 마지막 단계에서 실패합니다. 무슨 일이 일어나고 있는지에 대한 어떤 힌트라도 도움이 될 것입니다. 고마워!

+0

왜 65 바이트 공개 키입니까? –

답변

0

이 코드는 잘 작동 :

var keythereum = require('keythereum'); 
var crypto = require("crypto"); 
var util = require("ethereumjs-util"); 

// A new random 32-byte private key. 
var privateKey = crypto.randomBytes(32); 

var publicKey = util.privateToPublic(privateKey); 
console.log(publicKey); 

var address = util.pubToAddress(publicKey).toString("hex"); 
console.log(address); 

var Tx = require('ethereumjs-tx'); 
// var privateKey = new Buffer('e331b6d69882b4cb4ea581d88e0b604039a3de5967688d3dcffdd2270c0fd109', 'hex'); 

var rawTx = { 
    nonce: '0x00', 
    gasPrice: '0x09184e72a000', 
    gasLimit: '0x2710', 
    to: '0x0000000000000000000000000000000000000000', 
    value: '0x00', 
    data: '0x7f7465737432000000000000000000000000000000000000000000000000000000600057' 
} 

var tx = new Tx(rawTx); 
tx.sign(privateKey); 

var serializedTx = tx.serialize(); 
console.log(serializedTx.toString('hex')); 

포인트는 사용 :

var publicKey = util.privateToPublic(privateKey); 

대신 : 전 하나 후자 반환 동안 64 바이트 공개 키를 반환

var publicKey = eccrypto.getPublic(privateKey); 

때문에 「04」바이트가 계속되는 65 바이트의 publicKey