1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
module ProtoRpc : Tezos_proxy.Proxy_proto.PROTO_RPC = struct
(** Split done only when the mode is [Tezos_proxy.Proxy.server]. Getting
an entire big map at once is useful for dapp developers that
iterate a lot on big maps and that use proxy servers in their
internal infra. *)
let split_server key =
match key with
| "big_maps" :: "index" :: i :: "contents" :: tail ->
Some (["big_maps"; "index"; i; "contents"], tail)
| _ -> None
(** Split that is always done, no matter the mode *)
let split_always key =
match key with
| "contracts" :: "index" :: i :: tail ->
Some (["contracts"; "index"; i], tail)
| "cycle" :: i :: tail -> Some (["cycle"; i], tail)
| "rolls" :: "owner" :: "snapshot" :: i :: j :: tail ->
Some (["rolls"; "owner"; "snapshot"; i; j], tail)
| "v1" :: tail -> Some (["v1"], tail)
| _ -> None
let split_key (mode : Tezos_proxy.Proxy.mode)
(key : Tezos_protocol_environment.Proxy_context.M.key) :
(Tezos_protocol_environment.Proxy_context.M.key
* Tezos_protocol_environment.Proxy_context.M.key)
option =
match split_always key with
| Some _ as res ->
res
| None -> (
match mode with
| Client ->
None
| Server -> split_server key)
let failure_is_permanent = function
| ["pending_migration_balance_updates"]
| ["pending_migration_operation_results"] ->
true
| _ -> false
let do_rpc (pgi : Tezos_proxy.Proxy.proxy_getter_input)
(key : Tezos_protocol_environment.Proxy_context.M.key) =
let chain = pgi.chain in
let block = pgi.block in
Tezos_proxy.Logger.emit
Tezos_proxy.Logger.proxy_block_rpc
( Tezos_shell_services.Block_services.chain_to_string chain,
Tezos_shell_services.Block_services.to_string block,
key )
>>= fun () ->
Protocol_client_context.Alpha_block_services.Context.read
pgi.rpc_context
~chain
~block
key
>>=? fun (raw_context : Tezos_context_sigs.Context.Proof_types.raw_context)
->
Tezos_proxy.Logger.emit Tezos_proxy.Logger.tree_received
@@ Int64.of_int (Tezos_proxy.Proxy_getter.raw_context_size raw_context)
>>= fun () -> return raw_context
end
let initial_context (ctx : Tezos_proxy.Proxy_getter.rpc_context_args)
(hash : Context_hash.t) :
Tezos_protocol_environment.Context.t tzresult Lwt.t =
let open Lwt_result_syntax in
let*! () =
Tezos_proxy.Logger.emit
Tezos_proxy.Logger.proxy_getter_created
( Tezos_shell_services.Block_services.chain_to_string ctx.chain,
Tezos_shell_services.Block_services.to_string ctx.block )
in
let p_rpc = (module ProtoRpc : Tezos_proxy.Proxy_proto.PROTO_RPC) in
let* (module ProxyDelegation) =
Tezos_proxy.Proxy_getter.make_delegate ctx p_rpc hash
in
let empty =
Tezos_protocol_environment.Proxy_context.empty
@@ Some (module ProxyDelegation)
in
let version_value = "ithaca_012" in
let*! ctxt =
Tezos_protocol_environment.Context.add
empty
["version"]
(Bytes.of_string version_value)
in
Lwt_result.ok (Protocol.Main.init_cache ctxt)
let round_durations (rpc_context : Tezos_rpc.Context.generic)
(chain : Tezos_shell_services.Block_services.chain)
(block : Tezos_shell_services.Block_services.block) =
let open Protocol in
let rpc_context = new Protocol_client_context.wrap_rpc_context rpc_context in
Constants_services.all rpc_context (chain, block) >>=? fun constants ->
return_some
(Alpha_context.Period.to_seconds constants.parametric.minimal_block_delay)
let () =
let open Tezos_proxy.Registration in
let module M : Proxy_sig = struct
module Protocol = Protocol_client_context.Lifted_protocol
let protocol_hash = Protocol.hash
let directory = Plugin.RPC.rpc_services
let initial_context = initial_context
let time_between_blocks = round_durations
include Light.M
end in
register_proxy_context (module M)