@smartledger/bsv 3.1.1 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +123 -1
- package/README.md +233 -277
- package/bsv.bundle.js +39 -0
- package/bsv.min.js +8 -8
- package/docs/ADVANCED_COVENANT_DEVELOPMENT.md +533 -0
- package/docs/COVENANT_DEVELOPMENT_RESOLVED.md +169 -0
- package/docs/CUSTOM_SCRIPT_DEVELOPMENT.md +320 -0
- package/docs/README.md +201 -0
- package/docs/block.md +46 -0
- package/docs/ecies.md +102 -0
- package/docs/index.md +104 -0
- package/docs/nchain.md +958 -0
- package/docs/networks.md +55 -0
- package/docs/preimage.md +126 -0
- package/docs/script.md +139 -0
- package/docs/transaction.md +174 -0
- package/docs/unspentoutput.md +32 -0
- package/examples/README.md +200 -0
- package/examples/basic/transaction-creation.js +534 -0
- package/examples/basic/transaction_signature_api_gap.js +178 -0
- package/examples/covenants/advanced_covenant_demo.js +219 -0
- package/examples/covenants/covenant_interface_demo.js +270 -0
- package/examples/covenants/covenant_manual_signature_resolved.js +212 -0
- package/examples/covenants/covenant_signature_template.js +117 -0
- package/examples/covenants2/covenant_bidirectional_example.js +262 -0
- package/examples/covenants2/covenant_utils_demo.js +120 -0
- package/examples/covenants2/preimage_covenant_utils.js +287 -0
- package/examples/covenants2/production_integration.js +256 -0
- package/examples/data/covenant_utxos.json +28 -0
- package/examples/data/utxos.json +26 -0
- package/examples/preimage/README.md +178 -0
- package/examples/preimage/extract_preimage_bidirectional.js +421 -0
- package/examples/preimage/generate_sample_preimage.js +208 -0
- package/examples/preimage/generate_sighash_examples.js +152 -0
- package/examples/preimage/parse_preimage.js +117 -0
- package/examples/preimage/test_preimage_extractor.js +53 -0
- package/examples/preimage/test_varint_extraction.js +95 -0
- package/examples/scripts/custom_script_helper_example.js +273 -0
- package/examples/scripts/custom_script_signature_test.js +344 -0
- package/examples/scripts/script_interpreter.js +193 -0
- package/examples/smart_contract/complete_workflow_demo.js +343 -0
- package/examples/smart_contract/covenant_builder_demo.js +176 -0
- package/examples/smart_contract/script_testing_integration.js +198 -0
- package/index.js +3 -0
- package/lib/covenant-interface.js +713 -0
- package/lib/opcode.js +14 -7
- package/lib/smart_contract/API_REFERENCE.md +862 -0
- package/lib/smart_contract/DOCUMENTATION_SUMMARY.md +201 -0
- package/lib/smart_contract/EXAMPLES.md +751 -0
- package/lib/smart_contract/QUICK_START.md +549 -0
- package/lib/smart_contract/README.md +395 -0
- package/lib/smart_contract/builder.js +452 -0
- package/lib/smart_contract/covenant.js +336 -0
- package/lib/smart_contract/covenant_builder.js +512 -0
- package/lib/smart_contract/index.js +350 -0
- package/lib/smart_contract/opcode_list.js +30 -0
- package/lib/smart_contract/opcode_map.js +1174 -0
- package/lib/smart_contract/opcodes.md +1173 -0
- package/lib/smart_contract/preimage.js +903 -0
- package/lib/smart_contract/script_interpreter.js +236 -0
- package/lib/smart_contract/script_tester.js +487 -0
- package/lib/smart_contract/script_utils.js +621 -0
- package/lib/smart_contract/sighash.js +310 -0
- package/lib/smart_contract/smartledger-opcode_review.md +70 -0
- package/lib/smart_contract/stack_examiner.js +129 -0
- package/lib/smart_contract/test_integration.js +269 -0
- package/lib/smart_contract/utxo_generator.js +367 -0
- package/package.json +43 -10
- package/utilities/blockchain-state.json +20478 -3
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
# Custom Script Development Guide - SmartLedger-BSV v3.0.2
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
SmartLedger-BSV v3.0.2 provides complete signature capabilities for custom locking and unlocking scripts, enabling developers to build:
|
|
6
|
+
|
|
7
|
+
- **Custom Payment Conditions** - Beyond standard P2PKH
|
|
8
|
+
- **Multi-Signature Scripts** - Custom m-of-n signatures
|
|
9
|
+
- **Conditional Scripts** - IF/ELSE logic in Bitcoin Script
|
|
10
|
+
- **Time-Locked Scripts** - Block height and timestamp locks
|
|
11
|
+
- **Covenant Scripts** - Scripts that constrain future transactions
|
|
12
|
+
- **Smart Contracts** - Complex business logic on BSV blockchain
|
|
13
|
+
|
|
14
|
+
## Core API: Manual Signature Creation
|
|
15
|
+
|
|
16
|
+
For any custom script, use the universal signature creation method:
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
const bsv = require('smartledger-bsv');
|
|
20
|
+
|
|
21
|
+
function createCustomSignature(transaction, privateKey, inputIndex, lockingScript, satoshis, sighashType = null) {
|
|
22
|
+
sighashType = sighashType || (bsv.crypto.Signature.SIGHASH_ALL | bsv.crypto.Signature.SIGHASH_FORKID);
|
|
23
|
+
|
|
24
|
+
const signature = bsv.Transaction.sighash.sign(
|
|
25
|
+
transaction,
|
|
26
|
+
privateKey,
|
|
27
|
+
sighashType,
|
|
28
|
+
inputIndex,
|
|
29
|
+
lockingScript,
|
|
30
|
+
new bsv.crypto.BN(satoshis)
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
// Return signature with sighash type appended (required for script validation)
|
|
34
|
+
return Buffer.concat([signature.toDER(), Buffer.from([sighashType])]);
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 1. Multi-Signature Scripts
|
|
39
|
+
|
|
40
|
+
Create custom m-of-n multi-signature scripts:
|
|
41
|
+
|
|
42
|
+
```javascript
|
|
43
|
+
// Create 2-of-3 multisig locking script
|
|
44
|
+
const lockingScript = new bsv.Script()
|
|
45
|
+
.add(bsv.Opcode.OP_2)
|
|
46
|
+
.add(publicKey1.toBuffer())
|
|
47
|
+
.add(publicKey2.toBuffer())
|
|
48
|
+
.add(publicKey3.toBuffer())
|
|
49
|
+
.add(bsv.Opcode.OP_3)
|
|
50
|
+
.add(bsv.Opcode.OP_CHECKMULTISIG);
|
|
51
|
+
|
|
52
|
+
// Create signatures for unlocking
|
|
53
|
+
const sig1 = createCustomSignature(tx, privateKey1, 0, lockingScript, satoshis);
|
|
54
|
+
const sig2 = createCustomSignature(tx, privateKey2, 0, lockingScript, satoshis);
|
|
55
|
+
|
|
56
|
+
// Create unlocking script (need OP_0 due to CHECKMULTISIG bug)
|
|
57
|
+
const unlockingScript = new bsv.Script()
|
|
58
|
+
.add(bsv.Opcode.OP_0)
|
|
59
|
+
.add(sig1)
|
|
60
|
+
.add(sig2);
|
|
61
|
+
|
|
62
|
+
tx.inputs[0].setScript(unlockingScript);
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 2. Conditional Scripts (IF/ELSE)
|
|
66
|
+
|
|
67
|
+
Create scripts with branching logic:
|
|
68
|
+
|
|
69
|
+
```javascript
|
|
70
|
+
// Locking script: IF <condition1> ELSE <condition2> ENDIF
|
|
71
|
+
const lockingScript = new bsv.Script()
|
|
72
|
+
.add(bsv.Opcode.OP_IF)
|
|
73
|
+
// First condition (e.g., key1)
|
|
74
|
+
.add(bsv.Opcode.OP_DUP)
|
|
75
|
+
.add(bsv.Opcode.OP_HASH160)
|
|
76
|
+
.add(publicKey1.toAddress().hashBuffer)
|
|
77
|
+
.add(bsv.Opcode.OP_EQUALVERIFY)
|
|
78
|
+
.add(bsv.Opcode.OP_CHECKSIG)
|
|
79
|
+
.add(bsv.Opcode.OP_ELSE)
|
|
80
|
+
// Second condition (e.g., key2)
|
|
81
|
+
.add(bsv.Opcode.OP_DUP)
|
|
82
|
+
.add(bsv.Opcode.OP_HASH160)
|
|
83
|
+
.add(publicKey2.toAddress().hashBuffer)
|
|
84
|
+
.add(bsv.Opcode.OP_EQUALVERIFY)
|
|
85
|
+
.add(bsv.Opcode.OP_CHECKSIG)
|
|
86
|
+
.add(bsv.Opcode.OP_ENDIF);
|
|
87
|
+
|
|
88
|
+
// Unlocking for IF branch
|
|
89
|
+
const unlockingScript = new bsv.Script()
|
|
90
|
+
.add(signature)
|
|
91
|
+
.add(publicKey1.toBuffer())
|
|
92
|
+
.add(bsv.Opcode.OP_1); // Choose IF branch
|
|
93
|
+
|
|
94
|
+
// Unlocking for ELSE branch
|
|
95
|
+
const unlockingScript = new bsv.Script()
|
|
96
|
+
.add(signature)
|
|
97
|
+
.add(publicKey2.toBuffer())
|
|
98
|
+
.add(bsv.Opcode.OP_0); // Choose ELSE branch
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## 3. Time-Locked Scripts
|
|
102
|
+
|
|
103
|
+
Create scripts that can only be spent after a specific time or block height:
|
|
104
|
+
|
|
105
|
+
```javascript
|
|
106
|
+
const lockHeight = 700000; // Block height
|
|
107
|
+
|
|
108
|
+
// Time-locked locking script
|
|
109
|
+
const lockingScript = new bsv.Script()
|
|
110
|
+
.add(Buffer.from(lockHeight.toString(16).padStart(8, '0'), 'hex').reverse())
|
|
111
|
+
.add(bsv.Opcode.OP_CHECKLOCKTIMEVERIFY)
|
|
112
|
+
.add(bsv.Opcode.OP_DROP)
|
|
113
|
+
// Then normal P2PKH
|
|
114
|
+
.add(bsv.Opcode.OP_DUP)
|
|
115
|
+
.add(bsv.Opcode.OP_HASH160)
|
|
116
|
+
.add(publicKey.toAddress().hashBuffer)
|
|
117
|
+
.add(bsv.Opcode.OP_EQUALVERIFY)
|
|
118
|
+
.add(bsv.Opcode.OP_CHECKSIG);
|
|
119
|
+
|
|
120
|
+
// Set transaction lock time
|
|
121
|
+
const tx = new bsv.Transaction()
|
|
122
|
+
.from(utxo)
|
|
123
|
+
.to(address, amount)
|
|
124
|
+
.lockUntilBlockHeight(lockHeight);
|
|
125
|
+
|
|
126
|
+
// Create signature and unlocking script normally
|
|
127
|
+
const signature = createCustomSignature(tx, privateKey, 0, lockingScript, satoshis);
|
|
128
|
+
const unlockingScript = new bsv.Script()
|
|
129
|
+
.add(signature)
|
|
130
|
+
.add(publicKey.toBuffer());
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## 4. Covenant Scripts (Transaction Introspection)
|
|
134
|
+
|
|
135
|
+
Create scripts that examine the transaction they're in:
|
|
136
|
+
|
|
137
|
+
```javascript
|
|
138
|
+
// Get transaction preimage for covenant validation
|
|
139
|
+
const sighashType = bsv.crypto.Signature.SIGHASH_ALL | bsv.crypto.Signature.SIGHASH_FORKID;
|
|
140
|
+
const preimage = bsv.Transaction.sighash.sighash(
|
|
141
|
+
transaction,
|
|
142
|
+
sighashType,
|
|
143
|
+
inputIndex,
|
|
144
|
+
lockingScript,
|
|
145
|
+
new bsv.crypto.BN(satoshis)
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
// The preimage contains all transaction data that can be examined:
|
|
149
|
+
// - Version (4 bytes)
|
|
150
|
+
// - Input prevouts hash (32 bytes)
|
|
151
|
+
// - Input sequence hash (32 bytes)
|
|
152
|
+
// - Previous output (36 bytes)
|
|
153
|
+
// - Previous output script (variable)
|
|
154
|
+
// - Previous output amount (8 bytes)
|
|
155
|
+
// - Sequence (4 bytes)
|
|
156
|
+
// - Outputs hash (32 bytes)
|
|
157
|
+
// - Lock time (4 bytes)
|
|
158
|
+
// - Sighash type (4 bytes)
|
|
159
|
+
|
|
160
|
+
console.log(`Preimage: ${preimage.toString('hex')}`);
|
|
161
|
+
console.log(`Preimage length: ${preimage.length} bytes`);
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## 5. Advanced Pattern: State Machine Scripts
|
|
165
|
+
|
|
166
|
+
Create scripts that enforce state transitions:
|
|
167
|
+
|
|
168
|
+
```javascript
|
|
169
|
+
// State machine: INIT -> PENDING -> COMPLETE
|
|
170
|
+
const STATE_INIT = 0;
|
|
171
|
+
const STATE_PENDING = 1;
|
|
172
|
+
const STATE_COMPLETE = 2;
|
|
173
|
+
|
|
174
|
+
function createStateMachineScript(currentState, nextState, publicKeys) {
|
|
175
|
+
return new bsv.Script()
|
|
176
|
+
// Check current state
|
|
177
|
+
.add(Buffer.from([currentState]))
|
|
178
|
+
.add(bsv.Opcode.OP_EQUAL)
|
|
179
|
+
.add(bsv.Opcode.OP_VERIFY)
|
|
180
|
+
|
|
181
|
+
// Check next state transition is valid
|
|
182
|
+
.add(Buffer.from([nextState]))
|
|
183
|
+
.add(Buffer.from([currentState + 1]))
|
|
184
|
+
.add(bsv.Opcode.OP_EQUAL)
|
|
185
|
+
.add(bsv.Opcode.OP_VERIFY)
|
|
186
|
+
|
|
187
|
+
// Require signature
|
|
188
|
+
.add(bsv.Opcode.OP_DUP)
|
|
189
|
+
.add(bsv.Opcode.OP_HASH160)
|
|
190
|
+
.add(publicKeys[currentState].toAddress().hashBuffer)
|
|
191
|
+
.add(bsv.Opcode.OP_EQUALVERIFY)
|
|
192
|
+
.add(bsv.Opcode.OP_CHECKSIG);
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## 6. Best Practices
|
|
197
|
+
|
|
198
|
+
### Signature Types
|
|
199
|
+
- Use `SIGHASH_ALL | SIGHASH_FORKID` for most cases (signs entire transaction)
|
|
200
|
+
- Use `SIGHASH_SINGLE | SIGHASH_FORKID` to sign only corresponding output
|
|
201
|
+
- Use `SIGHASH_NONE | SIGHASH_FORKID` to allow output modifications
|
|
202
|
+
|
|
203
|
+
### Script Validation
|
|
204
|
+
Always test your scripts:
|
|
205
|
+
|
|
206
|
+
```javascript
|
|
207
|
+
// Verify transaction is valid
|
|
208
|
+
const isValid = transaction.verify();
|
|
209
|
+
console.log(`Transaction valid: ${isValid}`);
|
|
210
|
+
|
|
211
|
+
// Check specific input signature
|
|
212
|
+
const interpreter = new bsv.Script.Interpreter();
|
|
213
|
+
const isScriptValid = interpreter.verify(
|
|
214
|
+
unlockingScript,
|
|
215
|
+
lockingScript,
|
|
216
|
+
transaction,
|
|
217
|
+
inputIndex,
|
|
218
|
+
flags
|
|
219
|
+
);
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Security Considerations
|
|
223
|
+
1. **Always validate inputs** - Check all data before using in scripts
|
|
224
|
+
2. **Use proper sighash types** - Don't accidentally allow transaction modifications
|
|
225
|
+
3. **Test edge cases** - Empty stacks, invalid signatures, malformed scripts
|
|
226
|
+
4. **Minimize script size** - Smaller scripts = lower fees
|
|
227
|
+
5. **Use OP_CHECKLOCKTIMEVERIFY properly** - Ensure nlocktime is set correctly
|
|
228
|
+
|
|
229
|
+
## 7. Testing Framework
|
|
230
|
+
|
|
231
|
+
Use our comprehensive test suite:
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
# Run all custom script tests
|
|
235
|
+
node custom_script_signature_test.js
|
|
236
|
+
|
|
237
|
+
# Test specific patterns
|
|
238
|
+
node covenant_test.js
|
|
239
|
+
node multisig_test.js
|
|
240
|
+
node timelock_test.js
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## 8. Ultra-Low Fee Configuration
|
|
244
|
+
|
|
245
|
+
All custom scripts benefit from our ultra-low fee system:
|
|
246
|
+
|
|
247
|
+
```javascript
|
|
248
|
+
// Configure ultra-low fees (0.01 sats/byte)
|
|
249
|
+
const feePerKb = 10; // 10 sats per KB = 0.01 sats per byte
|
|
250
|
+
|
|
251
|
+
const tx = new bsv.Transaction()
|
|
252
|
+
.from(utxos)
|
|
253
|
+
.to(address, amount)
|
|
254
|
+
.feePerKb(feePerKb);
|
|
255
|
+
|
|
256
|
+
// Custom script transaction will use minimal fees
|
|
257
|
+
console.log(`Transaction fee: ${tx.getFee()} satoshis`);
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## 9. Real-World Examples
|
|
261
|
+
|
|
262
|
+
### Escrow Contract
|
|
263
|
+
```javascript
|
|
264
|
+
// 2-of-3 escrow: buyer, seller, arbitrator
|
|
265
|
+
const escrowScript = new bsv.Script()
|
|
266
|
+
.add(bsv.Opcode.OP_2)
|
|
267
|
+
.add(buyerPubKey.toBuffer())
|
|
268
|
+
.add(sellerPubKey.toBuffer())
|
|
269
|
+
.add(arbitratorPubKey.toBuffer())
|
|
270
|
+
.add(bsv.Opcode.OP_3)
|
|
271
|
+
.add(bsv.Opcode.OP_CHECKMULTISIG);
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Payment Channel
|
|
275
|
+
```javascript
|
|
276
|
+
// Payment channel with time lock fallback
|
|
277
|
+
const channelScript = new bsv.Script()
|
|
278
|
+
.add(bsv.Opcode.OP_IF)
|
|
279
|
+
// Both parties agree
|
|
280
|
+
.add(bsv.Opcode.OP_2)
|
|
281
|
+
.add(alicePubKey.toBuffer())
|
|
282
|
+
.add(bobPubKey.toBuffer())
|
|
283
|
+
.add(bsv.Opcode.OP_2)
|
|
284
|
+
.add(bsv.Opcode.OP_CHECKMULTISIG)
|
|
285
|
+
.add(bsv.Opcode.OP_ELSE)
|
|
286
|
+
// Time lock fallback to Alice
|
|
287
|
+
.add(Buffer.from(lockTime.toString(16).padStart(8, '0'), 'hex').reverse())
|
|
288
|
+
.add(bsv.Opcode.OP_CHECKLOCKTIMEVERIFY)
|
|
289
|
+
.add(bsv.Opcode.OP_DROP)
|
|
290
|
+
.add(alicePubKey.toBuffer())
|
|
291
|
+
.add(bsv.Opcode.OP_CHECKSIG)
|
|
292
|
+
.add(bsv.Opcode.OP_ENDIF);
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Token Contract
|
|
296
|
+
```javascript
|
|
297
|
+
// Simple token transfer covenant
|
|
298
|
+
const tokenScript = new bsv.Script()
|
|
299
|
+
// Check output preserves token amount
|
|
300
|
+
.add(bsv.Opcode.OP_DUP)
|
|
301
|
+
.add(bsv.Opcode.OP_HASH160)
|
|
302
|
+
.add(newOwnerPubKeyHash)
|
|
303
|
+
.add(bsv.Opcode.OP_EQUALVERIFY)
|
|
304
|
+
.add(bsv.Opcode.OP_CHECKSIG)
|
|
305
|
+
|
|
306
|
+
// Covenant: ensure output amount >= input amount
|
|
307
|
+
.add(bsv.Opcode.OP_DUP)
|
|
308
|
+
.add(Buffer.from(inputAmount.toString(16), 'hex'))
|
|
309
|
+
.add(bsv.Opcode.OP_GREATERTHANOREQUAL)
|
|
310
|
+
.add(bsv.Opcode.OP_VERIFY);
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
## Support
|
|
314
|
+
|
|
315
|
+
For custom script development support:
|
|
316
|
+
- Check `custom_script_signature_test.js` for working examples
|
|
317
|
+
- Review `transaction_signature_api_gap.js` for signature troubleshooting
|
|
318
|
+
- All signature methods are battle-tested and production-ready
|
|
319
|
+
|
|
320
|
+
**SmartLedger-BSV v3.0.2 enables the full power of Bitcoin Script for your applications!** 🚀
|
package/docs/README.md
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# SmartLedger-BSV Documentation
|
|
2
|
+
|
|
3
|
+
Comprehensive documentation for SmartLedger-BSV v3.1.1+ - Advanced Bitcoin SV Library with Enterprise Covenant Framework.
|
|
4
|
+
|
|
5
|
+
## 📚 Documentation Structure
|
|
6
|
+
|
|
7
|
+
### Core Guides
|
|
8
|
+
- **[Getting Started](getting-started.md)** - Installation, setup, and first steps
|
|
9
|
+
- **[API Reference](api-reference.md)** - Complete API documentation
|
|
10
|
+
- **[Configuration Guide](configuration.md)** - Setup and optimization
|
|
11
|
+
|
|
12
|
+
### Advanced Features
|
|
13
|
+
- **[Advanced Covenant Development](ADVANCED_COVENANT_DEVELOPMENT.md)** - BIP143 + nChain PUSHTX techniques
|
|
14
|
+
- **[Custom Script Development](CUSTOM_SCRIPT_DEVELOPMENT.md)** - Script creation patterns
|
|
15
|
+
- **[Covenant Development Resolved](COVENANT_DEVELOPMENT_RESOLVED.md)** - Problem solutions and working examples
|
|
16
|
+
|
|
17
|
+
### Technical Specifications
|
|
18
|
+
- **[BIP143 Preimage Format](preimage.md)** - Detailed preimage structure specification
|
|
19
|
+
- **[nChain PUSHTX Paper](nchain.md)** - Academic research integration (WP1605)
|
|
20
|
+
- **[Security Best Practices](security-best-practices.md)** - Production guidelines
|
|
21
|
+
|
|
22
|
+
## 🎯 Quick Navigation
|
|
23
|
+
|
|
24
|
+
### New to SmartLedger-BSV?
|
|
25
|
+
1. **[Getting Started](getting-started.md)** - Begin here for installation and basic usage
|
|
26
|
+
2. **[Examples Directory](../examples/)** - Hands-on code examples
|
|
27
|
+
3. **[Basic Usage](#basic-usage)** - Common patterns and workflows
|
|
28
|
+
|
|
29
|
+
### Building Custom Scripts?
|
|
30
|
+
1. **[Custom Script Development](CUSTOM_SCRIPT_DEVELOPMENT.md)** - Complete guide to script creation
|
|
31
|
+
2. **[Script Examples](../examples/scripts/)** - Working code examples
|
|
32
|
+
3. **[API Reference](api-reference.md)** - CustomScriptHelper documentation
|
|
33
|
+
|
|
34
|
+
### Developing Covenants?
|
|
35
|
+
1. **[Advanced Covenant Development](ADVANCED_COVENANT_DEVELOPMENT.md)** - Complete covenant framework
|
|
36
|
+
2. **[Covenant Examples](../examples/covenants/)** - Working covenant patterns
|
|
37
|
+
3. **[BIP143 Specification](preimage.md)** - Preimage structure details
|
|
38
|
+
4. **[nChain PUSHTX](nchain.md)** - Academic research foundation
|
|
39
|
+
|
|
40
|
+
### Production Deployment?
|
|
41
|
+
1. **[Security Best Practices](security-best-practices.md)** - Production guidelines
|
|
42
|
+
2. **[Configuration Guide](configuration.md)** - Optimization and setup
|
|
43
|
+
3. **[API Reference](api-reference.md)** - Complete API documentation
|
|
44
|
+
|
|
45
|
+
## 🚀 Key Features Overview
|
|
46
|
+
|
|
47
|
+
### Core Library Capabilities
|
|
48
|
+
- **Complete BSV API**: Full compatibility with Bitcoin SV operations
|
|
49
|
+
- **Ultra-Low Fees**: 0.01 sats/byte configuration (91% fee reduction)
|
|
50
|
+
- **UTXO Management**: Advanced state management with change outputs
|
|
51
|
+
- **CDN Distribution**: Multiple webpack bundles for web development
|
|
52
|
+
- **Security Hardened**: Enhanced elliptic curve security fixes
|
|
53
|
+
|
|
54
|
+
### Advanced Covenant Framework
|
|
55
|
+
- **BIP143 Compliant**: Complete preimage parsing with field-by-field access
|
|
56
|
+
- **PUSHTX Integration**: nChain WP1605 in-script signature generation
|
|
57
|
+
- **PELS Support**: Perpetually Enforcing Locking Scripts for ongoing rules
|
|
58
|
+
- **Dual-Level API**: High-level abstractions with granular BSV control
|
|
59
|
+
- **Production Ready**: Comprehensive validation and error handling
|
|
60
|
+
|
|
61
|
+
### Custom Script Development
|
|
62
|
+
- **Multi-signature Scripts**: Advanced m-of-n signature schemes
|
|
63
|
+
- **Timelock Contracts**: Block height and timestamp constraints
|
|
64
|
+
- **Conditional Logic**: Complex branching and validation rules
|
|
65
|
+
- **Template System**: Pre-built patterns for common use cases
|
|
66
|
+
- **Developer API**: Simplified interface for rapid development
|
|
67
|
+
|
|
68
|
+
## 📖 Documentation Categories
|
|
69
|
+
|
|
70
|
+
### 📦 Installation & Setup
|
|
71
|
+
```javascript
|
|
72
|
+
// NPM installation
|
|
73
|
+
npm install @smartledger/bsv
|
|
74
|
+
|
|
75
|
+
// Basic usage
|
|
76
|
+
const bsv = require('@smartledger/bsv');
|
|
77
|
+
const tx = new bsv.Transaction()
|
|
78
|
+
.from(utxo)
|
|
79
|
+
.to(address, amount)
|
|
80
|
+
.feePerKb(10); // Ultra-low fees
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 🔒 Covenant Development
|
|
84
|
+
```javascript
|
|
85
|
+
// Advanced covenant creation
|
|
86
|
+
const { CovenantInterface } = require('@smartledger/bsv/lib/covenant-interface');
|
|
87
|
+
const covenant = new CovenantInterface();
|
|
88
|
+
|
|
89
|
+
// PUSHTX covenant with nChain techniques
|
|
90
|
+
const pushtx = covenant.createAdvancedCovenant('pushtx', {
|
|
91
|
+
publicKey: publicKey,
|
|
92
|
+
enforceOutputs: true
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
// Perpetual covenant (PELS)
|
|
96
|
+
const pels = covenant.createAdvancedCovenant('perpetual', {
|
|
97
|
+
publicKeyHash: pubkeyHash,
|
|
98
|
+
feeDeduction: 512,
|
|
99
|
+
enforceScript: true
|
|
100
|
+
});
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 🛠️ Custom Scripts
|
|
104
|
+
```javascript
|
|
105
|
+
// Custom script development
|
|
106
|
+
const { CustomScriptHelper } = require('@smartledger/bsv/lib/custom-script-helper');
|
|
107
|
+
const helper = new CustomScriptHelper();
|
|
108
|
+
|
|
109
|
+
// Multi-signature script
|
|
110
|
+
const multisig = helper.createMultisigScript([pk1, pk2, pk3], 2);
|
|
111
|
+
|
|
112
|
+
// Timelock script
|
|
113
|
+
const timelock = helper.createTimelockScript(publicKey, 750000, 'block');
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 📊 BIP143 Preimage Analysis
|
|
117
|
+
```javascript
|
|
118
|
+
// Enhanced preimage parsing
|
|
119
|
+
const { CovenantPreimage } = require('@smartledger/bsv/lib/covenant-interface');
|
|
120
|
+
const preimage = new CovenantPreimage(preimageHex);
|
|
121
|
+
|
|
122
|
+
console.log('Version:', preimage.nVersionValue); // uint32 accessor
|
|
123
|
+
console.log('Amount:', preimage.amountValue); // BigInt accessor
|
|
124
|
+
console.log('Valid:', preimage.isValid); // Structure validation
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## 🔧 Technical Specifications
|
|
128
|
+
|
|
129
|
+
### BIP143 Preimage Structure (108+ bytes)
|
|
130
|
+
```
|
|
131
|
+
Field 1: nVersion (4 bytes, little-endian)
|
|
132
|
+
Field 2: hashPrevouts (32 bytes) - double SHA256 of input outpoints
|
|
133
|
+
Field 3: hashSequence (32 bytes) - double SHA256 of input sequences
|
|
134
|
+
Field 4: outpoint (36 bytes) - prevTxId + outputIndex
|
|
135
|
+
Field 5: scriptCode (variable) - with varint length encoding
|
|
136
|
+
Field 6: amount (8 bytes, little-endian) - UTXO value
|
|
137
|
+
Field 7: nSequence (4 bytes, little-endian)
|
|
138
|
+
Field 8: hashOutputs (32 bytes) - double SHA256 of all outputs
|
|
139
|
+
Field 9: nLockTime (4 bytes, little-endian)
|
|
140
|
+
Field 10: sighashType (4 bytes, little-endian)
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### nChain PUSHTX Techniques (WP1605)
|
|
144
|
+
- **In-script signature generation**: `s = z + Gx mod n`
|
|
145
|
+
- **Generator optimization**: k=a=1 for efficiency
|
|
146
|
+
- **DER canonicalization**: s ≤ n/2 prevents malleability
|
|
147
|
+
- **Message construction**: BIP143 preimage building
|
|
148
|
+
- **Security proof**: Computationally infeasible to forge
|
|
149
|
+
|
|
150
|
+
## 🔐 Security Considerations
|
|
151
|
+
|
|
152
|
+
### Critical Security Features
|
|
153
|
+
- **Parameter Fixing**: Public key, ephemeral key, sighash flag must be fixed
|
|
154
|
+
- **DER Canonicalization**: Prevents transaction malleability
|
|
155
|
+
- **Preimage Validation**: Complete BIP143 structure verification
|
|
156
|
+
- **Error Handling**: Comprehensive validation and reporting
|
|
157
|
+
|
|
158
|
+
### Production Guidelines
|
|
159
|
+
- Parameter validation before script creation
|
|
160
|
+
- Comprehensive error handling and fallbacks
|
|
161
|
+
- Security audit documentation for covenant logic
|
|
162
|
+
- Testing requirements for mainnet deployment
|
|
163
|
+
|
|
164
|
+
## 📈 Performance Optimization
|
|
165
|
+
|
|
166
|
+
### Script Optimization Techniques
|
|
167
|
+
- **Alt stack usage**: Store constants for reuse
|
|
168
|
+
- **Endianness optimization**: Minimize reversal operations
|
|
169
|
+
- **Preimage caching**: Avoid recomputation
|
|
170
|
+
- **k=a=1 optimization**: Simplifies PUSHTX signature generation
|
|
171
|
+
|
|
172
|
+
### Transaction Size Optimization
|
|
173
|
+
- Optimized PUSHTX scripts: ~1KB for PELS implementation
|
|
174
|
+
- CDN bundles: Multiple sizes for different use cases
|
|
175
|
+
- Fee optimization: 91% reduction with 0.01 sats/byte
|
|
176
|
+
|
|
177
|
+
## 🤝 Contributing to Documentation
|
|
178
|
+
|
|
179
|
+
To improve this documentation:
|
|
180
|
+
|
|
181
|
+
1. Follow the existing structure and formatting
|
|
182
|
+
2. Include working code examples with explanations
|
|
183
|
+
3. Add cross-references to related sections
|
|
184
|
+
4. Provide both simple and advanced examples
|
|
185
|
+
5. Include security considerations for all patterns
|
|
186
|
+
|
|
187
|
+
## 🔗 External Resources
|
|
188
|
+
|
|
189
|
+
### Official References
|
|
190
|
+
- **[Bitcoin SV Documentation](https://bitcoinsv.com/)**
|
|
191
|
+
- **[BIP143 Specification](https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki)**
|
|
192
|
+
- **[nChain Research Papers](https://nchain.com/research/)**
|
|
193
|
+
|
|
194
|
+
### Community Resources
|
|
195
|
+
- **[SmartLedger-BSV GitHub](https://github.com/codenlighten/smartledger-bsv)**
|
|
196
|
+
- **[NPM Package](https://www.npmjs.com/package/@smartledger/bsv)**
|
|
197
|
+
- **[Examples Repository](../examples/)**
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
*Documentation for SmartLedger-BSV v3.1.1+ - Built for enterprise Bitcoin SV development*
|
package/docs/block.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Bitcoin Block
|
|
2
|
+
A Block instance represents the information of a block in the bitcoin network. Given a hexadecimal string representation of the serialization of a block with its transactions, you can instantiate a Block instance. Methods are provided to calculate and check the merkle root hash (if enough data is provided), but transactions won't necessarily be valid spends, and this class won't validate them. A binary representation as a `Buffer` instance is also valid input for a Block's constructor.
|
|
3
|
+
|
|
4
|
+
```javascript
|
|
5
|
+
// instantiate a new block instance
|
|
6
|
+
var block = new Block(hexaEncodedBlock);
|
|
7
|
+
|
|
8
|
+
// will verify that the corresponding block transactions match the header
|
|
9
|
+
assert(block.validMerkleRoot());
|
|
10
|
+
|
|
11
|
+
// blocks have several properties
|
|
12
|
+
assert(block.header); // an instance of block header, more info below
|
|
13
|
+
assert(block.transactions); // an array of transactions, more info below
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
For detailed technical information about a block please visit [Blocks](https://en.bitcoin.it/wiki/Blocks#Block_structure) on the Bitcoin Wiki.
|
|
17
|
+
|
|
18
|
+
## Block Header
|
|
19
|
+
Each instance of Block has a BlockHeader _(which can be instantiated separately)_. The header has validation methods, to verify that the block.
|
|
20
|
+
|
|
21
|
+
```javascript
|
|
22
|
+
// will verify that the nonce demonstrates enough proof of work
|
|
23
|
+
assert(block.header.validProofOfWork());
|
|
24
|
+
|
|
25
|
+
// will verify that timestamp is not too far in the future
|
|
26
|
+
assert(block.header.validTimestamp());
|
|
27
|
+
|
|
28
|
+
// each header has the following properties
|
|
29
|
+
assert(block.header.version);
|
|
30
|
+
assert(block.header.prevHash);
|
|
31
|
+
assert(block.header.merkleRoot);
|
|
32
|
+
assert(block.header.time);
|
|
33
|
+
assert(block.header.bits);
|
|
34
|
+
assert(block.header.nonce);
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
For more information about the specific properties of a block header please visit the [Block hashing algorithm](https://en.bitcoin.it/wiki/Block_hashing_algorithm) page on the Bitcoin Wiki.
|
|
38
|
+
|
|
39
|
+
## Transactions
|
|
40
|
+
The set of transactions in a block is an array of instances of [Transaction](transaction.md) and can be explored by iterating on the block's `transactions` member.
|
|
41
|
+
|
|
42
|
+
```javascript
|
|
43
|
+
for (var i in block.transactions) {
|
|
44
|
+
var transaction = block.transactions[i];
|
|
45
|
+
}
|
|
46
|
+
```
|
package/docs/ecies.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# ECIES
|
|
2
|
+
`bsv/ecies` is a library that work with bsv's private/public keys.
|
|
3
|
+
|
|
4
|
+
It provide electrum compatible ECIES message by default.
|
|
5
|
+
|
|
6
|
+
## Options
|
|
7
|
+
The constructor accept several options
|
|
8
|
+
|
|
9
|
+
- `ephemeralKey`: should use ephemeral private key to encrypt message. `true` by default. It's set to `false` automatically if you provide private key later.
|
|
10
|
+
- `noKey`: should exclude encrypt public key in message. `false` by default, disabled if `ephemeralKey` is `true`. Typically, public key is included in message, so receiver need only his private key to decrypt. Receiver must use same option with sender, in order to decrypt message properly.
|
|
11
|
+
- `shortTag`: should use shorten HMAC in message. `false` by default. Receiver must use same option with sender, in order to decrypt message properly.
|
|
12
|
+
|
|
13
|
+
## Examples
|
|
14
|
+
|
|
15
|
+
### Message to Bob
|
|
16
|
+
|
|
17
|
+
```javascript
|
|
18
|
+
var bsv = require('bsv')
|
|
19
|
+
var IES = require('bsv/ecies')
|
|
20
|
+
|
|
21
|
+
var bob = bsv.PrivateKey()
|
|
22
|
+
var bobPubkey = bob.publicKey
|
|
23
|
+
|
|
24
|
+
// Send a message to bob
|
|
25
|
+
var enc = new IES().publicKey(bobPubkey).encrypt('a message')
|
|
26
|
+
// Bob decrypt a message
|
|
27
|
+
var dec = new IES().privateKey(bob).decrypt(enc)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Messages between Alice and Bob
|
|
31
|
+
|
|
32
|
+
~~~javascript
|
|
33
|
+
var bsv = require('bsv')
|
|
34
|
+
var IES = require('bsv/ecies')
|
|
35
|
+
|
|
36
|
+
var alice = bsv.PrivateKey()
|
|
37
|
+
var alicePubkey = alice.publicKey
|
|
38
|
+
var bob = bsv.PrivateKey()
|
|
39
|
+
var bobPubkey = bob.publicKey
|
|
40
|
+
|
|
41
|
+
var iesAlice = new IES({'nokey':true}).privateKey(alice).publicKey(bobPubkey)
|
|
42
|
+
|
|
43
|
+
var iesBob = new IES({'nokey':true}).privateKey(bob).publicKey(alicePubkey)
|
|
44
|
+
|
|
45
|
+
messageAlice = iesAlice.encrypt('Hello Bob')
|
|
46
|
+
messageAliceDec = iesBob.decrypt(messageAlice)
|
|
47
|
+
|
|
48
|
+
messageBob = iesBob.encrypt('Hi Alice')
|
|
49
|
+
messageBobDec = iesAlice.decrypt(messageBob)
|
|
50
|
+
~~~
|
|
51
|
+
|
|
52
|
+
### Recover messages
|
|
53
|
+
|
|
54
|
+
Sender can recover messages if `ephemeralKey` is `false`.
|
|
55
|
+
|
|
56
|
+
~~~javascript
|
|
57
|
+
var bsv = require('bsv')
|
|
58
|
+
var IES = require('bsv/ecies')
|
|
59
|
+
|
|
60
|
+
var alice = bsv.PrivateKey()
|
|
61
|
+
var alicePubkey = alice.publicKey
|
|
62
|
+
var bob = bsv.PrivateKey()
|
|
63
|
+
var bobPubkey = bob.publicKey
|
|
64
|
+
|
|
65
|
+
var iesAlice = new IES({'nokey':true}).privateKey(alice).publicKey(bobPubkey)
|
|
66
|
+
|
|
67
|
+
var iesBob = new IES({'nokey':true}).privateKey(bob).publicKey(alicePubkey)
|
|
68
|
+
|
|
69
|
+
messageAlice = iesAlice.encrypt('Hello Bob')
|
|
70
|
+
messageAliceRecover = iesAlice.decrypt(messageAlice)
|
|
71
|
+
~~~
|
|
72
|
+
|
|
73
|
+
### ECDH Key
|
|
74
|
+
|
|
75
|
+
Sometimes you may want to extract ECDH key for other use.
|
|
76
|
+
|
|
77
|
+
~~~javascript
|
|
78
|
+
var bsv = require('bsv')
|
|
79
|
+
var IES = require('bsv/ecies')
|
|
80
|
+
|
|
81
|
+
var alice = bsv.PrivateKey()
|
|
82
|
+
var alicePubkey = alice.publicKey
|
|
83
|
+
var bob = bsv.PrivateKey()
|
|
84
|
+
var bobPubkey = bob.publicKey
|
|
85
|
+
|
|
86
|
+
var iesAlice = new IES().privateKey(alice).publicKey(bobPubkey)
|
|
87
|
+
|
|
88
|
+
var iesBob = new IES().privateKey(bob).publicKey(alicePubkey)
|
|
89
|
+
|
|
90
|
+
var sharedSecret = iesAlice.ivkEkM
|
|
91
|
+
var sharedSecret = iesBob.ivkEkM
|
|
92
|
+
~~~
|
|
93
|
+
|
|
94
|
+
### Bitcore ECIES
|
|
95
|
+
|
|
96
|
+
Sometimes you may want to use bitcore sytle ECIES.
|
|
97
|
+
|
|
98
|
+
~~~javascript
|
|
99
|
+
var bsv = require('bsv')
|
|
100
|
+
var IES = require('bsv/ecies').bitcoreECIES
|
|
101
|
+
~~~
|
|
102
|
+
|