@warren-bank/ethereumjs-tx-sign
v2.0.0
Published
minimal library to sign (and verify) raw Ethereum transactions
Downloads
19
Maintainers
Readme
ethereumjs-tx-sign
Description:
The goal of this project is to provide a light-weight minimal library to sign (and verify) raw Ethereum transactions.
Installation:
npm install --save '@warren-bank/ethereumjs-tx-sign'
Background:
ethereumjs-tx is the de-facto library used to sign raw transactions.
Clean installation of the ethereumjs-tx
module results in a node_modules
directory that is:
10.4 MB
24.9 MB
on disk (ext4)
Clean installation of this module results in a node_modules
directory that is:
333.5 KB
640.0 KB
on disk (ext4)
API:
{rawData, msgHash, DER, signature, rawTx} = sign(txData, privateKey)
- params:
- txData
- type: Object
- keys can include:
"nonce","gasPrice","gasLimit","to","value","data","chainId"
- values:
- type: String
- format: hex-encoded (with '0x' prefix)
- more generally: any value that can be converted to a Buffer:
rlp.toBuffer(value)
- exceptions:
- "chainId":
- type: native
Number
- notes:
- EIP 155
- value is used to modify
msgHash
- value is stored in
rawData
in the field corresponding to "v" (ie: thesignature recovery
shares its field with thechainId
); consequently, value is stored inrawTx
- type: native
- "chainId":
- privateKey
- type: String
- format: hex-encoded (with or without '0x' prefix)
- txData
- returns:
- rawData
- type: Array of Buffers
- length: 9
- values (and order) correspond to the data fields:
"nonce","gasPrice","gasLimit","to","value","data","v","r","s"
- msgHash
- description: sha3 hash of RLP encoded Array containing the first 6 elements of rawData
- note:
- if
chainId > 0
: Array is extended to 9 elements- 7th: Buffer containing
chainId
- 8th and 9th: zero-length Buffers
- 7th: Buffer containing
- if
- note:
- type: String
- format: hex-encoded (without '0x' prefix)
- description: sha3 hash of RLP encoded Array containing the first 6 elements of rawData
- DER
- description: DER encoded signature
- type: Array of Number
- format: each Number is an Integer in the range [0..255] and represents a single Byte
- signature
- Buffer
- length: 64 Bytes
- contents: rawData.r (32 Bytes) + rawData.s (32 Bytes)
- rawTx
- description: RLP encoded rawData
- type: String
- format: hex-encoded (without '0x' prefix)
- rawData
Example:
const {sign} = require('@warren-bank/ethereumjs-tx-sign')
const txData = {
nonce: '0x00',
gasPrice: '0x6fc23ac00',
gasLimit: '0x2710',
//to: '0x00',
value: '0x00',
data: '0x7f7465737432000000000000000000000000000000000000000000000000000000600057',
chainId: 1
}
const privateKey = 'e922354a3e5902b5ac474f3ff08a79cff43533826b8f451ae2190b65a9d26158'
const {rawTx} = sign(txData, privateKey)
const Web3 = require('web3')
const web3 = new Web3()
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'))
web3.eth.sendRawTransaction(rawTx, function(err, hash) {
if (err)
console.log('error:', err.message)
if ((!err) && hash)
console.log('transaction hash:', hash)
})
More Complete Example:
verify(msgHash, signature, publicKey)
- params:
- msgHash
- type: String
- format: hex-encoded (without '0x' prefix)
- signature
- type:
- Buffer: length of 64 Bytes
- Object:
{r, s}
- r: Buffer w/ length of 32 Bytes
- s: Buffer w/ length of 32 Bytes
- (DER encoded) Array of Number
- (DER encoded) String: hex-encoded (without '0x' prefix):
let DER_string = require('elliptic').utils.encode(DER, 'hex')
- type:
- publicKey
- type: String
- format: hex-encoded (with or without '0x' prefix)
- msgHash
- returns:
- Boolean
- indicates whether the
signature
can be verified for themsgHash
using thepublicKey
true
indicates that thesignature
was originally created using the (unavailable)privateKey
that is paired to the (available)publicKey
false
indicates that it was not
- indicates whether the
- Boolean
Example:
// continuation of the previous example:
const {verify} = require('@warren-bank/ethereumjs-tx-sign')
{
let {msgHash, signature} = sign(txData, privateKey)
let publicKey = '0493ff3bd23838a02f24adcb23aa90bf2de8becbd1abe688e0f6a3202bee2cc4c2ecf7cd2608cda0817d6223f81bed074f166b8b55de54d603817699b4c70feaac'
let result = verify(msgHash, signature, publicKey)
}
More Complete Example:
{txData, signature, msgHash, publicKey, address} = unsign(rawTx)
- params:
- rawTx
- type:
- String: hex-encoded (with or without '0x' prefix)
- Buffer
- type:
- rawTx
- returns:
- txData
- type: Object
- keys:
"nonce","gasPrice","gasLimit","to","value","data","chainId"
- values:
- type: String
- format: hex-encoded (with '0x' prefix)
- exceptions:
- "chainId":
- type: native
Number
- type: native
- "chainId":
- signature
- type: Object
- keys:
"r","s"
- values:
- type: String
- format: hex-encoded (without '0x' prefix)
- msgHash
- type: String
- format: hex-encoded (without '0x' prefix)
- publicKey
- type: String
- format: hex-encoded (without '0x' prefix)
- address
- description: "from" address … seen by network as the sender of this signed transaction
- type: String
- format: hex-encoded (without '0x' prefix)
- txData
Example:
// continuation of the previous example:
const {unsign} = require('@warren-bank/ethereumjs-tx-sign')
{
let {txData, msgHash, signature, publicKey} = unsign(rawTx)
let result = verify(msgHash, signature, publicKey)
}
More Complete Example:
Related:
- ethereumjs-tx-unsign
- exports a variation of the function:
unsign()
- it is a minimal library to retrieve
txData
and (optionally)signature
fromrawTx
- it doesn't include any external dependencies and (consequently) lacks the ability to calculate
publicKey
andaddress
fromsignature
- exports a variation of the function:
Bonus (Internal Library) APIs:
{privateKey, publicKey, address} = genKeyPair()
- returns:
- privateKey
- type: String
- format: hex-encoded (without '0x' prefix)
- publicKey
- type: String
- format: hex-encoded (without '0x' prefix)
- address
- type: String
- format: hex-encoded (without '0x' prefix)
- privateKey
Example:
const {genKeyPair} = require('@warren-bank/ethereumjs-tx-sign/lib/keypairs')
const {privateKey, publicKey, address} = genKeyPair()
console.log({privateKey, publicKey, address})
Output:
{
privateKey: 'e922354a3e5902b5ac474f3ff08a79cff43533826b8f451ae2190b65a9d26158',
publicKey: '0493ff3bd23838a02f24adcb23aa90bf2de8becbd1abe688e0f6a3202bee2cc4c2ecf7cd2608cda0817d6223f81bed074f166b8b55de54d603817699b4c70feaac',
address: 'f95abdf6ede4c3703e0e9453771fbee8592d31e9'
}
More Complete Example:
publicKey = privateToPublic(privateKey, compressed)
- params:
- privateKey
- type:
- String: hex-encoded (with or without '0x' prefix)
- Buffer
- type:
- compressed
- description
- type: Boolean
- default: false
- privateKey
- returns:
- publicKey
- type: String
- format: hex-encoded (without '0x' prefix)
- publicKey
Example:
// continuation of the previous example:
const {privateToPublic} = require('@warren-bank/ethereumjs-tx-sign/lib/keypairs')
{
let pubKey = privateToPublic(privateKey)
assert(pubKey === publicKey)
}
address = publicToAddress(publicKey)
- params:
- publicKey
- type:
- String: hex-encoded (with or without '0x' prefix)
- Buffer
- type:
- publicKey
- returns:
- address
- type: String
- format: hex-encoded (without '0x' prefix)
- address
Example:
// continuation of the previous example:
const {publicToAddress} = require('@warren-bank/ethereumjs-tx-sign/lib/keypairs')
{
let addr = publicToAddress(publicKey)
assert(addr === address)
}
hash = sha3(value, bits)
- params:
- value
- any value that can be converted to a Buffer:
rlp.toBuffer(value)
- any value that can be converted to a Buffer:
- bits
- type: Number
- supported values include:
224, 256, 384, 512
- default: 256
- value
- returns:
- hash
- type: String
- format: hex-encoded (without '0x' prefix)
- hash
Example:
const {sha3} = require('@warren-bank/ethereumjs-tx-sign/lib/keccak')
{
let hash = sha3('hello world')
}
Credits (mostly) Belong To:
Special Thanks To:
- elliptic
- is a dependency of this module
- is the work-horse that makes all of this possible