Skip to content

Commit ab9b176

Browse files
committed
boc serialization
Signed-off-by: andreypfau <andreypfau@ton.org>
1 parent 1470d9b commit ab9b176

File tree

2 files changed

+143
-0
lines changed

2 files changed

+143
-0
lines changed

cell/src/boc/BagOfCells.kt

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package org.ton.sdk.cell.boc
22

3+
import kotlinx.io.Buffer
4+
import kotlinx.io.readByteArray
35
import org.ton.sdk.cell.Cell
6+
import org.ton.sdk.cell.CellContext
7+
import kotlin.jvm.JvmField
48
import kotlin.jvm.JvmOverloads
59
import kotlin.jvm.JvmStatic
610

@@ -37,6 +41,72 @@ public abstract class BagOfCells {
3741
}
3842
}
3943

44+
public class EncodeOptions internal constructor(
45+
/**
46+
* Enables bag-of-cells index creation
47+
*
48+
* (useful for lazy deserialization of large bags of cells).
49+
*/
50+
public val withIndex: Boolean,
51+
52+
/**
53+
* includes the CRC32-C of all data into the serialization
54+
*
55+
* (useful for checking data integrity).
56+
*/
57+
public val withCrc32c: Boolean,
58+
59+
/**
60+
* Explicitly stores the hash of the root cell into the serialization
61+
* (so that it can be quickly recovered afterwards without a complete deserialization).
62+
*/
63+
public val withTopHashes: Boolean,
64+
65+
/**
66+
* Stores hashes of some intermediate (non-leaf) cells
67+
* (useful for lazy deserialization of large bags of cells).
68+
*/
69+
public val withInternalHashes: Boolean,
70+
71+
/**
72+
* Stores cell cache bits to control caching of deserialized cells.
73+
*/
74+
public val withCacheBits: Boolean
75+
) {
76+
public class Builder {
77+
public var withIndex: Boolean = false
78+
79+
public var withCrc32c: Boolean = false
80+
81+
public var withTopHash: Boolean = false
82+
83+
public var withInternalHashes: Boolean = false
84+
85+
public var withCacheBits: Boolean = false
86+
87+
public fun build(): EncodeOptions {
88+
return EncodeOptions(
89+
withIndex = withIndex,
90+
withCrc32c = withCrc32c,
91+
withTopHashes = withTopHash,
92+
withInternalHashes = withInternalHashes,
93+
withCacheBits = withCacheBits
94+
)
95+
}
96+
}
97+
98+
public companion object {
99+
@JvmField
100+
public val Default: EncodeOptions = EncodeOptions(
101+
withIndex = false,
102+
withCrc32c = false,
103+
withTopHashes = false,
104+
withInternalHashes = false,
105+
withCacheBits = false
106+
)
107+
}
108+
}
109+
40110
public companion object {
41111
@JvmStatic
42112
@JvmOverloads
@@ -49,5 +119,28 @@ public abstract class BagOfCells {
49119
boc.getRootCell(it)
50120
}
51121
}
122+
123+
@JvmStatic
124+
@JvmOverloads
125+
public fun encodeToByteArray(
126+
cell: Cell,
127+
options: EncodeOptions = EncodeOptions.Default
128+
): ByteArray = encodeToByteArray(arrayOf(cell), options)
129+
130+
@JvmStatic
131+
@JvmOverloads
132+
public fun encodeToByteArray(
133+
rootCells: Array<Cell>,
134+
options: EncodeOptions = EncodeOptions.Default
135+
): ByteArray {
136+
val serializer = BagOfCellSerializer(CellContext.EMPTY)
137+
for (cell in rootCells) {
138+
serializer.addRoot(cell)
139+
}
140+
serializer.importCells()
141+
val buffer = Buffer()
142+
serializer.serialize(buffer, options)
143+
return buffer.readByteArray()
144+
}
52145
}
53146
}

cell/test/BocTest.kt

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,71 @@ import kotlinx.io.bytestring.hexToByteString
22
import org.ton.sdk.bitstring.BitString
33
import org.ton.sdk.cell.CellBuilder
44
import org.ton.sdk.cell.LevelMask
5+
import org.ton.sdk.cell.boc.BagOfCellSerializer
56
import org.ton.sdk.cell.boc.BagOfCells
67
import org.ton.sdk.crypto.HashBytes
8+
import utils.XorShift128Plus
9+
import utils.genRandomCell
710
import kotlin.io.encoding.Base64
811
import kotlin.test.Test
12+
import kotlin.test.assertContentEquals
913
import kotlin.test.assertEquals
1014

15+
const val WithIndex = 1
16+
const val WithCRC32C = 2
17+
const val WithTopHash = 4
18+
const val WithIntHashes = 8
19+
const val WithCacheBits = 16
20+
1121
class BocTest {
1222
val BLOCK_BOC = Base64.decode(
1323
"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AQZGBgCrAgcMy3KJaGkCAQFqawKkv//////////////////////////////////////////3mZblEX/////////////////////////////////////////76AAAAAAAAehIpmW5RHp8AgEBbG0Cl7+VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqtAAAAAAAAPQkgF2dwNY36BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnwAAAAAAB6EgBub3ASA19KMOtRU7vDd+S5YRYp3xV0o3YsVxfil+KYgQaHXEB2AAloEH+AAQNQQL0BA1BAcQCCchdmehF/86cNVJhgRbV/LJ1Wl88BRdle8KdBBs+EdQvgbktA9Ey6QScNR6ynBVt/uRPuoes+hh4hUiPsr/bunAUDr3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9CQ+dHLXb0ce+AkOPyVuc4q2oM6Cs2IYMQk4z7a7Yw+tU1AAAAAAAPQkFdzp+xAAFAhyc3QBAaCXAIJyHnhqiie2MVAL4BF4lL6/Qe8CQMyEfE8rNyStr3soE8JuS0D0TLpBJw1HrKcFW3+5E+6h6z6GHiFSI+yv9u6cBQIPBAkBfXhAGBF1uwCaJ8icQAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr3VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAAA9CSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdzp+xAAFAiFd3gAgnJomIvIQS7FJcDpkMLSyqM9fVoLQJpWcHbHY2Z/fqI1tWXwKk2UWh0MbWY/mavHsTmuty0SS7syj4b98snfX4n/AgUwMCR5uwCeQMyOYloAAAAAAAAAAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO1f/////////////////////////////////////////7wAAAAAAD0JFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF3On7EAA+ZluUSHt8fQIB4Jl+AIJykK7Illr6uxbrw8ubQI665xthjXh4i8gNCYQ1k8rJjaSQrsiWWvq7FuvDy5tAjrrnG2GNeHiLyA0JhDWTysmNpAAfBAkB7+kgAcAzLcojZbneQAEB354Dl76zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZnPgAAAAAAD0JAECBgoMDlb6FF8e99Rh8Va9Pi2H9wyFYjHq3aN7iSwBt8pEGRY188Cmii+Pe+ow+KtenxbD+4ZCsRj1btG9xJYA2+UiDIsa+fPAAAAAAAD0JAYmKiwEDUECEAQNAQLUAgnIP1UEdtc3LeZp5hKRqObENQiY64dJea4R57zagw5hRsQEHZSjKJIfoaBK4augfi4iQBztH+t+reS4iKVBW6JurA69zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzAAAAAAAPQkEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXc6fsQABQIhYaHAAEgAIJyD9VBHbXNy3maeYSkajmxDUImOuHSXmuEee82oMOYUbHYGzqg3KkHZW+wF5NgBw6Xhd9RAbdiSPJUIPKnOXhfaQIFIDAkiLsAnkVgzmJaAAAAAAAAAAAAmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQGMjQED2CCgAIJyQM270eUyEASY2lXOwa1zGcOT15+TXxuc2laNcYsejTQwIzXBV/uJY0XqmIWMz3yqSxcRcs7T7QY9HgbwsJJ97QEDZBCOAQPwIJoDr3NFF8e99Rh8Va9Pi2H9wyFYjHq3aN7iSwBt8pEGRY188AAAAAAA9CQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdzp+xAAdAiPkJEBAWCSAIJyQM270eUyEASY2lXOwa1zGcOT15+TXxuc2laNcYsejTTbQlZhSzRqQEXnwDTkUci5P2RHz6N9yi3usVfV3HF5zAIFIDAkrK0CAduTlAIBIJWWAQFImQEBIJcBASCYAKsp/mii+Pe+ow+KtenxbD+4ZCsRj1btG9xJYA2+UiDIsa+fP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBfXhAAAAAAAAAAehIS7nT9iQACL5/mii+Pe+ow+KtenxbD+4ZCsRj1btG9xJYA2+UiDIsa+ekDoyubogOt5ogAAAAAAD0JDXc6fsQABIZWxsbywgd29ybGQhgCrKf5oovj3vqMPirXp8Ww/uGQrEY9W7RvcSWANvlIgyLGvnz//////////////////////////////////////////+9Ae/pIAAAAAAAAAHoSIu50/YkADr3NFF8e99Rh8Va9Pi2H9wyFYjHq3aN7iSwBt8pEGRY188AAAAAAA9CR/enH7WqQlLsgPPhr74+vhaj2ywwQkKSNEDYFUJGBX1CAAAAAAAPQkFdzp+xAAFAibnJ0BAaCeAIJy20JWYUs0akBF58A05FHIuT9kR8+jfcot7rFX1dxxecz4U7M8kFJM2QhwC9M39pfjpZ7zLgne+VibSuRoopBqFwIPDAkBycOAGBGfuwCxWf//////////////////////////////////////////3z/NFF8e99Rh8Va9Pi2H9wyFYjHq3aN7iSwBt8pEGRY189AcnDgABstzvAAAAAAAHoSMu50/YkAAnEAjyLuAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOvc0UXx731GHxVr0+LYf3DIViMerdo3uJLAG3ykQZFjXzwAAAAAAD0JI2+4BhxrwSetFFzbq18vhqAlKfPnj2YYh6T+PCo20T/EAAAAAAA9CR13On7EAB0CKGiowEBYKQAgnL4U7M8kFJM2QhwC9M39pfjpZ7zLgne+VibSuRoopBqFzAjNcFX+4ljReqYhYzPfKpLFxFyztPtBj0eBvCwkn3tAgUwMCSsrQIB26WmAgEgp6gBAUirAQEgqQEBIKoAqyn+aKL4976jD4q16fFsP7hkKxGPVu0b3ElgDb5SIMixr58/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQF9eEAAAAAAAAAB6EkrudP2JAAIvn+aKL4976jD4q16fFsP7hkKxGPVu0b3ElgDb5SIMixr56QOjK5uiA63miAAAAAAAPQkpdzp+xAAEhlbGxvLCB3b3JsZCGAKsp/mii+Pe+ow+KtenxbD+4ZCsRj1btG9xJYA2+UiDIsa+fP//////////////////////////////////////////70B7+kgAAAAAAAAAehJa7nT9iQACeQmWuYloAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhwAAAAAAABgAAAAAABxmuhPF7j4siAmqXX/VfGrGf3kp2h0TSF436Y7tTPhB6QNA8BAED0ECxAB+wAAAAAEAAAAAAAAAAAAAEAgFwsrMA71gAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAKtiftocOhhpk4QsHt8jHSWwV/O7nxvFyZKUf75zoqiN3Bfb/JZk7D9mvTw7EDHU5BlaNBz2ml2s54kRzl0iBoQAAAAAAwAAAAAAAAAB/////gAAAAEu51AKgAAAMgAQAIBYbS1AgFhvL0BBkYGALkDr3MzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMAAAAAAA9CQjGnZo2te4osLQ5SkOWgrvafdG8SxAXuoTOJX+cOBjGFAAAAAAAPQkFdzp+xAAFAi2t7gBAaC5AIJy2Bs6oNypB2VvsBeTYAcOl4XfUQG3YkjyVCDypzl4X2kBB2UoyiSH6GgSuGroH4uIkAc7R/rfq3kuIilQVuibqwIPBAkZVPxAGBG6uwCraf4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT/MzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzNGVT8QAAAAAAAAAHoSAu50/YkAAnkLjzApgQAAAAAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW8AAAAAAAAAAAAAAAAEtRS2kSeULjPfdJ4YfFGEir+G1RruLcPyCFvDGFBOfjgQBBkYGAMEDr3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9CQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdzp+xAAFAi+v8ABAaDBAIJyF2Z6EX/zpw1UmGBFtX8snVaXzwFF2V7wp0EGz4R1C+AeeGqKJ7YxUAvgEXiUvr9B7wJAzIR8Tys3JK2veygTwgETBAgppAzUHv/+AsIBo2n+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAHoSAu50/YkDCAgEgw8QAFb4AAAO8s2cNwVVQABW/////vL0alKIAEDCXjmc="
1424
)
1525

26+
27+
private val encodeOptions = buildList {
28+
for (i in 0 until 32) {
29+
if (i and WithCacheBits != 0 && i and WithIndex == 0) continue
30+
val mode = BagOfCells.EncodeOptions.Builder()
31+
mode.withIndex = i and WithIndex != 0
32+
mode.withCrc32c = i and WithCRC32C != 0
33+
// On c++ implementation it's not work properly
34+
// mode.withTopHash = i and WithTopHash != 0
35+
mode.withInternalHashes = i and WithIntHashes != 0
36+
mode.withCacheBits = i and WithCacheBits != 0
37+
add(mode.build())
38+
}
39+
}
40+
41+
fun randomEncodeOption(random: XorShift128Plus): BagOfCells.EncodeOptions {
42+
return encodeOptions[random.nextInt(encodeOptions.size)]
43+
}
44+
45+
@Test
46+
fun testBoc() {
47+
val random = XorShift128Plus(12311)
48+
repeat(1) {
49+
val cell = genRandomCell(random.nextInt(1, 1001), random)
50+
val cellHash = cell.hash()
51+
val encodeOption = randomEncodeOption(random)
52+
val serialized = BagOfCells.encodeToByteArray(cell, encodeOption)
53+
54+
val loadedCell = BagOfCells.decodeFromByteArray(serialized).first()
55+
assertEquals(cellHash, loadedCell.hash())
56+
57+
val newSerialized = BagOfCells.encodeToByteArray(loadedCell, encodeOption)
58+
assertContentEquals(serialized, newSerialized)
59+
}
60+
}
61+
1662
@Test
1763
fun loadBoc() {
1864
val cell = BagOfCells.decodeFromByteArray(BLOCK_BOC).first()
1965
println(cell)
66+
67+
val serializer = BagOfCellSerializer()
68+
serializer.addRoot(cell)
69+
serializer.importCells()
2070
}
2171

2272
@Test

0 commit comments

Comments
 (0)