Encoding
Due to the large amount of information submitted and contract optimization considerations, we store the data of the check using a single uint256 field...
cheque data encoding
distributionId
32
0+32
224
4294967295
Bound distribution ID; uniquely identifies a distribution activity.
participationLimit
8
32+8
216
255
Participant restriction: 1. Any user, 2. Checked, 3. Others. Determine who can participate in the distribution activity.
minHardCap
8
40+8
208
255
Minimum hard cap value for the system, a positive integer from 1 to 100, where 1 equals 1/100; minimum funding target for the distribution activity.
maxHardCap
8
48+8
200
255
Maximum hard cap value for the system, a positive integer from 1 to 100, where 1 equals 1/100; maximum funding target for the distribution activity.
releaseRatio
8
56+8
192
255
Release ratio, a positive integer from 1 to 100, where 1 equals 1/100; determines the proportion of funds released to users.
releaseCycle
32
64+32
160
18446744073709551615
Unlocking period, 10-digit timestamp; time period for fund unlocking.
padding
64
96+64
128
18446744073709551615
Reserved for future extension; reserved field, currently unused, for future expansion.
financingAmount
64
128+64
64
18446744073709551615
Funding capital; total amount of funds involved in the distribution activity.
maxPerUser
64
192+64
0
18446744073709551615
Maximum amount of funds a single user can participate with during the check process.
Explanation:
Bit Index and Reverse Column: Provide the position and offset of each field within the bit field.
Mask Column: Provides the mask values used for bitwise operations to extract specific fields from the overall data.
Annotation Column: Provides detailed descriptions of each field and their roles within the system.
Length in Table: Indicates the number of bits each field occupies within the bit field.
Bit Index and Reverse Column: Used to calculate the exact position of each field within the bit field.
Mask Column: Used for bitwise operations on the bit field to ensure extraction or modification of relevant bits only.
JavaScript Encoding and Decoding Test
/** Struct ChequeStruct is used to store information about the cheque.
struct ChequeStruct {
uint32 distributionId; // Distribution ID to which the cheque is linked
uint8 participationLimit; // Participant limit: 1 any user, 2 expert, 3 other
uint8 minHardCap; // Minimum system hard cap, integer from 1 to 100 where 1=1/100
uint8 maxHardCap; // Maximum system hard cap, integer from 1 to 100 where 1=1/100
uint8 releaseRatio; // Release ratio, integer from 1 to 100 where 1=1/100
uint32 releaseCycle; // Unlock cycle in seconds; 1 minute = 60 seconds, 1 day = 86400 seconds
uint32 padding; // Padding data, meaningless, set to 0
uint64 financingAmount; // Financing amount; set to 0 if not needed, 100 tokens = 100 * 1e18 / 1e10
uint64 maxPerUser; // Maximum per user check limit, 100 tokens = 100 * 1e18 / 1e10
}
*/
var bigInt = require("big-integer");
function hideDataDis1(distribution) {
let targetId = bigInt(distribution.targetId);
let participationLimit = bigInt(distribution.participationLimit);
let minHardCap = bigInt(distribution.minHardCap);
let maxHardCap = bigInt(distribution.maxHardCap);
let releaseRatio = bigInt(distribution.releaseRatio);
let releaseCycle = bigInt(distribution.releaseCycle);
let padding = bigInt(distribution.padding);
let financingAmount = bigInt(distribution.financingAmount);
let maxPerUser = bigInt(distribution.maxPerUser);
// Incorrect bit shifting direction
let hiddenData = targetId.shiftLeft(8)
.or(participationLimit).shiftLeft(8)
.or(minHardCap).shiftLeft(8)
.or(maxHardCap).shiftLeft(8)
.or(releaseRatio).shiftLeft(32)
.or(releaseCycle).shiftLeft(32)
.or(padding).shiftLeft(64)
.or(financingAmount).shiftLeft(64)
.or(maxPerUser);
return hiddenData.toString(10);
}
function revealDataDis1(hiddenData) {
let data = bigInt(hiddenData);
let maxPerUser = data.and('18446744073709551615');
data = data.shiftRight(64);
let financingAmount = data.and('18446744073709551615');
data = data.shiftRight(64);
let padding = data.and('4294967295');
data = data.shiftRight(32);
let releaseCycle = data.and('4294967295');
data = data.shiftRight(32);
let releaseRatio = data.and('255');
data = data.shiftRight(8);
let maxHardCap = data.and('255');
data = data.shiftRight(8);
let minHardCap = data.and('255');
data = data.shiftRight(8);
let participationLimit = data.and('255');
data = data.shiftRight(8);
let targetIdLower = data.and('4294967295').toString();
data = data.shiftRight(32);
let targetIdUpper = data.and('4294967295').toString();
let targetId = targetIdUpper + targetIdLower;
return {
targetId: parseInt(targetId),
participationLimit: parseInt(participationLimit.toString()),
minHardCap: parseInt(minHardCap.toString()),
maxHardCap: parseInt(maxHardCap.toString()),
releaseRatio: parseInt(releaseRatio.toString()),
releaseCycle: parseInt(releaseCycle.toString()),
padding: parseInt(padding.toString()),
financingAmount: parseInt(financingAmount.toString()),
maxPerUser: parseInt(maxPerUser.toString())
};
}
// Test data
let chequeData = {
targetId: 12345,
participationLimit: 1,
minHardCap: 5,
maxHardCap: 10,
releaseRatio: 20,
releaseCycle: 1000000000,
padding: 123,
financingAmount: 5000000000,
maxPerUser: 10000000000
};
let encodedData = hideDataDis1(chequeData);
// 332820648991343397452793519134652897661010861321068696474042534556591104
console.log("Encoded Data:", encodedData);
let decodedData = revealDataDis1(encodedData);
console.log("Decoded Data:", decodedData);
Last updated