Cleanup book (#1904)

* Cleanup book

* Distinguish upstream from downstream validators
* Add BroadcastStage to Fullnode/Tpu diagrams
* First attempt to re-describe the runtime

* Reorg book

Push back details of the fullnode implementation
This commit is contained in:
Greg Fitzgerald 2018-11-25 16:58:38 -07:00 committed by GitHub
parent f5b5c54d7d
commit c3fb9d5549
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 483 additions and 359 deletions

View File

@ -1,21 +1,27 @@
.------------------------.
| Fullnode |
| |
.--------. | .----------------. |
| |---->| | |
| Client | | | JsonRpcService | |
| |<----| | |
`----+---` | `----------------` |
| | ^ |
| | | |
| | .--+---. .-----. |
| | | Bank |<--| Tvu | |
| | `------` `-----` |
| | ^ ^ |
| | | | | .------------.
| | .--+--. .--+--. | | |
`-------->| Tpu +-->| Ncp |<-------->| Validators |
| `-----` `-----` | | |
| | `------------`
`------------------------`
.---------------------------.
| Fullnode |
| |
.--------. | .----------------. |
| |---->| | |
| Client | | | JsonRpcService | |
| |<----| | |
`----+---` | `----------------` |
| | ^ | .------------------.
| | | .-----. | | Validators |
| | | | Ncp |<---------->| |
| | | `---+-` | | .------------. |
| | | ^ | | | | | |
| | | | v | | | Upstream | |
| | .--+---. .-+---. | | | Validators | |
| | | Bank |<--| Tvu |<--------------+ | |
| | `------` `-----` | | `------------` |
| | ^ | | |
| | | | | .------------. |
| | .--+--. .-----------. | | | | |
`-------->| Tpu +-->| Broadcast +--------->| Downstream | |
| `-----` | Stage | | | | Validators | |
| `-----------` | | | | |
| | | `------------` |
`---------------------------` | |
`------------------`

View File

@ -1,19 +1,19 @@
.----------------------------------------------------.
| Tpu .------------. |
| | PohService | |
| `-------+----` |
| ^ | |
| | v |
| .-------. .-----------. .-+-------. .-------. |
.---------. | | Fetch | | SigVerify | | Banking | | Write | | .------------.
| Clients |--->| Stage |->| Stage |->| Stage |-->| Stage +--->| Validators |
`---------` | | | | | | | | | | `------------`
| `-------` `-----------` `----+----` `---+---` |
| | | |
| | | |
| | | |
| | | |
`---------------------------------|------------|-----`
.------------------------------------------------------.
| Tpu .------------. |
| | PohService | |
| `-------+----` |
| ^ | |
| | v |
| .-------. .-----------. .-+-------. .--------. | .------------.
.---------. | | Fetch | | SigVerify | | Banking | | Ledger | | | Broadcast |
| Clients |--->| Stage |->| Stage |->| Stage |-->| Write +---->| Stage |
`---------` | | | | | | | | Stage | | | |
| `-------` `-----------` `----+----` `---+----` | `------------`
| | | |
| | | |
| | | |
| | | |
`---------------------------------|------------|-------`
| |
v v
.------. .--------.

View File

@ -1,18 +1,21 @@
.--------------------------------------------.
| |
| .------------------------------------|---------------------------------------.
| | Tvu | |
| | | |
v | .-------. .------------. .----+---------. .--------. .---------. |
.--------. | | Blob | | Retransmit | | Replicate | | Ledger | | Storage | |
| Leader |----->| Fetch |-->| Stage |-->| Stage |-->| Write |-->| Stage | |
`--------` | | Stage | | | | | | Stage | | | |
| `-------` `----+-------` `----+---------` `--------` `---------` |
| ^ | | |
| | | | |
`--------|----------|----------------|---------------------------------------`
| | |
| V v
.+-----------. .------.
| Validators | | Bank |
`------------` `------`
.--------.
| Leader |
`--------`
^
|
.------------------------------------|---------------------------------------.
| Tvu | |
| | |
| .-------. .------------. .----+---------. .--------. .---------. |
.------------. | | Blob | | Retransmit | | Replicate | | Ledger | | Storage | |
| Upstream +----->| Fetch |-->| Stage |-->| Stage |-->| Write |-->| Stage | |
| Validators | | | Stage | | | | | | Stage | | | |
`------------` | `-------` `----+-------` `----+---------` `--------` `---------` |
| ^ | | |
| | | | |
`--------|----------|----------------|---------------------------------------`
| | |
| V v
.+-----------. .------.
| Ncp | | Bank |
`------------` `------`

View File

@ -4,14 +4,7 @@
- [Terminology](terminology.md)
- [On-chain programs](programs.md)
- [The Runtime](runtime.md)
- [Fullnode](fullnode.md)
- [Tpu](tpu.md)
- [Tvu](tvu.md)
- [Ncp](ncp.md)
- [JsonRpcService](jsonrpc-service.md)
- [Programming Model](programs.md)
- [A Solana Cluster](cluster.md)
- [Synchronization](synchronization.md)
@ -21,6 +14,13 @@
- [Ledger Replication](storage.md)
- [Leader Rotation](leader-scheduler.md)
- [Anatomy of a Fullnode](fullnode.md)
- [Tpu](tpu.md)
- [Tvu](tvu.md)
- [Ncp](ncp.md)
- [JsonRpcService](jsonrpc-service.md)
- [The Runtime](runtime.md)
## Appendix
- [Appendix](appendix.md)

View File

@ -1,4 +1,4 @@
<svg class="bob" font-family="arial" font-size="14" height="336" width="456" xmlns="http://www.w3.org/2000/svg">
<svg class="bob" font-family="arial" font-size="14" height="432" width="528" xmlns="http://www.w3.org/2000/svg">
<defs>
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
@ -56,7 +56,7 @@
}
</style>
<rect fill="white" height="336" width="456" x="0" y="0"/>
<rect fill="white" height="432" width="528" x="0" y="0"/>
<g>
<line x1="12" x2="12" y1="60" y2="116"/>
<path d="M 12 116 A 4 4 0 0 0 16 120" fill="none"/>
@ -68,13 +68,13 @@
</g>
<g>
<line x1="16" x2="52" y1="120" y2="120"/>
<line x1="52" x2="52" y1="120" y2="260"/>
<line x1="52" x2="52" y1="120" y2="324"/>
<line x1="52" x2="80" y1="120" y2="120"/>
<path d="M 52 260 A 4 4 0 0 0 56 264" fill="none"/>
<path d="M 52 324 A 4 4 0 0 0 56 328" fill="none"/>
<path d="M 80 120 A 4 4 0 0 0 84 116" fill="none"/>
</g>
<g>
<line marker-end="url(#triangle)" x1="56" x2="124" y1="264" y2="264"/>
<line marker-end="url(#triangle)" x1="56" x2="124" y1="328" y2="328"/>
</g>
<g>
<line x1="84" x2="84" y1="60" y2="116"/>
@ -94,19 +94,19 @@
<line x1="108" x2="108" y1="80" y2="96"/>
</g>
<g>
<line x1="108" x2="108" y1="112" y2="256"/>
<line x1="108" x2="108" y1="112" y2="320"/>
</g>
<g>
<line x1="108" x2="108" y1="272" y2="308"/>
<path d="M 108 308 A 4 4 0 0 0 112 312" fill="none"/>
<line x1="108" x2="108" y1="336" y2="388"/>
<path d="M 108 388 A 4 4 0 0 0 112 392" fill="none"/>
</g>
<g>
<line x1="112" x2="304" y1="8" y2="8"/>
<path d="M 308 12 A 4 4 0 0 0 304 8" fill="none"/>
<line x1="112" x2="328" y1="8" y2="8"/>
<path d="M 332 12 A 4 4 0 0 0 328 8" fill="none"/>
</g>
<g>
<line x1="112" x2="304" y1="312" y2="312"/>
<path d="M 304 312 A 4 4 0 0 0 308 308" fill="none"/>
<line x1="112" x2="328" y1="392" y2="392"/>
<path d="M 328 392 A 4 4 0 0 0 332 388" fill="none"/>
</g>
<g>
<line x1="132" x2="132" y1="60" y2="116"/>
@ -114,14 +114,14 @@
<path d="M 136 56 A 4 4 0 0 0 132 60" fill="none"/>
</g>
<g>
<line x1="132" x2="132" y1="172" y2="196"/>
<path d="M 132 196 A 4 4 0 0 0 136 200" fill="none"/>
<path d="M 136 168 A 4 4 0 0 0 132 172" fill="none"/>
<line x1="132" x2="132" y1="236" y2="260"/>
<path d="M 132 260 A 4 4 0 0 0 136 264" fill="none"/>
<path d="M 136 232 A 4 4 0 0 0 132 236" fill="none"/>
</g>
<g>
<line x1="132" x2="132" y1="252" y2="276"/>
<path d="M 132 276 A 4 4 0 0 0 136 280" fill="none"/>
<path d="M 136 248 A 4 4 0 0 0 132 252" fill="none"/>
<line x1="132" x2="132" y1="316" y2="340"/>
<path d="M 132 340 A 4 4 0 0 0 136 344" fill="none"/>
<path d="M 136 312 A 4 4 0 0 0 132 316" fill="none"/>
</g>
<g>
<line x1="136" x2="264" y1="56" y2="56"/>
@ -132,108 +132,175 @@
<path d="M 264 120 A 4 4 0 0 0 268 116" fill="none"/>
</g>
<g>
<line x1="136" x2="156" y1="168" y2="168"/>
<line x1="156" x2="156" y1="144" y2="168"/>
<line x1="156" x2="184" y1="168" y2="168"/>
<path d="M 188 172 A 4 4 0 0 0 184 168" fill="none"/>
<line x1="136" x2="156" y1="232" y2="232"/>
<line x1="156" x2="156" y1="144" y2="232"/>
<line x1="156" x2="184" y1="232" y2="232"/>
<path d="M 188 236 A 4 4 0 0 0 184 232" fill="none"/>
</g>
<g>
<line x1="136" x2="184" y1="200" y2="200"/>
<path d="M 184 200 A 4 4 0 0 0 188 196" fill="none"/>
<line x1="136" x2="184" y1="264" y2="264"/>
<path d="M 184 264 A 4 4 0 0 0 188 260" fill="none"/>
</g>
<g>
<line x1="136" x2="156" y1="248" y2="248"/>
<line x1="156" x2="156" y1="224" y2="248"/>
<line x1="156" x2="176" y1="248" y2="248"/>
<path d="M 180 252 A 4 4 0 0 0 176 248" fill="none"/>
<line x1="136" x2="156" y1="312" y2="312"/>
<line x1="156" x2="156" y1="288" y2="312"/>
<line x1="156" x2="176" y1="312" y2="312"/>
<path d="M 180 316 A 4 4 0 0 0 176 312" fill="none"/>
</g>
<g>
<line x1="136" x2="176" y1="280" y2="280"/>
<path d="M 176 280 A 4 4 0 0 0 180 276" fill="none"/>
<line x1="136" x2="176" y1="344" y2="344"/>
<path d="M 176 344 A 4 4 0 0 0 180 340" fill="none"/>
</g>
<g>
<line marker-end="url(#triangle)" x1="156" x2="156" y1="144" y2="132"/>
</g>
<g>
<line marker-end="url(#triangle)" x1="156" x2="156" y1="224" y2="212"/>
<line marker-end="url(#triangle)" x1="156" x2="156" y1="288" y2="276"/>
</g>
<g>
<line x1="180" x2="180" y1="252" y2="264"/>
<line x1="180" x2="180" y1="264" y2="276"/>
<line marker-end="url(#triangle)" x1="180" x2="204" y1="264" y2="264"/>
<line x1="180" x2="180" y1="316" y2="328"/>
<line x1="180" x2="180" y1="328" y2="340"/>
<line marker-end="url(#triangle)" x1="180" x2="204" y1="328" y2="328"/>
</g>
<g>
<line x1="188" x2="188" y1="172" y2="196"/>
<line x1="188" x2="188" y1="236" y2="260"/>
</g>
<g>
<line marker-end="url(#triangle)" x1="200" x2="196" y1="184" y2="184"/>
<line x1="200" x2="220" y1="184" y2="184"/>
<line marker-end="url(#triangle)" x1="200" x2="196" y1="248" y2="248"/>
<line x1="200" x2="220" y1="248" y2="248"/>
</g>
<g>
<line x1="212" x2="212" y1="252" y2="276"/>
<path d="M 212 276 A 4 4 0 0 0 216 280" fill="none"/>
<path d="M 216 248 A 4 4 0 0 0 212 252" fill="none"/>
<line x1="212" x2="212" y1="316" y2="356"/>
<path d="M 212 356 A 4 4 0 0 0 216 360" fill="none"/>
<path d="M 216 312 A 4 4 0 0 0 212 316" fill="none"/>
</g>
<g>
<line x1="216" x2="236" y1="248" y2="248"/>
<line x1="236" x2="236" y1="224" y2="248"/>
<line x1="236" x2="256" y1="248" y2="248"/>
<path d="M 260 252 A 4 4 0 0 0 256 248" fill="none"/>
<line x1="216" x2="304" y1="312" y2="312"/>
<path d="M 308 316 A 4 4 0 0 0 304 312" fill="none"/>
</g>
<g>
<line x1="216" x2="256" y1="280" y2="280"/>
<path d="M 256 280 A 4 4 0 0 0 260 276" fill="none"/>
<line x1="216" x2="304" y1="360" y2="360"/>
<path d="M 304 360 A 4 4 0 0 0 308 356" fill="none"/>
</g>
<g>
<line x1="220" x2="220" y1="172" y2="196"/>
<path d="M 220 196 A 4 4 0 0 0 224 200" fill="none"/>
<path d="M 224 168 A 4 4 0 0 0 220 172" fill="none"/>
<line x1="220" x2="220" y1="156" y2="180"/>
<path d="M 220 180 A 4 4 0 0 0 224 184" fill="none"/>
<path d="M 224 152 A 4 4 0 0 0 220 156" fill="none"/>
</g>
<g>
<line x1="224" x2="264" y1="168" y2="168"/>
<path d="M 268 172 A 4 4 0 0 0 264 168" fill="none"/>
<line x1="220" x2="220" y1="236" y2="260"/>
<path d="M 220 260 A 4 4 0 0 0 224 264" fill="none"/>
<path d="M 224 232 A 4 4 0 0 0 220 236" fill="none"/>
</g>
<g>
<line x1="224" x2="264" y1="200" y2="200"/>
<path d="M 264 200 A 4 4 0 0 0 268 196" fill="none"/>
<line x1="224" x2="264" y1="152" y2="152"/>
<path d="M 268 156 A 4 4 0 0 0 264 152" fill="none"/>
</g>
<g>
<line marker-end="url(#triangle)" x1="236" x2="236" y1="224" y2="212"/>
<line x1="224" x2="252" y1="184" y2="184"/>
<line marker-end="url(#triangle)" x1="252" x2="252" y1="184" y2="220"/>
<line x1="252" x2="264" y1="184" y2="184"/>
<path d="M 264 184 A 4 4 0 0 0 268 180" fill="none"/>
</g>
<g>
<line x1="260" x2="260" y1="252" y2="276"/>
<line x1="224" x2="236" y1="232" y2="232"/>
<line x1="236" x2="236" y1="208" y2="232"/>
<line x1="236" x2="264" y1="232" y2="232"/>
<path d="M 268 236 A 4 4 0 0 0 264 232" fill="none"/>
</g>
<g>
<line x1="224" x2="264" y1="264" y2="264"/>
<path d="M 264 264 A 4 4 0 0 0 268 260" fill="none"/>
</g>
<g>
<line marker-end="url(#triangle)" x1="236" x2="236" y1="208" y2="196"/>
</g>
<g>
<line x1="268" x2="268" y1="60" y2="116"/>
</g>
<g>
<line x1="268" x2="268" y1="172" y2="196"/>
<line x1="268" x2="268" y1="156" y2="180"/>
</g>
<g>
<line marker-end="url(#triangle)" x1="272" x2="268" y1="264" y2="264"/>
<line marker-end="url(#triangle)" x1="272" x2="340" y1="264" y2="264"/>
<line x1="268" x2="268" y1="236" y2="260"/>
</g>
<g>
<line x1="308" x2="308" y1="12" y2="256"/>
<line marker-end="url(#triangle)" x1="280" x2="276" y1="168" y2="168"/>
<line marker-end="url(#triangle)" x1="280" x2="364" y1="168" y2="168"/>
</g>
<g>
<line x1="308" x2="308" y1="272" y2="308"/>
<line marker-end="url(#triangle)" x1="280" x2="276" y1="248" y2="248"/>
<line x1="280" x2="396" y1="248" y2="248"/>
<line x1="396" x2="396" y1="188" y2="248"/>
<line x1="396" x2="396" y1="248" y2="260"/>
<path d="M 396 260 A 4 4 0 0 0 400 264" fill="none"/>
<path d="M 400 184 A 4 4 0 0 0 396 188" fill="none"/>
</g>
<g>
<line x1="348" x2="348" y1="236" y2="292"/>
<path d="M 348 292 A 4 4 0 0 0 352 296" fill="none"/>
<path d="M 352 232 A 4 4 0 0 0 348 236" fill="none"/>
<line x1="308" x2="308" y1="316" y2="328"/>
<line x1="308" x2="308" y1="328" y2="356"/>
<line marker-end="url(#triangle)" x1="308" x2="388" y1="328" y2="328"/>
</g>
<g>
<line x1="352" x2="448" y1="232" y2="232"/>
<path d="M 452 236 A 4 4 0 0 0 448 232" fill="none"/>
<line x1="332" x2="332" y1="12" y2="160"/>
</g>
<g>
<line x1="352" x2="448" y1="296" y2="296"/>
<path d="M 448 296 A 4 4 0 0 0 452 292" fill="none"/>
<line x1="332" x2="332" y1="176" y2="240"/>
</g>
<g>
<line x1="452" x2="452" y1="236" y2="292"/>
<line x1="332" x2="332" y1="256" y2="320"/>
</g>
<g>
<line x1="332" x2="332" y1="336" y2="388"/>
</g>
<g>
<line x1="372" x2="372" y1="140" y2="240"/>
<path d="M 376 136 A 4 4 0 0 0 372 140" fill="none"/>
</g>
<g>
<line x1="372" x2="372" y1="256" y2="320"/>
</g>
<g>
<line x1="372" x2="372" y1="336" y2="404"/>
<path d="M 372 404 A 4 4 0 0 0 376 408" fill="none"/>
</g>
<g>
<line x1="376" x2="520" y1="136" y2="136"/>
<path d="M 524 140 A 4 4 0 0 0 520 136" fill="none"/>
</g>
<g>
<line x1="376" x2="520" y1="408" y2="408"/>
<path d="M 520 408 A 4 4 0 0 0 524 404" fill="none"/>
</g>
<g>
<line x1="396" x2="396" y1="300" y2="372"/>
<path d="M 396 372 A 4 4 0 0 0 400 376" fill="none"/>
<path d="M 400 296 A 4 4 0 0 0 396 300" fill="none"/>
</g>
<g>
<line x1="400" x2="496" y1="184" y2="184"/>
<path d="M 500 188 A 4 4 0 0 0 496 184" fill="none"/>
</g>
<g>
<line x1="400" x2="496" y1="264" y2="264"/>
<path d="M 496 264 A 4 4 0 0 0 500 260" fill="none"/>
</g>
<g>
<line x1="400" x2="496" y1="296" y2="296"/>
<path d="M 500 300 A 4 4 0 0 0 496 296" fill="none"/>
</g>
<g>
<line x1="400" x2="496" y1="376" y2="376"/>
<path d="M 496 376 A 4 4 0 0 0 500 372" fill="none"/>
</g>
<g>
<line x1="500" x2="500" y1="188" y2="260"/>
</g>
<g>
<line x1="500" x2="500" y1="300" y2="372"/>
</g>
<g>
<line x1="524" x2="524" y1="140" y2="404"/>
</g>
<g>
<text x="25" y="92">
@ -251,27 +318,57 @@ JsonRpcService
</text>
</g>
<g>
<text x="145" y="188">
<text x="145" y="252">
Bank
</text>
</g>
<g>
<text x="145" y="268">
<text x="145" y="332">
Tpu
</text>
</g>
<g>
<text x="225" y="268">
<text x="225" y="332">
Broadcast
</text>
</g>
<g>
<text x="225" y="348">
Stage
</text>
</g>
<g>
<text x="233" y="172">
Ncp
</text>
</g>
<g>
<text x="233" y="188">
<text x="233" y="252">
Tvu
</text>
</g>
<g>
<text x="361" y="268">
<text x="385" y="156">
Validators
</text>
</g>
<g>
<text x="409" y="220">
Upstream
</text>
</g>
<g>
<text x="409" y="236">
Validators
</text>
</g>
<g>
<text x="409" y="332">
Downstream
</text>
</g>
<g>
<text x="409" y="348">
Validators
</text>
</g>

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

@ -1,4 +1,4 @@
<svg class="bob" font-family="arial" font-size="14" height="336" width="664" xmlns="http://www.w3.org/2000/svg">
<svg class="bob" font-family="arial" font-size="14" height="336" width="680" xmlns="http://www.w3.org/2000/svg">
<defs>
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
@ -56,7 +56,7 @@
}
</style>
<rect fill="white" height="336" width="664" x="0" y="0"/>
<rect fill="white" height="336" width="680" x="0" y="0"/>
<g>
<line x1="12" x2="12" y1="124" y2="148"/>
<path d="M 12 148 A 4 4 0 0 0 16 152" fill="none"/>
@ -85,14 +85,14 @@
<path d="M 108 244 A 4 4 0 0 0 112 248" fill="none"/>
</g>
<g>
<line x1="112" x2="528" y1="8" y2="8"/>
<path d="M 532 12 A 4 4 0 0 0 528 8" fill="none"/>
<line x1="112" x2="544" y1="8" y2="8"/>
<path d="M 548 12 A 4 4 0 0 0 544 8" fill="none"/>
</g>
<g>
<line x1="112" x2="380" y1="248" y2="248"/>
<line x1="380" x2="484" y1="248" y2="248"/>
<line x1="484" x2="528" y1="248" y2="248"/>
<path d="M 528 248 A 4 4 0 0 0 532 244" fill="none"/>
<line x1="484" x2="544" y1="248" y2="248"/>
<path d="M 544 248 A 4 4 0 0 0 548 244" fill="none"/>
</g>
<g>
<line x1="132" x2="132" y1="108" y2="164"/>
@ -203,14 +203,14 @@
<path d="M 456 296 A 4 4 0 0 0 452 300" fill="none"/>
</g>
<g>
<line x1="456" x2="512" y1="104" y2="104"/>
<path d="M 516 108 A 4 4 0 0 0 512 104" fill="none"/>
<line x1="456" x2="520" y1="104" y2="104"/>
<path d="M 524 108 A 4 4 0 0 0 520 104" fill="none"/>
</g>
<g>
<line x1="456" x2="484" y1="168" y2="168"/>
<line marker-end="url(#triangle)" x1="484" x2="484" y1="168" y2="284"/>
<line x1="484" x2="512" y1="168" y2="168"/>
<path d="M 512 168 A 4 4 0 0 0 516 164" fill="none"/>
<line x1="484" x2="520" y1="168" y2="168"/>
<path d="M 520 168 A 4 4 0 0 0 524 164" fill="none"/>
</g>
<g>
<line x1="456" x2="520" y1="296" y2="296"/>
@ -221,34 +221,34 @@
<path d="M 520 328 A 4 4 0 0 0 524 324" fill="none"/>
</g>
<g>
<line x1="516" x2="516" y1="108" y2="136"/>
<line x1="516" x2="516" y1="136" y2="164"/>
<line marker-end="url(#triangle)" x1="516" x2="548" y1="136" y2="136"/>
<line x1="524" x2="524" y1="108" y2="136"/>
<line x1="524" x2="524" y1="136" y2="164"/>
<line marker-end="url(#triangle)" x1="524" x2="564" y1="136" y2="136"/>
</g>
<g>
<line x1="524" x2="524" y1="300" y2="324"/>
</g>
<g>
<line x1="532" x2="532" y1="12" y2="128"/>
<line x1="548" x2="548" y1="12" y2="128"/>
</g>
<g>
<line x1="532" x2="532" y1="144" y2="244"/>
<line x1="548" x2="548" y1="144" y2="244"/>
</g>
<g>
<line x1="556" x2="556" y1="124" y2="148"/>
<path d="M 556 148 A 4 4 0 0 0 560 152" fill="none"/>
<path d="M 560 120 A 4 4 0 0 0 556 124" fill="none"/>
<line x1="572" x2="572" y1="108" y2="164"/>
<path d="M 572 164 A 4 4 0 0 0 576 168" fill="none"/>
<path d="M 576 104 A 4 4 0 0 0 572 108" fill="none"/>
</g>
<g>
<line x1="560" x2="656" y1="120" y2="120"/>
<path d="M 660 124 A 4 4 0 0 0 656 120" fill="none"/>
<line x1="576" x2="672" y1="104" y2="104"/>
<path d="M 676 108 A 4 4 0 0 0 672 104" fill="none"/>
</g>
<g>
<line x1="560" x2="656" y1="152" y2="152"/>
<path d="M 656 152 A 4 4 0 0 0 660 148" fill="none"/>
<line x1="576" x2="672" y1="168" y2="168"/>
<path d="M 672 168 A 4 4 0 0 0 676 164" fill="none"/>
</g>
<g>
<line x1="660" x2="660" y1="124" y2="148"/>
<line x1="676" x2="676" y1="108" y2="164"/>
</g>
<g>
<text x="25" y="140">
@ -276,7 +276,7 @@ SigVerify
</text>
</g>
<g>
<text x="249" y="140">
<text x="233" y="140">
Stage
</text>
</g>
@ -291,7 +291,7 @@ Banking
</text>
</g>
<g>
<text x="361" y="140">
<text x="353" y="140">
Stage
</text>
</g>
@ -302,11 +302,16 @@ Bank
</g>
<g>
<text x="465" y="124">
Write
Ledger
</text>
</g>
<g>
<text x="465" y="140">
Write
</text>
</g>
<g>
<text x="465" y="156">
Stage
</text>
</g>
@ -316,8 +321,13 @@ Ledger
</text>
</g>
<g>
<text x="569" y="140">
Validators
<text x="585" y="124">
Broadcast
</text>
</g>
<g>
<text x="585" y="140">
Stage
</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@ -1,4 +1,4 @@
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
<svg class="bob" font-family="arial" font-size="14" height="336" width="768" xmlns="http://www.w3.org/2000/svg">
<defs>
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
@ -56,267 +56,287 @@
}
</style>
<rect fill="white" height="288" width="736" x="0" y="0"/>
<rect fill="white" height="336" width="768" x="0" y="0"/>
<g>
<line x1="12" x2="12" y1="108" y2="132"/>
<path d="M 12 132 A 4 4 0 0 0 16 136" fill="none"/>
<path d="M 16 104 A 4 4 0 0 0 12 108" fill="none"/>
<line x1="12" x2="12" y1="156" y2="196"/>
<path d="M 12 196 A 4 4 0 0 0 16 200" fill="none"/>
<path d="M 16 152 A 4 4 0 0 0 12 156" fill="none"/>
</g>
<g>
<line x1="16" x2="80" y1="104" y2="104"/>
<path d="M 84 108 A 4 4 0 0 0 80 104" fill="none"/>
<line x1="16" x2="112" y1="152" y2="152"/>
<path d="M 116 156 A 4 4 0 0 0 112 152" fill="none"/>
</g>
<g>
<line x1="16" x2="80" y1="136" y2="136"/>
<path d="M 80 136 A 4 4 0 0 0 84 132" fill="none"/>
<line x1="16" x2="112" y1="200" y2="200"/>
<path d="M 112 200 A 4 4 0 0 0 116 196" fill="none"/>
</g>
<g>
<line marker-end="url(#triangle)" x1="52" x2="52" y1="12" y2="92"/>
<path d="M 56 8 A 4 4 0 0 0 52 12" fill="none"/>
<line x1="116" x2="116" y1="156" y2="168"/>
<line x1="116" x2="116" y1="168" y2="196"/>
<line marker-end="url(#triangle)" x1="116" x2="164" y1="168" y2="168"/>
</g>
<g>
<line x1="56" x2="408" y1="8" y2="8"/>
<path d="M 412 12 A 4 4 0 0 0 408 8" fill="none"/>
<line x1="148" x2="148" y1="92" y2="160"/>
<path d="M 152 88 A 4 4 0 0 0 148 92" fill="none"/>
</g>
<g>
<line x1="84" x2="84" y1="108" y2="132"/>
<line x1="148" x2="148" y1="176" y2="244"/>
<path d="M 148 244 A 4 4 0 0 0 152 248" fill="none"/>
</g>
<g>
<line marker-end="url(#triangle)" x1="84" x2="132" y1="120" y2="120"/>
<line x1="152" x2="444" y1="88" y2="88"/>
<line x1="444" x2="760" y1="88" y2="88"/>
<path d="M 764 92 A 4 4 0 0 0 760 88" fill="none"/>
</g>
<g>
<line x1="116" x2="116" y1="44" y2="112"/>
<path d="M 120 40 A 4 4 0 0 0 116 44" fill="none"/>
<line x1="152" x2="220" y1="248" y2="248"/>
<line x1="220" x2="308" y1="248" y2="248"/>
<line x1="308" x2="444" y1="248" y2="248"/>
<line x1="444" x2="760" y1="248" y2="248"/>
<path d="M 760 248 A 4 4 0 0 0 764 244" fill="none"/>
</g>
<g>
<line x1="116" x2="116" y1="128" y2="196"/>
<path d="M 116 196 A 4 4 0 0 0 120 200" fill="none"/>
<line x1="172" x2="172" y1="140" y2="196"/>
<path d="M 172 196 A 4 4 0 0 0 176 200" fill="none"/>
<path d="M 176 136 A 4 4 0 0 0 172 140" fill="none"/>
</g>
<g>
<line x1="120" x2="412" y1="40" y2="40"/>
<line x1="412" x2="728" y1="40" y2="40"/>
<path d="M 732 44 A 4 4 0 0 0 728 40" fill="none"/>
<line x1="176" x2="232" y1="136" y2="136"/>
<path d="M 236 140 A 4 4 0 0 0 232 136" fill="none"/>
</g>
<g>
<line x1="120" x2="188" y1="200" y2="200"/>
<line x1="188" x2="276" y1="200" y2="200"/>
<line x1="276" x2="412" y1="200" y2="200"/>
<line x1="412" x2="728" y1="200" y2="200"/>
<path d="M 728 200 A 4 4 0 0 0 732 196" fill="none"/>
<line x1="176" x2="232" y1="200" y2="200"/>
<path d="M 232 200 A 4 4 0 0 0 236 196" fill="none"/>
</g>
<g>
<line x1="140" x2="140" y1="92" y2="148"/>
<path d="M 140 148 A 4 4 0 0 0 144 152" fill="none"/>
<path d="M 144 88 A 4 4 0 0 0 140 92" fill="none"/>
<line x1="212" x2="212" y1="300" y2="324"/>
<path d="M 212 324 A 4 4 0 0 0 216 328" fill="none"/>
<path d="M 216 296 A 4 4 0 0 0 212 300" fill="none"/>
</g>
<g>
<line x1="144" x2="200" y1="88" y2="88"/>
<path d="M 204 92 A 4 4 0 0 0 200 88" fill="none"/>
<line x1="216" x2="312" y1="328" y2="328"/>
<path d="M 312 328 A 4 4 0 0 0 316 324" fill="none"/>
</g>
<g>
<line x1="144" x2="200" y1="152" y2="152"/>
<path d="M 200 152 A 4 4 0 0 0 204 148" fill="none"/>
<line marker-end="url(#triangle)" x1="220" x2="220" y1="224" y2="212"/>
<line x1="220" x2="220" y1="224" y2="296"/>
<line x1="220" x2="216" y1="296" y2="296"/>
<line x1="220" x2="312" y1="296" y2="296"/>
<path d="M 316 300 A 4 4 0 0 0 312 296" fill="none"/>
</g>
<g>
<line x1="180" x2="180" y1="252" y2="276"/>
<path d="M 180 276 A 4 4 0 0 0 184 280" fill="none"/>
<path d="M 184 248 A 4 4 0 0 0 180 252" fill="none"/>
<line x1="236" x2="236" y1="140" y2="196"/>
</g>
<g>
<line x1="184" x2="280" y1="280" y2="280"/>
<path d="M 280 280 A 4 4 0 0 0 284 276" fill="none"/>
<line marker-end="url(#triangle)" x1="236" x2="260" y1="168" y2="168"/>
</g>
<g>
<line marker-end="url(#triangle)" x1="188" x2="188" y1="176" y2="164"/>
<line x1="188" x2="188" y1="176" y2="248"/>
<line x1="188" x2="184" y1="248" y2="248"/>
<line x1="188" x2="280" y1="248" y2="248"/>
<path d="M 284 252 A 4 4 0 0 0 280 248" fill="none"/>
<line x1="268" x2="268" y1="140" y2="196"/>
<path d="M 268 196 A 4 4 0 0 0 272 200" fill="none"/>
<path d="M 272 136 A 4 4 0 0 0 268 140" fill="none"/>
</g>
<g>
<line x1="204" x2="204" y1="92" y2="148"/>
<line x1="272" x2="368" y1="136" y2="136"/>
<path d="M 372 140 A 4 4 0 0 0 368 136" fill="none"/>
</g>
<g>
<line marker-end="url(#triangle)" x1="204" x2="228" y1="120" y2="120"/>
<line x1="272" x2="308" y1="200" y2="200"/>
<line marker-end="url(#triangle)" x1="308" x2="308" y1="200" y2="284"/>
<line x1="308" x2="368" y1="200" y2="200"/>
<path d="M 368 200 A 4 4 0 0 0 372 196" fill="none"/>
</g>
<g>
<line x1="236" x2="236" y1="92" y2="148"/>
<path d="M 236 148 A 4 4 0 0 0 240 152" fill="none"/>
<path d="M 240 88 A 4 4 0 0 0 236 92" fill="none"/>
<line x1="316" x2="316" y1="300" y2="324"/>
</g>
<g>
<line x1="240" x2="336" y1="88" y2="88"/>
<path d="M 340 92 A 4 4 0 0 0 336 88" fill="none"/>
<line x1="372" x2="372" y1="140" y2="196"/>
</g>
<g>
<line x1="240" x2="276" y1="152" y2="152"/>
<line marker-end="url(#triangle)" x1="276" x2="276" y1="152" y2="236"/>
<line x1="276" x2="336" y1="152" y2="152"/>
<path d="M 336 152 A 4 4 0 0 0 340 148" fill="none"/>
<line marker-end="url(#triangle)" x1="372" x2="396" y1="168" y2="168"/>
</g>
<g>
<line x1="284" x2="284" y1="252" y2="276"/>
<line x1="404" x2="404" y1="12" y2="36"/>
<path d="M 404 36 A 4 4 0 0 0 408 40" fill="none"/>
<path d="M 408 8 A 4 4 0 0 0 404 12" fill="none"/>
</g>
<g>
<line x1="340" x2="340" y1="92" y2="148"/>
<line x1="404" x2="404" y1="140" y2="196"/>
<path d="M 404 196 A 4 4 0 0 0 408 200" fill="none"/>
<path d="M 408 136 A 4 4 0 0 0 404 140" fill="none"/>
</g>
<g>
<line marker-end="url(#triangle)" x1="340" x2="364" y1="120" y2="120"/>
<line x1="408" x2="472" y1="8" y2="8"/>
<path d="M 476 12 A 4 4 0 0 0 472 8" fill="none"/>
</g>
<g>
<line x1="372" x2="372" y1="92" y2="148"/>
<path d="M 372 148 A 4 4 0 0 0 376 152" fill="none"/>
<path d="M 376 88 A 4 4 0 0 0 372 92" fill="none"/>
<line x1="408" x2="472" y1="40" y2="40"/>
<path d="M 472 40 A 4 4 0 0 0 476 36" fill="none"/>
</g>
<g>
<line x1="376" x2="412" y1="88" y2="88"/>
<line x1="412" x2="412" y1="12" y2="88"/>
<line x1="412" x2="488" y1="88" y2="88"/>
<path d="M 492 92 A 4 4 0 0 0 488 88" fill="none"/>
<line x1="408" x2="444" y1="136" y2="136"/>
<line x1="444" x2="444" y1="64" y2="136"/>
<line x1="444" x2="520" y1="136" y2="136"/>
<path d="M 524 140 A 4 4 0 0 0 520 136" fill="none"/>
</g>
<g>
<line x1="376" x2="412" y1="152" y2="152"/>
<line marker-end="url(#triangle)" x1="412" x2="412" y1="152" y2="236"/>
<line x1="412" x2="488" y1="152" y2="152"/>
<path d="M 488 152 A 4 4 0 0 0 492 148" fill="none"/>
<line x1="408" x2="444" y1="200" y2="200"/>
<line marker-end="url(#triangle)" x1="444" x2="444" y1="200" y2="284"/>
<line x1="444" x2="520" y1="200" y2="200"/>
<path d="M 520 200 A 4 4 0 0 0 524 196" fill="none"/>
</g>
<g>
<line x1="388" x2="388" y1="252" y2="276"/>
<path d="M 388 276 A 4 4 0 0 0 392 280" fill="none"/>
<path d="M 392 248 A 4 4 0 0 0 388 252" fill="none"/>
<line x1="420" x2="420" y1="300" y2="324"/>
<path d="M 420 324 A 4 4 0 0 0 424 328" fill="none"/>
<path d="M 424 296 A 4 4 0 0 0 420 300" fill="none"/>
</g>
<g>
<line x1="392" x2="440" y1="248" y2="248"/>
<path d="M 444 252 A 4 4 0 0 0 440 248" fill="none"/>
<line x1="424" x2="472" y1="296" y2="296"/>
<path d="M 476 300 A 4 4 0 0 0 472 296" fill="none"/>
</g>
<g>
<line x1="392" x2="440" y1="280" y2="280"/>
<path d="M 440 280 A 4 4 0 0 0 444 276" fill="none"/>
<line x1="424" x2="472" y1="328" y2="328"/>
<path d="M 472 328 A 4 4 0 0 0 476 324" fill="none"/>
</g>
<g>
<line x1="444" x2="444" y1="252" y2="276"/>
<line marker-end="url(#triangle)" x1="444" x2="444" y1="64" y2="52"/>
</g>
<g>
<line x1="492" x2="492" y1="92" y2="148"/>
<line x1="476" x2="476" y1="12" y2="36"/>
</g>
<g>
<line marker-end="url(#triangle)" x1="492" x2="516" y1="120" y2="120"/>
<line x1="476" x2="476" y1="300" y2="324"/>
</g>
<g>
<line x1="524" x2="524" y1="92" y2="148"/>
<path d="M 524 148 A 4 4 0 0 0 528 152" fill="none"/>
<path d="M 528 88 A 4 4 0 0 0 524 92" fill="none"/>
<line x1="524" x2="524" y1="140" y2="196"/>
</g>
<g>
<line x1="528" x2="592" y1="88" y2="88"/>
<path d="M 596 92 A 4 4 0 0 0 592 88" fill="none"/>
<line marker-end="url(#triangle)" x1="524" x2="548" y1="168" y2="168"/>
</g>
<g>
<line x1="528" x2="592" y1="152" y2="152"/>
<path d="M 592 152 A 4 4 0 0 0 596 148" fill="none"/>
<line x1="556" x2="556" y1="140" y2="196"/>
<path d="M 556 196 A 4 4 0 0 0 560 200" fill="none"/>
<path d="M 560 136 A 4 4 0 0 0 556 140" fill="none"/>
</g>
<g>
<line x1="596" x2="596" y1="92" y2="148"/>
<line x1="560" x2="624" y1="136" y2="136"/>
<path d="M 628 140 A 4 4 0 0 0 624 136" fill="none"/>
</g>
<g>
<line marker-end="url(#triangle)" x1="596" x2="620" y1="120" y2="120"/>
<line x1="560" x2="624" y1="200" y2="200"/>
<path d="M 624 200 A 4 4 0 0 0 628 196" fill="none"/>
</g>
<g>
<line x1="628" x2="628" y1="92" y2="148"/>
<path d="M 628 148 A 4 4 0 0 0 632 152" fill="none"/>
<path d="M 632 88 A 4 4 0 0 0 628 92" fill="none"/>
<line x1="628" x2="628" y1="140" y2="196"/>
</g>
<g>
<line x1="632" x2="704" y1="88" y2="88"/>
<path d="M 708 92 A 4 4 0 0 0 704 88" fill="none"/>
<line marker-end="url(#triangle)" x1="628" x2="652" y1="168" y2="168"/>
</g>
<g>
<line x1="632" x2="704" y1="152" y2="152"/>
<path d="M 704 152 A 4 4 0 0 0 708 148" fill="none"/>
<line x1="660" x2="660" y1="140" y2="196"/>
<path d="M 660 196 A 4 4 0 0 0 664 200" fill="none"/>
<path d="M 664 136 A 4 4 0 0 0 660 140" fill="none"/>
</g>
<g>
<line x1="708" x2="708" y1="92" y2="148"/>
<line x1="664" x2="736" y1="136" y2="136"/>
<path d="M 740 140 A 4 4 0 0 0 736 136" fill="none"/>
</g>
<g>
<line x1="732" x2="732" y1="44" y2="196"/>
<line x1="664" x2="736" y1="200" y2="200"/>
<path d="M 736 200 A 4 4 0 0 0 740 196" fill="none"/>
</g>
<g>
<text x="25" y="124">
Leader
<line x1="740" x2="740" y1="140" y2="196"/>
</g>
<g>
<line x1="764" x2="764" y1="92" y2="244"/>
</g>
<g>
<text x="25" y="172">
Upstream
</text>
</g>
<g>
<text x="137" y="60">
Tvu
</text>
</g>
<g>
<text x="153" y="108">
Blob
</text>
</g>
<g>
<text x="153" y="124">
Fetch
</text>
</g>
<g>
<text x="153" y="140">
Stage
</text>
</g>
<g>
<text x="193" y="268">
<text x="25" y="188">
Validators
</text>
</g>
<g>
<text x="249" y="108">
<text x="169" y="108">
Tvu
</text>
</g>
<g>
<text x="185" y="156">
Blob
</text>
</g>
<g>
<text x="185" y="172">
Fetch
</text>
</g>
<g>
<text x="185" y="188">
Stage
</text>
</g>
<g>
<text x="249" y="316">
Ncp
</text>
</g>
<g>
<text x="281" y="156">
Retransmit
</text>
</g>
<g>
<text x="265" y="124">
<text x="281" y="172">
Stage
</text>
</g>
<g>
<text x="385" y="108">
<text x="417" y="28">
Leader
</text>
</g>
<g>
<text x="417" y="156">
Replicate
</text>
</g>
<g>
<text x="401" y="124">
<text x="417" y="172">
Stage
</text>
</g>
<g>
<text x="401" y="268">
<text x="433" y="316">
Bank
</text>
</g>
<g>
<text x="537" y="108">
<text x="569" y="156">
Ledger
</text>
</g>
<g>
<text x="537" y="124">
<text x="569" y="172">
Write
</text>
</g>
<g>
<text x="537" y="140">
<text x="569" y="188">
Stage
</text>
</g>
<g>
<text x="641" y="108">
<text x="673" y="156">
Storage
</text>
</g>
<g>
<text x="649" y="124">
<text x="673" y="172">
Stage
</text>
</g>

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@ -1,3 +1,3 @@
# Ncp
# The Network Control Plane
The Network Control Plane implements a gossip network between all nodes on in the cluster.
The Network Control Plane (Ncp) implements a gossip network between all nodes on in the cluster.

View File

@ -1,6 +1,4 @@
# The Solana SDK
## Introduction
# Programming Model
With the Solana runtime, we can execute on-chain programs concurrently, and
written in the clients choice of programming language.
@ -21,14 +19,14 @@ ELF and passes it the client's message for interpretation.
Solana supports several kinds of persistent storage, called *accounts*:
1. Executable
2. Writable by a client
3. Writable by a program
4. Read-only
2. Owned by a client
3. Owned by a program
4. Credit-only
All accounts are identified by public keys and may hold arbirary data.
When the client sends messages to programs, it requests access to storage
using those keys. The runtime loads the account data and passes it to the
program. The runtime also ensures accounts aren't written to if not owned
by the client or program. Any writes to read-only accounts are discarded
by the client or program. Any writes to credit-only accounts are discarded
unless the write was to credit tokens. Any user may credit other accounts
tokens, regardless of account permission.

View File

@ -1,39 +1,29 @@
# Runtime
The goal with the runtime is to have a general purpose execution environment
that is highly parallelizable. To achieve this goal the runtime forces each
Instruction to specify all of its memory dependencies up front, and therefore a
single Instruction cannot cause a dynamic memory allocation. An explicit
Instruction for memory allocation from the `SystemProgram::CreateAccount` is
the only way to allocate new memory in the engine. A Transaction may compose
multiple Instruction, including `SystemProgram::CreateAccount`, into a single
atomic sequence which allows for memory allocation to achieve a result that is
similar to dynamic allocation.
The runtime is a concurrent transaction processor. Transactions specify their
data dependencies upfront and dynamic memory allocation is explicit. By
separating program code from the state it operates on, the runtime is able to
choreograph concurrent access. Transactions accessing only credit-only
accounts are executed in parallel whereas transactions accessing writable
accounts are serialized. The runtime interacts with the program through an
entrypoint with a well-defined interface. The userdata stored in an account is
an opaque type, an array of bytes. The program has full control over its
contents.
The transaction structure specifies a list of public keys and signatures for
those keys and a sequential list of instructions that will operate over the
states associated with the account keys. For the transaction to be committed
all the instructions must execute successfully; if any abort the whole
transaction fails to commit.
### State
### Account structure
State is addressed by an Account which is at the moment simply the Pubkey. Our
goal is to eliminate memory allocation from within the program itself. Thus
the client of the program provides all the state that is necessary for the
program to execute in the transaction itself. The runtime interacts with the
program through an entry point with a well defined interface. The userdata
stored in an Account is an opaque type to the runtime, a `Vec<u8>`, the
contents of which the program code has full control over.
The Transaction structure specifies a list of Pubkey's and signatures for those
keys and a sequential list of instructions that will operate over the state's
associated with the `account_keys`. For the transaction to be committed all
the instructions must execute successfully, if any abort the whole transaction
fails to commit.
### Account structure Accounts maintain token state as well as program specific
memory.
Accounts maintain a token balance and program-specific memory.
# Transaction Engine
At its core, the engine looks up all the Pubkeys maps them to accounts and
routs them to the `program_id` entry point.
The engine maps public keys to accounts and routes them to the program's
entrypoint.
## Execution
@ -41,48 +31,48 @@ Transactions are batched and processed in a pipeline
<img alt="Runtime pipeline" src="img/runtime.svg" class="center"/>
At the `execute` stage, the loaded pages have no data dependencies, so all the
programs can be executed in parallel.
At the *execute* stage, the loaded pages have no data dependencies, so all the
programs can be executed in parallel.
The runtime enforces the following rules:
1. The `program_id` code is the only code that will modify the contents of
`Account::userdata` of Account's that have been assigned to it. This means
that upon assignment userdata vector is guaranteed to be `0`.
1. Only the *owner* program may modify the contents of an account. This means
that upon assignment userdata vector is guaranteed to be zero.
2. Total balances on all the accounts is equal before and after execution of a
Transaction.
3. Balances of each of the accounts not assigned to `program_id` must be equal
to or greater after the Transaction than before the transaction.
4. All Instructions in the Transaction executed without a failure.
transaction.
3. After the transaction is executed, balances of credit-only accounts must be
greater than or equal to the balances before the transaction.
4. All instructions in the transaction executed atomically. If one fails, all
account modifications are discarded.
## Entry Point Execution of the program involves mapping the Program's public
key to an entry point which takes a pointer to the transaction, and an array of
loaded pages.
Execution of the program involves mapping the program's public key to an
entrypoint which takes a pointer to the transaction, and an array of loaded
pages.
## System Interface
## SystemProgram Interface
The interface is best described by the `Instruction::userdata` that the
user encodes.
* `CreateAccount` - This allows the user to create and assign an Account to a
The interface is best described by the `Instruction::userdata` that the user
encodes.
* `CreateAccount` - This allows the user to create and assign an account to a
Program.
* `Assign` - allows the user to assign an existing account to a `Program`.
* `Move` - moves tokens between `Account`s that are associated with
`SystemProgram`. This cannot be used to move tokens of other `Account`s.
Programs need to implement their own version of Move.
* `Assign` - allows the user to assign an existing account to a program.
* `Move` - moves tokens between account's that are associated with
* `Spawn` - spawn a new program from an account
## Notes
1. There is no dynamic memory allocation. Client's need to call the
`SystemProgram` to create memory before passing it to another program. This
Instruction can be composed into a single Transaction with the call to the
1. There is no dynamic memory allocation. Client's need to use `CreateAccount`
instructions to create memory before passing it to another program. This
instruction can be composed into a single transaction with the call to the
program itself.
2. Runtime guarantees that when memory is assigned to the `Program` it is zero
2. Runtime guarantees that when memory is assigned to the program it is zero
initialized.
3. Runtime guarantees that `Program`'s code is the only thing that can modify
3. Runtime guarantees that a program's code is the only thing that can modify
memory that its assigned to
4. Runtime guarantees that the `Program` can only spend tokens that are in
`Account`s that are assigned to it
5. Runtime guarantees the balances belonging to `Account`s are balanced before
4. Runtime guarantees that the program can only spend tokens that are in
accounts that are assigned to it
5. Runtime guarantees the balances belonging to accounts are balanced before
and after the transaction
6. Runtime guarantees that multiple instructions all executed successfully when
a transaction is committed.

View File

@ -1,4 +1,4 @@
# Introduction to VDFs
# Verifiable Delay Functions
A Verifiable Delay Function is conceptually a water clock where its water marks
can be recorded and later verified that the water most certainly passed