119 lines
26 KiB
HTML
119 lines
26 KiB
HTML
|
<!DOCTYPE html>
|
||
|
<html lang="en-US">
|
||
|
<head>
|
||
|
<meta charset="utf-8">
|
||
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
|
<title>Arguments and Accounts | ⚓ Anchor</title>
|
||
|
<meta name="generator" content="VuePress 1.8.2">
|
||
|
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>⚓ </text></svg>">
|
||
|
<meta name="description" content="">
|
||
|
<meta name="theme-color" content="#3eaf7c">
|
||
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||
|
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||
|
<link rel="preload" href="/anchor/assets/css/0.styles.21b321ec.css" as="style"><link rel="preload" href="/anchor/assets/js/app.af684830.js" as="script"><link rel="preload" href="/anchor/assets/js/2.90291299.js" as="script"><link rel="preload" href="/anchor/assets/js/17.673b524d.js" as="script"><link rel="prefetch" href="/anchor/assets/js/10.99d917b5.js"><link rel="prefetch" href="/anchor/assets/js/11.a15d3f78.js"><link rel="prefetch" href="/anchor/assets/js/12.fa200aeb.js"><link rel="prefetch" href="/anchor/assets/js/13.100bcff2.js"><link rel="prefetch" href="/anchor/assets/js/14.fed38355.js"><link rel="prefetch" href="/anchor/assets/js/15.8862dcbf.js"><link rel="prefetch" href="/anchor/assets/js/16.e68ab07c.js"><link rel="prefetch" href="/anchor/assets/js/18.349727c7.js"><link rel="prefetch" href="/anchor/assets/js/19.d4698aac.js"><link rel="prefetch" href="/anchor/assets/js/20.7299e660.js"><link rel="prefetch" href="/anchor/assets/js/3.2f210bfb.js"><link rel="prefetch" href="/anchor/assets/js/4.f90252b7.js"><link rel="prefetch" href="/anchor/assets/js/5.47891694.js"><link rel="prefetch" href="/anchor/assets/js/6.493f79e9.js"><link rel="prefetch" href="/anchor/assets/js/7.32936426.js"><link rel="prefetch" href="/anchor/assets/js/8.95408a71.js"><link rel="prefetch" href="/anchor/assets/js/9.525a5964.js">
|
||
|
<link rel="stylesheet" href="/anchor/assets/css/0.styles.21b321ec.css">
|
||
|
</head>
|
||
|
<body>
|
||
|
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/anchor/" class="home-link router-link-active"><!----> <span class="site-name">⚓ Anchor</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="https://docs.rs/anchor-lang/latest/anchor_lang/" target="_blank" rel="noopener noreferrer" class="nav-link external">
|
||
|
Rust
|
||
|
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></div><div class="nav-item"><a href="https://project-serum.github.io/anchor/ts/index.html" target="_blank" rel="noopener noreferrer" class="nav-link external">
|
||
|
TypeScript
|
||
|
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></div><div class="nav-item"><a href="https://github.com/project-serum/anchor" target="_blank" rel="noopener noreferrer" class="nav-link external">
|
||
|
GitHub
|
||
|
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></div> <!----></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="https://docs.rs/anchor-lang/latest/anchor_lang/" target="_blank" rel="noopener noreferrer" class="nav-link external">
|
||
|
Rust
|
||
|
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></div><div class="nav-item"><a href="https://project-serum.github.io/anchor/ts/index.html" target="_blank" rel="noopener noreferrer" class="nav-link external">
|
||
|
TypeScript
|
||
|
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></div><div class="nav-item"><a href="https://github.com/project-serum/anchor" target="_blank" rel="noopener noreferrer" class="nav-link external">
|
||
|
GitHub
|
||
|
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></div> <!----></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/anchor/getting-started/introduction.html" class="sidebar-link">Introduction</a></li><li><a href="/anchor/getting-started/installation.html" class="sidebar-link">Installing Dependencies</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Teams</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/anchor/getting-started/projects.html" class="sidebar-link">Projects</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Tutorials</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/anchor/tutorials/tutorial-0.html" class="sidebar-link">A Minimal Example</a></li><li><a href="/anchor/tutorials/tutorial-1.html" aria-current="page" class="active sidebar-link">Arguments and Accounts</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/anchor/tutorials/tutorial-1.html#clone-the-repo" class="sidebar-link">Clone the Repo</a></li><li class="sidebar-sub-header"><a href="/anchor/tutorials/tutorial-1.html#defining-a-program" class="sidebar-link">Defining a Program</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/anchor/tutorials/tutorial-1.html#initialize-instruction" class="sidebar-link">initialize instruction</a></li><li class="sidebar-sub-header"><a href="/anchor/tutorials/tutorial-1.html#update-instruction" class="sidebar-link">update instruction</a></li></ul></li><li class="sidebar-sub-header"><a href="/anchor/tutorials/tutorial-1.html#creating-and-initializing-accounts" class="sidebar-link">Creating and Initializing Accounts</a></li><li class="sidebar-sub-header"><a href="/anchor/tutorials/tutorial-1.html#next-steps" class="sidebar-link">Next Steps</a></li></ul></li><li><a href="/anchor/tutorials/tutorial-2.html" class="sidebar-link">Account Constraints and Access Control</a></li><li><a href="/anchor/tutorials/tutorial-3.html" class="sidebar-link">Cross Program Invocations (CPI)</a></li><li><a href="/anchor/tutorials/tutorial-4.html" class="sidebar-link">Errors</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>CLI</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/anchor/cli/commands.html" class="sidebar-link">Commands</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Source Verification</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/anchor/getting-started/verification.html" class="sidebar-link">Verifiable Builds</a></li><li><a href="/anchor/getting-started/publishing.html" class="sidebar-link">Publishing Source</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="arguments-and-accounts"><a href="#arguments-and-accounts" class="header-anchor">#</a> Arguments and Accounts</h1> <p>This tutorial covers the basics of creating and mutating accounts using Anchor.
|
||
|
It's recommended to read <a href="/anchor/tutorials/tutorial-0.html">Tutorial 0</a> first, as this tutorial will
|
||
|
build on top of it.</p> <h2 id="clone-the-repo"><a href="#clone-the-repo" class="header-anchor">#</a> Clone the Repo</h2> <p>To get started, clone the repo.</p> <div class="language-bash extra-class"><pre class="language-bash"><code><span class="token function">git</span> clone https://github.com/project-serum/anchor
|
||
|
</code></pre></div><p>Change directories to the <a href="https://github.com/project-serum/anchor/tree/master/examples/tutorial/basic-1" target="_blank" rel="noopener noreferrer">example<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>.</p> <div class="language-bash extra-class"><pre class="language-bash"><code><span class="token builtin class-name">cd</span> anchor/examples/tutorial/basic-1
|
||
|
</code></pre></div><p>And install any additional JavaScript dependencies:</p> <div class="language-bash extra-class"><pre class="language-bash"><code><span class="token function">yarn</span> <span class="token function">install</span>
|
||
|
</code></pre></div><h2 id="defining-a-program"><a href="#defining-a-program" class="header-anchor">#</a> Defining a Program</h2> <p>We define our program as follows</p> <div class="language-rs extra-class"><pre class="language-rs"><code><span class="token keyword">use</span> <span class="token namespace">anchor_lang<span class="token punctuation">::</span>prelude<span class="token punctuation">::</span></span><span class="token operator">*</span><span class="token punctuation">;</span>
|
||
|
<span class="token macro property">declare_id!</span><span class="token punctuation">(</span><span class="token string">"Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
|
<span class="token attribute attr-name">#[program]</span>
|
||
|
<span class="token keyword">mod</span> <span class="token module-declaration namespace">basic_1</span> <span class="token punctuation">{</span>
|
||
|
<span class="token keyword">use</span> <span class="token keyword">super</span><span class="token punctuation">::</span><span class="token operator">*</span><span class="token punctuation">;</span>
|
||
|
<span class="token keyword">pub</span> <span class="token keyword">fn</span> <span class="token function-definition function">initialize</span><span class="token punctuation">(</span>ctx<span class="token punctuation">:</span> <span class="token class-name">Context</span><span class="token operator"><</span><span class="token class-name">Initialize</span><span class="token operator">></span><span class="token punctuation">,</span> data<span class="token punctuation">:</span> <span class="token keyword">u64</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">ProgramResult</span> <span class="token punctuation">{</span>
|
||
|
<span class="token keyword">let</span> my_account <span class="token operator">=</span> <span class="token operator">&</span><span class="token keyword">mut</span> ctx<span class="token punctuation">.</span>accounts<span class="token punctuation">.</span>my_account<span class="token punctuation">;</span>
|
||
|
my_account<span class="token punctuation">.</span>data <span class="token operator">=</span> data<span class="token punctuation">;</span>
|
||
|
<span class="token class-name">Ok</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
|
||
|
<span class="token punctuation">}</span>
|
||
|
<span class="token keyword">pub</span> <span class="token keyword">fn</span> <span class="token function-definition function">update</span><span class="token punctuation">(</span>ctx<span class="token punctuation">:</span> <span class="token class-name">Context</span><span class="token operator"><</span><span class="token class-name">Update</span><span class="token operator">></span><span class="token punctuation">,</span> data<span class="token punctuation">:</span> <span class="token keyword">u64</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">ProgramResult</span> <span class="token punctuation">{</span>
|
||
|
<span class="token keyword">let</span> my_account <span class="token operator">=</span> <span class="token operator">&</span><span class="token keyword">mut</span> ctx<span class="token punctuation">.</span>accounts<span class="token punctuation">.</span>my_account<span class="token punctuation">;</span>
|
||
|
my_account<span class="token punctuation">.</span>data <span class="token operator">=</span> data<span class="token punctuation">;</span>
|
||
|
<span class="token class-name">Ok</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
|
||
|
<span class="token punctuation">}</span>
|
||
|
<span class="token punctuation">}</span>
|
||
|
<span class="token attribute attr-name">#[derive(Accounts)]</span>
|
||
|
<span class="token keyword">pub</span> <span class="token keyword">struct</span> <span class="token type-definition class-name">Initialize</span><span class="token operator"><</span><span class="token lifetime-annotation symbol">'info</span><span class="token operator">></span> <span class="token punctuation">{</span>
|
||
|
<span class="token attribute attr-name">#[account(init, payer = user, space = 8 + 8)]</span>
|
||
|
<span class="token keyword">pub</span> my_account<span class="token punctuation">:</span> <span class="token class-name">Account</span><span class="token operator"><</span><span class="token lifetime-annotation symbol">'info</span><span class="token punctuation">,</span> <span class="token class-name">MyAccount</span><span class="token operator">></span><span class="token punctuation">,</span>
|
||
|
<span class="token attribute attr-name">#[account(mut)]</span>
|
||
|
<span class="token keyword">pub</span> user<span class="token punctuation">:</span> <span class="token class-name">Signer</span><span class="token operator"><</span><span class="token lifetime-annotation symbol">'info</span><span class="token operator">></span><span class="token punctuation">,</span>
|
||
|
<span class="token keyword">pub</span> system_program<span class="token punctuation">:</span> <span class="token class-name">Program</span><span class="token operator"><</span><span class="token lifetime-annotation symbol">'info</span><span class="token punctuation">,</span> <span class="token class-name">System</span><span class="token operator">></span><span class="token punctuation">,</span>
|
||
|
<span class="token punctuation">}</span>
|
||
|
<span class="token attribute attr-name">#[derive(Accounts)]</span>
|
||
|
<span class="token keyword">pub</span> <span class="token keyword">struct</span> <span class="token type-definition class-name">Update</span><span class="token operator"><</span><span class="token lifetime-annotation symbol">'info</span><span class="token operator">></span> <span class="token punctuation">{</span>
|
||
|
<span class="token attribute attr-name">#[account(mut)]</span>
|
||
|
<span class="token keyword">pub</span> my_account<span class="token punctuation">:</span> <span class="token class-name">Account</span><span class="token operator"><</span><span class="token lifetime-annotation symbol">'info</span><span class="token punctuation">,</span> <span class="token class-name">MyAccount</span><span class="token operator">></span><span class="token punctuation">,</span>
|
||
|
<span class="token punctuation">}</span>
|
||
|
<span class="token attribute attr-name">#[account]</span>
|
||
|
<span class="token keyword">pub</span> <span class="token keyword">struct</span> <span class="token type-definition class-name">MyAccount</span> <span class="token punctuation">{</span>
|
||
|
<span class="token keyword">pub</span> data<span class="token punctuation">:</span> <span class="token keyword">u64</span><span class="token punctuation">,</span>
|
||
|
<span class="token punctuation">}</span>
|
||
|
</code></pre></div><p>Some new syntax elements are introduced here.</p> <h3 id="initialize-instruction"><a href="#initialize-instruction" class="header-anchor">#</a> <code>initialize</code> instruction</h3> <p>First, let's start with the initialize instruction. Notice the <code>data</code> argument passed into the program. This argument and any other valid
|
||
|
Rust types can be passed to the instruction to define inputs to the program.</p> <p>Additionally,
|
||
|
notice how we take a mutable reference to <code>my_account</code> and assign the <code>data</code> to it. This leads us to
|
||
|
the <code>Initialize</code> struct, deriving <code>Accounts</code>. There are two things to notice about <code>Initialize</code>.</p> <ol><li>The <code>my_account</code> field is of type <code>Account<'info, MyAccount></code> and the deserialized data structure is <code>MyAccount</code>.</li> <li>The <code>my_account</code> field is marked with the <code>init</code> attribute. This will create a new
|
||
|
account owned by the current program, zero initialized. When using <code>init</code>, one must also provide
|
||
|
<code>payer</code>, which will fund the account creation, <code>space</code>, which defines how large the account should be,
|
||
|
and the <code>system_program</code>, which is required by the runtime for creating the account.</li></ol> <details class="custom-block details"><summary>DETAILS</summary> <p>All accounts created with Anchor are laid out as follows: <code>8-byte-discriminator || borsh serialized data</code>. The 8-byte-discriminator is created from the first 8 bytes of the
|
||
|
<code>Sha256</code> hash of the account's type--using the example above, <code>sha256("account:MyAccount")[..8]</code>.
|
||
|
The <code>account:</code> is a fixed prefix.</p> <p>Importantly, this allows a program to know for certain an account is indeed of a given type.
|
||
|
Without it, a program would be vulnerable to account injection attacks, where a malicious user
|
||
|
specifies an account of an unexpected type, causing the program to do unexpected things.</p> <p>On account creation, this 8-byte discriminator doesn't exist, since the account storage is
|
||
|
zeroed. The first time an Anchor program mutates an account, this discriminator is prepended
|
||
|
to the account storage array and all subsequent accesses to the account (not decorated with
|
||
|
<code>#[account(init)]</code>) will check for this discriminator.</p></details> <h3 id="update-instruction"><a href="#update-instruction" class="header-anchor">#</a> <code>update</code> instruction</h3> <p>Similarly, the <code>Update</code> accounts struct is marked with the <code>#[account(mut)]</code> attribute.
|
||
|
Marking an account as <code>mut</code> persists any changes made upon exiting the program.</p> <p>Here we've covered the basics of how to interact with accounts. In a later tutorial,
|
||
|
we'll delve more deeply into deriving <code>Accounts</code>, but for now, just know
|
||
|
you must mark an account <code>init</code> when using it for the first time and <code>mut</code>
|
||
|
for persisting changes.</p> <h2 id="creating-and-initializing-accounts"><a href="#creating-and-initializing-accounts" class="header-anchor">#</a> Creating and Initializing Accounts</h2> <p>We can interact with the program as follows.</p> <div class="language-js extra-class"><pre class="language-js"><code><span class="token comment">// The program to execute.</span>
|
||
|
<span class="token keyword">const</span> program <span class="token operator">=</span> anchor<span class="token punctuation">.</span>workspace<span class="token punctuation">.</span>Basic1<span class="token punctuation">;</span>
|
||
|
<span class="token comment">// The Account to create.</span>
|
||
|
<span class="token keyword">const</span> myAccount <span class="token operator">=</span> anchor<span class="token punctuation">.</span>web3<span class="token punctuation">.</span>Keypair<span class="token punctuation">.</span><span class="token function">generate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
|
<span class="token comment">// Create the new account and initialize it with the program.</span>
|
||
|
<span class="token keyword">await</span> program<span class="token punctuation">.</span>rpc<span class="token punctuation">.</span><span class="token function">initialize</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">anchor<span class="token punctuation">.</span>BN</span><span class="token punctuation">(</span><span class="token number">1234</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>
|
||
|
accounts<span class="token operator">:</span> <span class="token punctuation">{</span>
|
||
|
myAccount<span class="token operator">:</span> myAccount<span class="token punctuation">.</span>publicKey<span class="token punctuation">,</span>
|
||
|
user<span class="token operator">:</span> provider<span class="token punctuation">.</span>wallet<span class="token punctuation">.</span>publicKey<span class="token punctuation">,</span>
|
||
|
systemProgram<span class="token operator">:</span> SystemProgram<span class="token punctuation">.</span>programId<span class="token punctuation">,</span>
|
||
|
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
||
|
signers<span class="token operator">:</span> <span class="token punctuation">[</span>myAccount<span class="token punctuation">]</span><span class="token punctuation">,</span>
|
||
|
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div><p>The last element passed into the method is common amongst all dynamically generated
|
||
|
methods on the <code>rpc</code> namespace, containing several options for a transaction. Here,
|
||
|
we specify the <code>accounts</code> field, an object of all the addresses the transaction
|
||
|
needs to touch, and the <code>signers</code> array of all <code>Signer</code> objects needed to sign the
|
||
|
transaction. Because <code>myAccount</code> is being created, the Solana runtime requries it
|
||
|
to sign the transaction.</p> <details class="custom-block details"><summary>DETAILS</summary> <p>If you've developed on Solana before, you might notice two things 1) the ordering of the accounts doesn't
|
||
|
matter and 2) the <code>isWritable</code> and <code>isSigner</code>
|
||
|
options are not specified on the account anywhere. In both cases, the framework takes care
|
||
|
of these details for you, by reading the IDL.</p></details> <p>As before, we can run the example tests.</p> <div class="language- extra-class"><pre class="language-text"><code>anchor test
|
||
|
</code></pre></div><h2 id="next-steps"><a href="#next-steps" class="header-anchor">#</a> Next Steps</h2> <p>We've covered all the basics of developing applications using Anchor. However, we've
|
||
|
left out one important aspect to ensure the security of our programs--validating input
|
||
|
and access control. We'll cover that next.</p></div> <footer class="page-edit"><!----> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
|
||
|
←
|
||
|
<a href="/anchor/tutorials/tutorial-0.html" class="prev">
|
||
|
A Minimal Example
|
||
|
</a></span> <span class="next"><a href="/anchor/tutorials/tutorial-2.html">
|
||
|
Account Constraints and Access Control
|
||
|
</a>
|
||
|
→
|
||
|
</span></p></div> </main></div><div class="global-ui"></div></div>
|
||
|
<script src="/anchor/assets/js/app.af684830.js" defer></script><script src="/anchor/assets/js/2.90291299.js" defer></script><script src="/anchor/assets/js/17.673b524d.js" defer></script>
|
||
|
</body>
|
||
|
</html>
|