forked from argotorg/fe
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeploy_contract.html
More file actions
309 lines (226 loc) · 29.8 KB
/
Copy pathdeploy_contract.html
File metadata and controls
309 lines (226 loc) · 29.8 KB
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
<!DOCTYPE HTML>
<html lang="en" class="sidebar-visible no-js light">
<head>
<!-- Book generated using mdBook -->
<meta charset="UTF-8">
<title>Deploying a contract to a testnet - The Fe Guide</title>
<!-- Custom HTML head -->
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#ffffff" />
<link rel="icon" href="../favicon.svg">
<link rel="shortcut icon" href="../favicon.png">
<link rel="stylesheet" href="../css/variables.css">
<link rel="stylesheet" href="../css/general.css">
<link rel="stylesheet" href="../css/chrome.css">
<link rel="stylesheet" href="../css/print.css" media="print">
<!-- Fonts -->
<link rel="stylesheet" href="../FontAwesome/css/font-awesome.css">
<link rel="stylesheet" href="../fonts/fonts.css">
<!-- Highlight.js Stylesheets -->
<link rel="stylesheet" href="../highlight.css">
<link rel="stylesheet" href="../tomorrow-night.css">
<link rel="stylesheet" href="../ayu-highlight.css">
<!-- Custom theme stylesheets -->
<link rel="stylesheet" href="../theme/reference.css">
</head>
<body>
<!-- Provide site root to javascript -->
<script type="text/javascript">
var path_to_root = "../";
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
</script>
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script type="text/javascript">
try {
var theme = localStorage.getItem('mdbook-theme');
var sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
}
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
}
} catch (e) { }
</script>
<!-- Set the theme before any content is loaded, prevents flash -->
<script type="text/javascript">
var theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
var html = document.querySelector('html');
html.classList.remove('no-js')
html.classList.remove('light')
html.classList.add(theme);
html.classList.add('js');
</script>
<!-- Hide / unhide sidebar before it is displayed -->
<script type="text/javascript">
var html = document.querySelector('html');
var sidebar = 'hidden';
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
}
html.classList.remove('sidebar-visible');
html.classList.add("sidebar-" + sidebar);
</script>
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
<div class="sidebar-scrollbox">
<ol class="chapter"><li class="chapter-item expanded affix "><a href="../index.html">Introduction</a></li><li class="chapter-item expanded "><a href="../quickstart/index.html"><strong aria-hidden="true">1.</strong> Quickstart</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../quickstart/installation.html"><strong aria-hidden="true">1.1.</strong> Installation</a></li><li class="chapter-item expanded "><a href="../quickstart/first_contract.html"><strong aria-hidden="true">1.2.</strong> Write your first contract</a></li><li class="chapter-item expanded "><a href="../quickstart/deploy_contract.html" class="active"><strong aria-hidden="true">1.3.</strong> Deploying a contract to a testnet</a></li></ol></li><li class="chapter-item expanded "><a href="../development/index.html"><strong aria-hidden="true">2.</strong> Development</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../development/build.html"><strong aria-hidden="true">2.1.</strong> Build & Test</a></li><li class="chapter-item expanded "><a href="../development/release.html"><strong aria-hidden="true">2.2.</strong> Release</a></li></ol></li><li class="chapter-item expanded "><a href="../spec/index.html"><strong aria-hidden="true">3.</strong> Specification (WIP)</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../spec/notation.html"><strong aria-hidden="true">3.1.</strong> Notation</a></li><li class="chapter-item expanded "><a href="../spec/lexical_structure/index.html"><strong aria-hidden="true">3.2.</strong> Lexical Structure</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../spec/lexical_structure/keywords.html"><strong aria-hidden="true">3.2.1.</strong> Keywords</a></li><li class="chapter-item expanded "><a href="../spec/lexical_structure/identifiers.html"><strong aria-hidden="true">3.2.2.</strong> Identifiers</a></li><li class="chapter-item expanded "><a href="../spec/lexical_structure/tokens.html"><strong aria-hidden="true">3.2.3.</strong> Tokens</a></li></ol></li><li class="chapter-item expanded "><a href="../spec/comments.html"><strong aria-hidden="true">3.3.</strong> Comments</a></li><li class="chapter-item expanded "><a href="../spec/items/index.html"><strong aria-hidden="true">3.4.</strong> Items</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../spec/items/visibility_and_privacy.html"><strong aria-hidden="true">3.4.1.</strong> Visibility and Privacy</a></li><li class="chapter-item expanded "><a href="../spec/items/functions.html"><strong aria-hidden="true">3.4.2.</strong> Functions</a></li><li class="chapter-item expanded "><a href="../spec/items/structs.html"><strong aria-hidden="true">3.4.3.</strong> Structs</a></li><li class="chapter-item expanded "><a href="../spec/items/events.html"><strong aria-hidden="true">3.4.4.</strong> Events</a></li><li class="chapter-item expanded "><a href="../spec/items/enum.html"><strong aria-hidden="true">3.4.5.</strong> Enumeration</a></li><li class="chapter-item expanded "><a href="../spec/items/type_aliases.html"><strong aria-hidden="true">3.4.6.</strong> Type Aliases</a></li><li class="chapter-item expanded "><a href="../spec/items/contracts.html"><strong aria-hidden="true">3.4.7.</strong> Contracts</a></li></ol></li><li class="chapter-item expanded "><a href="../spec/statements/index.html"><strong aria-hidden="true">3.5.</strong> Statements</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../spec/statements/pragma.html"><strong aria-hidden="true">3.5.1.</strong> pragma Statement</a></li><li class="chapter-item expanded "><a href="../spec/statements/const.html"><strong aria-hidden="true">3.5.2.</strong> const Statement</a></li><li class="chapter-item expanded "><a href="../spec/statements/let.html"><strong aria-hidden="true">3.5.3.</strong> let Statement</a></li><li class="chapter-item expanded "><a href="../spec/statements/assign.html"><strong aria-hidden="true">3.5.4.</strong> Assignment Statement</a></li><li class="chapter-item expanded "><a href="../spec/statements/augassign.html"><strong aria-hidden="true">3.5.5.</strong> Augmenting Assignment Statement</a></li><li class="chapter-item expanded "><a href="../spec/statements/revert.html"><strong aria-hidden="true">3.5.6.</strong> revert Statement</a></li><li class="chapter-item expanded "><a href="../spec/statements/return.html"><strong aria-hidden="true">3.5.7.</strong> return Statement</a></li><li class="chapter-item expanded "><a href="../spec/statements/emit.html"><strong aria-hidden="true">3.5.8.</strong> emit Statement</a></li><li class="chapter-item expanded "><a href="../spec/statements/if.html"><strong aria-hidden="true">3.5.9.</strong> if Statement</a></li><li class="chapter-item expanded "><a href="../spec/statements/for.html"><strong aria-hidden="true">3.5.10.</strong> for Statement</a></li><li class="chapter-item expanded "><a href="../spec/statements/while.html"><strong aria-hidden="true">3.5.11.</strong> while Statement</a></li><li class="chapter-item expanded "><a href="../spec/statements/break.html"><strong aria-hidden="true">3.5.12.</strong> break Statement</a></li><li class="chapter-item expanded "><a href="../spec/statements/continue.html"><strong aria-hidden="true">3.5.13.</strong> continue Statement</a></li><li class="chapter-item expanded "><a href="../spec/statements/assert.html"><strong aria-hidden="true">3.5.14.</strong> assert Statement</a></li><li class="chapter-item expanded "><a href="../spec/statements/pass.html"><strong aria-hidden="true">3.5.15.</strong> pass Statement</a></li></ol></li><li class="chapter-item expanded "><a href="../spec/expressions/index.html"><strong aria-hidden="true">3.6.</strong> Expressions</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../spec/expressions/call.html"><strong aria-hidden="true">3.6.1.</strong> Call expressions</a></li><li class="chapter-item expanded "><a href="../spec/expressions/tuple.html"><strong aria-hidden="true">3.6.2.</strong> Tuple expressions</a></li><li class="chapter-item expanded "><a href="../spec/expressions/list.html"><strong aria-hidden="true">3.6.3.</strong> List expressions</a></li><li class="chapter-item expanded "><a href="../spec/expressions/struct.html"><strong aria-hidden="true">3.6.4.</strong> Struct expressions</a></li><li class="chapter-item expanded "><a href="../spec/expressions/indexing.html"><strong aria-hidden="true">3.6.5.</strong> Index expressions</a></li><li class="chapter-item expanded "><a href="../spec/expressions/attribute.html"><strong aria-hidden="true">3.6.6.</strong> Attribute expressions</a></li><li class="chapter-item expanded "><a href="../spec/expressions/name.html"><strong aria-hidden="true">3.6.7.</strong> Name expressions</a></li><li class="chapter-item expanded "><a href="../spec/expressions/literal.html"><strong aria-hidden="true">3.6.8.</strong> Literal expressions</a></li><li class="chapter-item expanded "><a href="../spec/expressions/arithmetic_operators.html"><strong aria-hidden="true">3.6.9.</strong> Arithmetic Operators</a></li><li class="chapter-item expanded "><a href="../spec/expressions/comparison_operators.html"><strong aria-hidden="true">3.6.10.</strong> Comparision Operators</a></li><li class="chapter-item expanded "><a href="../spec/expressions/boolean_operators.html"><strong aria-hidden="true">3.6.11.</strong> Boolean Operators</a></li><li class="chapter-item expanded "><a href="../spec/expressions/unary_operators.html"><strong aria-hidden="true">3.6.12.</strong> Unary Operators</a></li></ol></li><li class="chapter-item expanded "><a href="../spec/type_system/index.html"><strong aria-hidden="true">3.7.</strong> Type System</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../spec/type_system/types/index.html"><strong aria-hidden="true">3.7.1.</strong> Types</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../spec/type_system/types/boolean.html"><strong aria-hidden="true">3.7.1.1.</strong> Boolean Type</a></li><li class="chapter-item expanded "><a href="../spec/type_system/types/contract.html"><strong aria-hidden="true">3.7.1.2.</strong> Contract Type</a></li><li class="chapter-item expanded "><a href="../spec/type_system/types/numeric.html"><strong aria-hidden="true">3.7.1.3.</strong> Numeric Types</a></li><li class="chapter-item expanded "><a href="../spec/type_system/types/tuple.html"><strong aria-hidden="true">3.7.1.4.</strong> Tuple Types</a></li><li class="chapter-item expanded "><a href="../spec/type_system/types/array.html"><strong aria-hidden="true">3.7.1.5.</strong> Array Types</a></li><li class="chapter-item expanded "><a href="../spec/type_system/types/struct.html"><strong aria-hidden="true">3.7.1.6.</strong> Struct Types</a></li><li class="chapter-item expanded "><a href="../spec/type_system/types/enum.html"><strong aria-hidden="true">3.7.1.7.</strong> Enumerated Types</a></li><li class="chapter-item expanded "><a href="../spec/type_system/types/address.html"><strong aria-hidden="true">3.7.1.8.</strong> Address Type</a></li><li class="chapter-item expanded "><a href="../spec/type_system/types/map.html"><strong aria-hidden="true">3.7.1.9.</strong> Map Type</a></li><li class="chapter-item expanded "><a href="../spec/type_system/types/string.html"><strong aria-hidden="true">3.7.1.10.</strong> String Type</a></li><li class="chapter-item expanded "><a href="../spec/type_system/types/unit.html"><strong aria-hidden="true">3.7.1.11.</strong> Unit Type</a></li><li class="chapter-item expanded "><a href="../spec/type_system/types/event.html"><strong aria-hidden="true">3.7.1.12.</strong> Event Types</a></li><li class="chapter-item expanded "><a href="../spec/type_system/types/function.html"><strong aria-hidden="true">3.7.1.13.</strong> Function Type</a></li></ol></li></ol></li><li class="chapter-item expanded "><a href="../spec/data_layout/index.html"><strong aria-hidden="true">3.8.</strong> Data Layout</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../spec/data_layout/stack.html"><strong aria-hidden="true">3.8.1.</strong> Stack</a></li><li class="chapter-item expanded "><a href="../spec/data_layout/storage/index.html"><strong aria-hidden="true">3.8.2.</strong> Storage</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../spec/data_layout/storage/constant_size_values_in_storage.html"><strong aria-hidden="true">3.8.2.1.</strong> Constant size values in storage</a></li><li class="chapter-item expanded "><a href="../spec/data_layout/storage/maps_in_storage.html"><strong aria-hidden="true">3.8.2.2.</strong> Maps in storage</a></li><li class="chapter-item expanded "><a href="../spec/data_layout/storage/to_mem_function.html"><strong aria-hidden="true">3.8.2.3.</strong> to_mem() function</a></li></ol></li><li class="chapter-item expanded "><a href="../spec/data_layout/memory/index.html"><strong aria-hidden="true">3.8.3.</strong> Memory</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../spec/data_layout/memory/sequence_types_in_memory.html"><strong aria-hidden="true">3.8.3.1.</strong> Sequence types in memory</a></li><li class="chapter-item expanded "><a href="../spec/data_layout/memory/clone_function.html"><strong aria-hidden="true">3.8.3.2.</strong> clone() function</a></li></ol></li></ol></li><li class="chapter-item expanded "><a href="../spec/function_calls.html"><strong aria-hidden="true">3.9.</strong> Function calls</a></li></ol></li><li class="chapter-item expanded "><a href="../release_notes.html"><strong aria-hidden="true">4.</strong> Release Notes</a></li><li class="chapter-item expanded "><a href="../code_of_conduct.html"><strong aria-hidden="true">5.</strong> Code of Conduct</a></li></ol>
</div>
<div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
</nav>
<div id="page-wrapper" class="page-wrapper">
<div class="page">
<div id="menu-bar-hover-placeholder"></div>
<div id="menu-bar" class="menu-bar sticky bordered">
<div class="left-buttons">
<button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
<i class="fa fa-bars"></i>
</button>
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
<i class="fa fa-paint-brush"></i>
</button>
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
<li role="none"><button role="menuitem" class="theme" id="light">Light (default)</button></li>
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
</ul>
<button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
<i class="fa fa-search"></i>
</button>
</div>
<h1 class="menu-title">The Fe Guide</h1>
<div class="right-buttons">
<a href="../print.html" title="Print this book" aria-label="Print this book">
<i id="print-button" class="fa fa-print"></i>
</a>
</div>
</div>
<div id="search-wrapper" class="hidden">
<form id="searchbar-outer" class="searchbar-outer">
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
</form>
<div id="searchresults-outer" class="searchresults-outer hidden">
<div id="searchresults-header" class="searchresults-header"></div>
<ul id="searchresults">
</ul>
</div>
</div>
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
<script type="text/javascript">
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
});
</script>
<div id="content" class="content">
<main>
<h2 id="deploy-your-contract"><a class="header" href="#deploy-your-contract">Deploy your contract.</a></h2>
<p>Since we have written our first contract now, how about we bring it to live and use it on an actual chain?</p>
<p>Deploying such a demo contract to the Ethereum mainnet would be a waste of money but fortunately we have a few other options to choose from. For instance, we can use our very own local blockchain instance which is great for local development. Alternatively we can use a test network that provides developers shared infrastructure to deploy code without spending actual money on it.</p>
<p>In this guide we will learn how to deploy and interact with our guest book on the popular <a href="https://goerli.net/">Görli testnet</a>.</p>
<h3 id="setting-the-stage-with-dapptools"><a class="header" href="#setting-the-stage-with-dapptools">Setting the stage with dapp.tools</a></h3>
<p>The Ethereum ecosystem provides a rich set of tools to assist smart contract developers in various ways when it comes to developing, testing, deploying and upgrading smart contracts. Fe is still a very young language and there are no tools yet that are tailored for the language. Having said that, most tooling should be flexible enough to work with Fe in some way that might feel slightly less integrated. For this guide we choose to use DappTools which is a very lightweight set of command line tools for managing smart contract development.</p>
<p>To follow this guide, you will first need to head over to <a href="https://dapp.tools">dapp.tools</a> and follow the installation steps.</p>
<blockquote>
<p>Note: If you are a seasoned smart contract developer who uses different tools, feel free to follow the tutorial using your own toolchain.</p>
</blockquote>
<h3 id="setting-up-a-görli-user-account"><a class="header" href="#setting-up-a-görli-user-account">Setting up a Görli user account</a></h3>
<p>To deploy our contract to the Görli testnet we will need to have an Ethereum account that has some GöETH. GöETH has no real value but it is still a resource that is needed as a basic line of defense against spamming the testnet. If you don't have any GöETH yet, you can request some from this <a href="https://goerli-faucet.slock.it/">faucet</a></p>
<p>The next thing we need is to create a keystore file for our account so that dapp tools can sign messages via <a href="https://github.com/dapphub/dapptools/tree/master/src/ethsign"><code>ethsign</code></a>.</p>
<blockquote>
<p><strong>IMPORTANT</strong>: It is good practice to <strong>never</strong> use an Ethereum account for a testnet that is also used for the actual Ethereum mainnet.</p>
</blockquote>
<p>To create the keystore file for your testnet account, you can use <code>ethsign</code> to import your private key. Run the following command and follow the instructions.</p>
<pre><code>ethsign import --keystore ~/.ethereum/keystore/
</code></pre>
<h3 id="making-the-deployment-transaction"><a class="header" href="#making-the-deployment-transaction">Making the deployment transaction</a></h3>
<p>Let's recall that we finished our guest book in the previous chapter with the following code.</p>
<pre><code class="language-python">contract GuestBook:
messages: Map<address, String<100>>
pub fn sign(self, book_msg: String<100>):
self.messages[msg.sender] = book_msg
pub fn get_msg(self, addr: address) -> String<100>:
return self.messages[addr].to_mem()
</code></pre>
<p>If you haven't already, run <code>./fe guest_book.fe --overwrite</code> to obtain the bytecode that we want to deploy.</p>
<p>To make the deployment, we will need to send a transaction to a node that participates in the Görli network. We can run our own node, sign up at Infura to use one of their nodes or find an open public node such as <code>https://goerli-light.eth.linkpool.io</code> which we will use to keep this tutorial as accessible as possible.</p>
<p>Use the following command to deploy the contract. Please note that <code><rpc-url></code> needs to be replaced with the URL of the node that we connect to and <code><our-eth-address></code> needs to be replaced with the Ethereum address that we imported in the previous step.</p>
<pre><code>$ ETH_RPC_URL=<rpc-url> ETH_FROM=<our-eth-address> seth send --create output/GuestBook/GuestBook.bin
</code></pre>
<p>What follows is the actual command and the response that was used when writing the tutorial.</p>
<pre><code>$ ETH_RPC_URL=https://goerli-light.eth.linkpool.io ETH_FROM=0x4E14AaF86CF0759d6Ec8C7433acd66F07D093293 seth send --create output/GuestBook/GuestBook.bin
seth-send: warning: `ETH_GAS' not set; using default gas amount
Ethereum account passphrase (not echoed): seth-send: Published transaction with 681 bytes of calldata.
seth-send: 0x241ac045170d0612b67b2319fa08ed8be8b79568e00090c4f84146897b83760b
seth-send: Waiting for transaction receipt...............................
seth-send: Transaction included in block 4858224.
0xcecd2be6d4d01ed7906f502be6321c3721f38bc6
</code></pre>
<p>As we can see in the output, our transaction <a href="https://goerli.etherscan.io/tx/0x241ac045170d0612b67b2319fa08ed8be8b79568e00090c4f84146897b83760b"><code>0x241ac045170d0612b67b2319fa08ed8be8b79568e00090c4f84146897b83760b</code></a> to deploy the contract is now included in the Görli blockchain. At the very end of the response we find <a href="https://goerli.etherscan.io/address/0xcecd2be6d4d01ed7906f502be6321c3721f38bc6"><code>0xcecd2be6d4d01ed7906f502be6321c3721f38bc6</code></a> which is the address where our contract is now deployed.</p>
<h3 id="signing-the-guest-book"><a class="header" href="#signing-the-guest-book">Signing the guest book</a></h3>
<p>Now that the guest book is live on the Görli network, everyone can send a transaction to sign it. We will sign it from the same address that was used to deploy the contract but there is nothing preventing anyone to sign it from any other address.</p>
<p>The following command will send a transaction to call <code>sign(string)</code> with the message <em>"We <3 Fe"</em>.</p>
<pre><code>ETH_RPC_URL=<rpc-url> ETH_FROM=<our-eth-address> seth send <contract-address> "sign(string)" '"We <3 Fe"'
</code></pre>
<p>What follows is again the actual command and the response that was used when writing the tutorial.</p>
<pre><code>$ ETH_RPC_URL=https://goerli-light.eth.linkpool.io ETH_FROM=0x4E14AaF86CF0759d6Ec8C7433acd66F07D093293 seth send 0xcecd2be6d4d01ed7906f502be6321c3721f38bc6 "sign(string)" '"We <3 Fe"'
seth-send: warning: `ETH_GAS' not set; using default gas amount
Ethereum account passphrase (not echoed): seth-send: Published transaction with 100 bytes of calldata.
seth-send: 0xf61c042064a501939769b802d1455124b0f8665eb1b070c75c2815ca52bd8706
seth-send: Waiting for transaction receipt.............
seth-send: Transaction included in block 4858368.
</code></pre>
<p>Just as before, the response tells us the transaction hash <a href="https://goerli.etherscan.io/tx/0xf61c042064a501939769b802d1455124b0f8665eb1b070c75c2815ca52bd8706"><code>0xf61c042064a501939769b802d1455124b0f8665eb1b070c75c2815ca52bd8706</code></a> which we can inspect on Etherscan.</p>
<h3 id="reading-the-signatures"><a class="header" href="#reading-the-signatures">Reading the signatures</a></h3>
<p>The <code>get_msg(address)</code> API let's us read any signature for any address but it will give us an response of 100 zero bytes for any address that simply hasn't signed the guestbook.</p>
<p>Since reading the messages doesn't change any state within the blochchain, we don't have to send and actual transaction. Instead we just perform a <em>call</em> against the local state of the node that we are querying.</p>
<p>To do that run:</p>
<pre><code>$ ETH_RPC_URL=<rpc-url> seth call <contract-address> "get_msg(address)" <address-to-check> | seth --to-ascii
</code></pre>
<p>Notice that the command doesn't need to provide <code>ETH_FROM</code> simply because we are not sending an actual transaction.</p>
<pre><code>$ ETH_RPC_URL=https://goerli-light.eth.linkpool.io seth call 0xcecd2be6d4d01ed7906f502be6321c3721f38bc6 "get_msg(address)" 0x4E14AaF86CF0759d6Ec8C7433acd66F07D093293 | seth --to-ascii
We <3 Fe
</code></pre>
<p>As we can see in the last line of the output the signature for address <code>0x4E14AaF86CF0759d6Ec8C7433acd66F07D093293</code> is in fact <em>We <3 Fe</em>.</p>
<p>Congratulations! You've deployed real Fe code to a live network 🤖</p>
</main>
<nav class="nav-wrapper" aria-label="Page navigation">
<!-- Mobile navigation buttons -->
<a rel="prev" href="../quickstart/first_contract.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<i class="fa fa-angle-left"></i>
</a>
<a rel="next" href="../development/index.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
<div style="clear: both"></div>
</nav>
</div>
</div>
<nav class="nav-wide-wrapper" aria-label="Page navigation">
<a rel="prev" href="../quickstart/first_contract.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<i class="fa fa-angle-left"></i>
</a>
<a rel="next" href="../development/index.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
</nav>
</div>
<script type="text/javascript">
window.playground_copyable = true;
</script>
<script src="../elasticlunr.min.js" type="text/javascript" charset="utf-8"></script>
<script src="../mark.min.js" type="text/javascript" charset="utf-8"></script>
<script src="../searcher.js" type="text/javascript" charset="utf-8"></script>
<script src="../clipboard.min.js" type="text/javascript" charset="utf-8"></script>
<script src="../highlight.js" type="text/javascript" charset="utf-8"></script>
<script src="../book.js" type="text/javascript" charset="utf-8"></script>
<!-- Custom JS scripts -->
</body>
</html>