Spaces:
Runtime error
Runtime error
| sidebar_position: 6 | |
| # How To Override Methods Compiled Code | |
| In some rare cases you might want to use low level Bitcoin script to write a smart contracts method. This is usually done for optimization of the scrip size. | |
| To achieve this currently, you have to edit the transpiled `.scrypt` files under your projects artifacts directory. | |
| To make this a bit easier, you can re-use the code inside the `optimizations/` directory in [`scrypt-ts-lib`](https://github.com/sCrypt-Inc/scrypt-ts-lib/tree/master/optimizations). | |
| Inside this directory, there is a shell script named `apply_asm_optim.sh`. In this script, you can specify the source files where substitution with a custom bitcoin script should occur. | |
| Let's take a quick look at how this is applied in `scrypt-ts-lib` for three source files: | |
| ```sh | |
| # BN256 | |
| apply artifacts/src/ec/bn256.scrypt optimizations/ec/bn256 | |
| # SECP256K1 | |
| apply artifacts/src/ec/secp256k1.scrypt optimizations/ec/secp256k1 | |
| # SECP256R1 | |
| apply artifacts/src/ec/secp256r1.scrypt optimizations/ec/secp256r1 | |
| ``` | |
| For instance, let's consider the content of `optimizations/ec/bn256`: | |
| ``` | |
| _addCurvePoints.asm | |
| doubleCurvePoint.asm | |
| lineFuncAdd.asm | |
| lineFuncDouble.asm | |
| modInverseBranchlessP.asm | |
| mulFQ12.asm | |
| mulLine.asm | |
| squareFQ12.asm | |
| ``` | |
| The name of each file corresponds to a function in the specified `.scrypt` source file (`bn256.scrypt` for this example). The files contain the actual bitcoin script in ASM format: | |
| ``` | |
| OP_3 OP_PICK 11 OP_PICK OP_MUL 12 OP_PICK OP_4 OP_PICK OP_MUL OP_ADD OP_3 OP_PICK 12 OP_PICK OP_MUL OP_5 OP_PICK 14 OP_PICK OP_MUL OP_SUB OP_7 OP_PICK 11 OP_PICK OP_MUL 12 OP_PICK OP_8 OP_PICK OP_MUL OP_ADD OP_7 OP_PICK 12 OP_PICK OP_MUL OP_9 OP_PICK 14 OP_PICK OP_MUL OP_SUB OP_3 OP_ROLL OP_ROT OP_ADD OP_ROT OP_ROT OP_ADD OP_4 OP_PICK 11 OP_PICK 13 OP_PICK OP_8 OP_PICK OP_DUP OP_3 OP_PICK OP_MUL OP_2 OP_PICK OP_5 OP_PICK OP_MUL OP_ADD OP_SWAP OP_ROT OP_MUL OP_3 OP_ROLL OP_3 ... | |
| ``` | |
| Please note that it is crucial to run `apply_asm_optim.sh` after each project build. To make this process more convenient, you can modify the build script in `package.json`: | |
| ```json | |
| "scripts": { | |
| "build": "tsc && npm run apply-optim", | |
| "apply-optim": "sh optimizations/apply_asm_optim.sh", | |
| ... | |
| ``` | |
| Now, after every build, the script optimizations will be applied. | |
| :::note | |
| Please bear in mind that modifying the contract's script code may cause inconsistencies between the on-chain and local execution (methods TS code) behavior. Once you modify the Bitcoin script, it is your responsibility to keep the two versions functionally equivalent. | |
| ::: |