Commit f86b7237 authored by Karl Floersch's avatar Karl Floersch

Add custom encoding for chain elements

parent 99d84f27
...@@ -278,30 +278,13 @@ contract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, OVM_Ba ...@@ -278,30 +278,13 @@ contract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, OVM_Ba
_validateBatchContext(context, nextQueueIndex); _validateBatchContext(context, nextQueueIndex);
for (uint32 j = 0; j < context.numSequencedTransactions; j++) { for (uint32 j = 0; j < context.numSequencedTransactions; j++) {
bytes memory txData = _getTransactionData(nextSequencerTransactionPosition); (bytes32 leafHash, uint txDataLength) = _getSequencerChainElementLeafHash(
bytes memory encodedChainElement = new bytes(12 + txData.length); nextSequencerTransactionPosition,
// assembly { context.timestamp,
// let chainElementStart := add(encodedChainElement, 0x20) context.blockNumber
// mstore(chainElementStart, 1)
// mstore(add(chainElementStart, 0x20), 0)
// mstore(add(chainElementStart, 0x40), context.timestamp)
// mstore(add(chainElementStart, 0x40), context.blockNumber)
// mstore(add(chainElementStart, 0x40), context.blockNumber)
// }
leaves[transactionIndex] = keccak256(
txData
); );
// leaves[transactionIndex] = keccak256('hello world'); leaves[transactionIndex] = leafHash;
// leaves[transactionIndex] = _hashTransactionChainElement( nextSequencerTransactionPosition += uint32(TX_DATA_HEADER_SIZE + txDataLength);
// TransactionChainElement({
// isSequenced: true,
// queueIndex: 0,
// timestamp: context.timestamp,
// blockNumber: context.blockNumber,
// txData: txData
// })
// );
nextSequencerTransactionPosition += uint32(TX_DATA_HEADER_SIZE + txData.length);
numSequencerTransactionsProcessed++; numSequencerTransactionsProcessed++;
transactionIndex++; transactionIndex++;
} }
...@@ -375,18 +358,22 @@ contract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, OVM_Ba ...@@ -375,18 +358,22 @@ contract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, OVM_Ba
}); });
} }
/** // /**
* Returns the transaction data located at a particular start position in calldata. // * Returns the transaction data located at a particular start position in calldata.
* @param _startPosition Start position in calldata (represented in bytes). // * @param _startPosition Start position in calldata (represented in bytes).
* @return _transactionData The transaction data for this particular element. // * @return _transactionData The transaction data for this particular element.
*/ // */
function _getTransactionData( uint constant BYTES_TILL_TX_DATA = 66;
uint256 _startPosition function _getSequencerChainElementLeafHash(
uint256 _startPosition,
uint256 _timestamp,
uint256 _blockNumber
) )
internal internal
view view
returns ( returns (
bytes memory bytes32 _leafHash,
uint _txDataLength
) )
{ {
uint256 transactionSize; uint256 transactionSize;
...@@ -394,12 +381,32 @@ contract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, OVM_Ba ...@@ -394,12 +381,32 @@ contract OVM_CanonicalTransactionChain is iOVM_CanonicalTransactionChain, OVM_Ba
// 3 byte transactionSize // 3 byte transactionSize
transactionSize := shr(232, calldataload(_startPosition)) transactionSize := shr(232, calldataload(_startPosition))
} }
bytes memory _transactionData = new bytes(transactionSize); bytes memory _chainElement = new bytes(BYTES_TILL_TX_DATA + transactionSize);
assembly { assembly {
let chainElementStart := add(_chainElement, 0x20)
mstore8(chainElementStart, 1)
mstore8(add(chainElementStart, 1), 0)
mstore(add(chainElementStart, 2), _timestamp)
mstore(add(chainElementStart, 34), _blockNumber)
// Store the rest of the transaction // Store the rest of the transaction
calldatacopy(add(_transactionData, 0x20), add(_startPosition, 3), transactionSize) calldatacopy(add(chainElementStart, BYTES_TILL_TX_DATA), add(_startPosition, 3), transactionSize)
// Calculate the hash
_leafHash := keccak256(chainElementStart, add(BYTES_TILL_TX_DATA, transactionSize))
} }
return _transactionData; // console.log("Verifying that this worked!");
// console.logBytes(_chainElement);
// console.log("Hash:");
// console.logBytes32(_leafHash);
// console.log("TxSize:");
// console.log("transactionSize");
// console.log("~~~~~~~~");
return (
_leafHash,
transactionSize
);
} }
/** /**
......
...@@ -523,9 +523,10 @@ describe.only('OVM_CanonicalTransactionChain', () => { ...@@ -523,9 +523,10 @@ describe.only('OVM_CanonicalTransactionChain', () => {
console.log('\n~~~~ BEGINNGING TRASACTION IN QUESTION ~~~~') console.log('\n~~~~ BEGINNGING TRASACTION IN QUESTION ~~~~')
const transactions = [] const transactions = []
const numTxs = 200 const numTxs = 200
// const numTxs = 20
for (let i = 0; i < numTxs; i++) { for (let i = 0; i < numTxs; i++) {
// transactions.push('0x' + '1080111111111111111111111111111111111111111111111111111111111111') transactions.push('0x' + '1080111111111111111111111111111111111111111111111111111111111111')
transactions.push('0x' + '10801111') // transactions.push('0x' + '10801111')
} }
const res = await appendSequencerBatch(OVM_CanonicalTransactionChain, { const res = await appendSequencerBatch(OVM_CanonicalTransactionChain, {
shouldStartAtBatch: 2, shouldStartAtBatch: 2,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment