From the above abi, we can see that `currency` contract accepts an action called `transfer` that accepts message with fields `from`, `to`, and `amount`.
1589302ms thread-0 main.cpp:271 operator() ] Converting argument to binary...
...
...
@@ -540,18 +602,6 @@
}
}
```
We can check the balance of `tester` inside its scope, and see it has balance of 50
```
./eosc get table tester currency account
{
"rows": [{
"account": "account",
"balance": 50
}
],
"more": true
}
```
Now we can transfer it from `tester` to `inita` and require the permission of `tester`. This should drain the balance of `tester` to 0.
...
...
@@ -626,6 +676,30 @@
[...snipped...]
```
@section querycontract Querying Contract
After doing the transfer action on `currency` contract, we can verify the amount of token held by each account by looking at `currency`'s `account` table.
This table is stored on the scope of each account instead of on `currency` scope.
```
$./eosc get table tester currency account
{
"rows": [],
"more": false
}
$./eosc get table inita currency account
{
"rows": [{
"account": "account",
"balance": 50
}
],
"more": true
}
```
@section particularnode Connecting to Particular Node
By default, `eosc` will connect to `eosd` running on localhost port 8888. You can connect to another `eosd` node by specifying its host and port.
<p><code>eosc</code> is a command line tool that interfaces with the REST api exposed by eosd. In order to use <code>eosc</code> you will need to have a local copy of <code>eosd</code> running and configured to load the 'eos::chain_api_plugin'.</p>
<p>As an easy way for developers to test functionality without dealing with keys, <code>eosd</code> can be run so that Transaction signatures are not required. ... ./eosd –skip-transaction-signatures ...</p>
<divclass="fragment"><divclass="line"><spanclass="preprocessor"># Plugin(s) to enable, may be specified multiple times</span></div><divclass="line"> plugin = eos::producer_plugin</div><divclass="line"> plugin = eos::chain_api_plugin</div></div><!-- fragment --><p>After starting <code>eosd</code> you should be able to query the current blockchain state like so:</p>
<p>In order to sign transaction and push it to the blockchain, you will need to have the 'eos::wallet_api_plugin' loaded.</p>
<p>And in order to query account history and transaction, you will need to have the 'eos::account_history_api_plugin' loaded. </p><divclass="fragment"><divclass="line"><spanclass="preprocessor"># Plugin(s) to enable, may be specified multiple times</span></div><divclass="line"> plugin = eos::producer_plugin</div><divclass="line"> plugin = eos::chain_api_plugin</div><divclass="line"> plugin = eos::wallet_api_plugin</div><divclass="line"> plugin = eos::account_history_api_plugin</div></div><!-- fragment --><p>After starting <code>eosd</code> you should be able to query the current blockchain state like so:</p>
<p>Any transaction sent to the blockchain will need to be signed by the respective authority's private key. Before you will be able to sign the transaction, you will need a wallet to store and manage the private key. </p><divclass="fragment"><divclass="line">$ ./eosc wallet create</div><divclass="line">Creating wallet: <spanclass="keywordflow">default</span></div><divclass="line">Save password to use in the future to unlock <spanclass="keyword">this</span> wallet.</div><divclass="line">Without password imported keys will not be retrievable.</div><divclass="line"><spanclass="stringliteral">"PW5JD9cw9YY288AXPvnbwUk5JK4Cy6YyZ83wzHcshu8F2akU9rRWE"</span></div></div><!-- fragment --><p> This will create a wallet called 'default' inside <code>eos-walletd</code> and return a password that you can use to unlock your wallet in the future.</p>
<p>You can create multiple wallets by specifying unique name </p><divclass="fragment"><divclass="line">$ ./eosc wallet create -n second-wallet</div><divclass="line">Creating wallet: second-wallet</div><divclass="line">Save password to use in the future to unlock <spanclass="keyword">this</span> wallet.</div><divclass="line">Without password imported keys will not be retrievable.</div><divclass="line"><spanclass="stringliteral">"PW5Ji6JUrLjhKAVn68nmacLxwhvtqUAV18J7iycZppsPKeoGGgBEw"</span></div></div><!-- fragment --><p>And you will be see it in the list of your wallets </p><divclass="fragment"><divclass="line">$ ./eosc wallet list</div><divclass="line">Wallets:</div><divclass="line">[</div><divclass="line"><spanclass="stringliteral">"default *"</span>,</div><divclass="line"><spanclass="stringliteral">"second-wallet *"</span></div><divclass="line">]</div></div><!-- fragment --><dlclass="section note"><dt>Note</dt><dd>For any wallet operation, if you don't specify the name of the wallet, it will always resort to <code>default</code> wallet</dd></dl>
<h1><aclass="anchor"id="importkey"></a>
Importing Key to Wallet</h1>
<p>Import the key that you want to use to sign the transaction to your wallet. The following will import key for genesis accounts (i.e. inita, initb, initc, ..., initu) </p><divclass="fragment"><divclass="line">$ ./eosc wallet <spanclass="keyword">import</span> 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3</div><divclass="line">imported <spanclass="keyword">private</span> key <spanclass="keywordflow">for</span>: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV</div></div><!-- fragment --><p> You will then be able to see the list of imported private keys and their respective public key </p><divclass="fragment"><divclass="line">$ ./eosc wallet keys</div><divclass="line">[[</div><divclass="line"><spanclass="stringliteral">"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV"</span>,</div><divclass="line"><spanclass="stringliteral">"5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"</span></div><divclass="line"> ]</div><divclass="line">]</div></div><!-- fragment --><h1><aclass="anchor"id="lockwallet"></a>
Locking and Unlocking Wallet</h1>
<p>To keep your private key safe, lock your wallet </p><divclass="fragment"><divclass="line">$ ./eosc wallet lock -n second-wallet</div><divclass="line">Locked: <spanclass="stringliteral">'second-wallet'</span></div></div><!-- fragment --><p> Notice that the locked wallet doesn't have * symbol in the list </p><divclass="fragment"><divclass="line">$ ./eosc wallet list</div><divclass="line">Wallets:</div><divclass="line">[</div><divclass="line"><spanclass="stringliteral">"default *"</span>,</div><divclass="line"><spanclass="stringliteral">"second-wallet"</span></div><divclass="line">]</div></div><!-- fragment --><p> To unlock it specify the password you get when creating the wallet </p><divclass="fragment"><divclass="line">$ ./eosc wallet unlock -n second-wallet --password PW5Ji6JUrLjhKAVn68nmacLxwhvtqUAV18J7iycZppsPKeoGGgBEw</div><divclass="line">Unlocked: <spanclass="stringliteral">'second-wallet'</span></div></div><!-- fragment --><h1><aclass="anchor"id="openwallet"></a>
Opening Wallet</h1>
<p>All of the wallets data are store inside data_dir folder. When you restart your wallet app (in this case <code>eosd</code>), you will need to open the wallet so <code>eosc</code> can have access to it. </p><divclass="fragment"><divclass="line">$ ./eosc wallet list</div><divclass="line">Wallets: []</div><divclass="line">$ ./eosc wallet open</div><divclass="line">Wallets: [</div><divclass="line"><spanclass="stringliteral">"default"</span></div><divclass="line">]</div><divclass="line">$ ./eosc wallet open -n second-wallet</div><divclass="line">Wallets: [</div><divclass="line"><spanclass="stringliteral">"default"</span>,</div><divclass="line"><spanclass="stringliteral">"second-wallet"</span></div><divclass="line">]</div></div><!-- fragment --><dlclass="section note"><dt>Note</dt><dd>The wallet is locked by default</dd></dl>
<h1><aclass="anchor"id="createaccount"></a>
Creating an Account</h1>
<p>In order to create an account you will need two new keys: owener and active. You can ask eosc to create some keys for you:</p>
<p>In order to create an account you will need two new keys: owner and active. You can ask <code>eosc</code> to create some keys for you:</p>
<p>This will be your owner key, </p><divclass="fragment"><divclass="line">$ ./eosc create key</div><divclass="line"><spanclass="keyword">public</span>: EOS4toFS3YXEQCkuuw1aqDLrtHim86Gz9u3hBdcBw5KNPZcursVHq</div><divclass="line"><spanclass="keyword">private</span>: 5JKbLfCXgcafDQVwHMm3shHt6iRWgrr9adcmt6vX3FNjAEtJGaT</div></div><!-- fragment --><p>And this will be your active key, </p><divclass="fragment"><divclass="line">$ ./eosc create key</div><divclass="line"><spanclass="keyword">public</span>: EOS7d9A3uLe6As66jzN8j44TXJUqJSK3bFjjEEqR4oTvNAB3iM9SA</div><divclass="line"><spanclass="keyword">private</span>: 5Hv22aPcjnENBv6X9o9nKGdkfrW44En6z4zJUt2PobAvbQXrT9z</div></div><!-- fragment --><dlclass="section note"><dt>Note</dt><dd>eosc does not save the generated private key.</dd></dl>
<p>Next we will create the account <code>tester</code>, but because all accounts need to be created by an existing account we will ask the <code>inita</code> account to create <code>tester</code> using the owner and active keys created above. <code>inita</code> was specified in the genesis file.</p>
<p>Right now this requires eosd to be run with the <code>--skip-transaction-signatures</code> flag.</p>
<divclass="fragment"><divclass="line">$ ./eosc create account inita tester EOS4toFS3YXEQCkuuw1aqDLrtHim86Gz9u3hBdcBw5KNPZcursVHq EOS7d9A3uLe6As66jzN8j44TXJUqJSK3bFjjEEqR4oTvNAB3iM9SA</div><divclass="line">{</div><divclass="line"><spanclass="stringliteral">"transaction_id"</span>: <spanclass="stringliteral">"6acd2ece68c4b86c1fa209c3989235063384020781f2c67bbb80bc8d540ca120"</span>,</div><divclass="line"><spanclass="stringliteral">"processed"</span>: {</div><divclass="line"><spanclass="stringliteral">"refBlockNum"</span>: <spanclass="stringliteral">"25217"</span>,</div><divclass="line"><spanclass="stringliteral">"refBlockPrefix"</span>: <spanclass="stringliteral">"2095475630"</span>,</div><divclass="line"><spanclass="stringliteral">"expiration"</span>: <spanclass="stringliteral">"2017-07-25T17:54:55"</span>,</div><divclass="line"><spanclass="stringliteral">"scope"</span>: [</div><divclass="line"><spanclass="stringliteral">"eos"</span>,</div><divclass="line"><spanclass="stringliteral">"inita"</span></div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"signatures"</span>: [],</div><divclass="line"><spanclass="stringliteral">"messages"</span>: [{</div><divclass="line"><spanclass="stringliteral">"code"</span>: <spanclass="stringliteral">"eos"</span>,</div><divclass="line"><spanclass="stringliteral">"type"</span>: <spanclass="stringliteral">"newaccount"</span>,</div><divclass="line"><spanclass="stringliteral">"authorization"</span>: [{</div><divclass="line"><spanclass="stringliteral">"account"</span>: <spanclass="stringliteral">"inita"</span>,</div><divclass="line"><spanclass="stringliteral">"permission"</span>: <spanclass="stringliteral">"active"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"data"</span>: <spanclass="stringliteral">"c9251a0000000000b44c5a2400000000010000000102bcca6347d828d4e1868b7dfa91692a16d5b20d0ee3d16a7ca2ddcc7f6dd03344010000010000000102bcca6347d828d4e1868b7dfa91692a16d5b20d0ee3d16a7ca2ddcc7f6dd03344010000010000000001c9251a000000000061d0640b000000000100010000000000000008454f5300000000"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"output"</span>: [{</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> ]</div><divclass="line"> }</div><divclass="line">}</div></div><!-- fragment --><p>After creating the account we can view the current account status like so:</p>
<divclass="fragment"><divclass="line">$ ./eosc <spanclass="keyword">get</span> account tester</div><divclass="line">{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"eos_balance"</span>: 0,</div><divclass="line"><spanclass="stringliteral">"staked_balance"</span>: 1,</div><divclass="line"><spanclass="stringliteral">"unstaking_balance"</span>: 0,</div><divclass="line"><spanclass="stringliteral">"last_unstaking_time"</span>: <spanclass="stringliteral">"1969-12-31T23:59:59"</span></div><divclass="line">}</div></div><!-- fragment --><p>You will note that there is no balance because almost all genesis EOS tokens are currently allocated to the <code>eos</code> account.</p>
<divclass="fragment"><divclass="line">$ ./eosc <spanclass="keyword">get</span> account <aclass="code"href="namespaceeos.html">eos</a></div><divclass="line">{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"eos"</span>,</div><divclass="line"><spanclass="stringliteral">"eos_balance"</span>: <spanclass="stringliteral">"8999999999998100"</span>,</div><divclass="line"><spanclass="stringliteral">"staked_balance"</span>: 0,</div><divclass="line"><spanclass="stringliteral">"unstaking_balance"</span>: 0,</div><divclass="line"><spanclass="stringliteral">"last_unstaking_time"</span>: <spanclass="stringliteral">"1969-12-31T23:59:59"</span>,</div><divclass="line"><spanclass="stringliteral">"abi"</span>: {</div><divclass="line"><spanclass="stringliteral">"types"</span>: [{</div><divclass="line"><spanclass="stringliteral">"newTypeName"</span>: <spanclass="stringliteral">"AccountName"</span>,</div><divclass="line"><spanclass="stringliteral">"type"</span>: <spanclass="stringliteral">"Name"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"structs"</span>: [{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"transfer"</span>,</div><divclass="line"><spanclass="stringliteral">"base"</span>: <spanclass="stringliteral">""</span>,</div><divclass="line"><spanclass="stringliteral">"fields"</span>: {</div><divclass="line"><spanclass="stringliteral">"from"</span>: <spanclass="stringliteral">"AccountName"</span>,</div><divclass="line"><spanclass="stringliteral">"to"</span>: <spanclass="stringliteral">"AccountName"</span>,</div><divclass="line"><spanclass="stringliteral">"amount"</span>: <spanclass="stringliteral">"UInt64"</span></div><divclass="line"> }</div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"actions"</span>: [{</div><divclass="line"><spanclass="stringliteral">"action"</span>: <spanclass="stringliteral">"transfer"</span>,</div><divclass="line"><spanclass="stringliteral">"type"</span>: <spanclass="stringliteral">"transfer"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"tables"</span>: []</div><divclass="line"> }</div><divclass="line">}</div></div><!-- fragment --><dlclass="section note"><dt>Note</dt><dd>The <code>eos</code> account happens to have an ABI (Application Binary Interface) defined which provides meta-data to tools that want to interface with the <code>eos</code> contract.</dd></dl>
<p>We can fund our <code>tester</code> account via <code>eosc</code> with the following command:</p>
<divclass="fragment"><divclass="line">$ ./eosc transfer <aclass="code"href="namespaceeos.html">eos</a> tester 1000</div><divclass="line">{</div><divclass="line"><spanclass="stringliteral">"transaction_id"</span>: <spanclass="stringliteral">"52b488d27ce1f72a2b29f22e5e1638fa5db5d7805565884e795733a15c6c2195"</span>,</div><divclass="line"><spanclass="stringliteral">"processed"</span>: {</div><divclass="line"><spanclass="stringliteral">"refBlockNum"</span>: <spanclass="stringliteral">"25298"</span>,</div><divclass="line"><spanclass="stringliteral">"refBlockPrefix"</span>: <spanclass="stringliteral">"1151709320"</span>,</div><divclass="line"><spanclass="stringliteral">"expiration"</span>: <spanclass="stringliteral">"2017-07-25T17:58:58"</span>,</div><divclass="line"><spanclass="stringliteral">"scope"</span>: [</div><divclass="line"><spanclass="stringliteral">"eos"</span>,</div><divclass="line"><spanclass="stringliteral">"tester"</span></div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"signatures"</span>: [],</div><divclass="line"><spanclass="stringliteral">"messages"</span>: [{</div><divclass="line"><spanclass="stringliteral">"code"</span>: <spanclass="stringliteral">"eos"</span>,</div><divclass="line"><spanclass="stringliteral">"type"</span>: <spanclass="stringliteral">"transfer"</span>,</div><divclass="line"><spanclass="stringliteral">"authorization"</span>: [{</div><divclass="line"><spanclass="stringliteral">"account"</span>: <spanclass="stringliteral">"eos"</span>,</div><divclass="line"><spanclass="stringliteral">"permission"</span>: <spanclass="stringliteral">"active"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"data"</span>: {</div><divclass="line"><spanclass="stringliteral">"from"</span>: <spanclass="stringliteral">"eos"</span>,</div><divclass="line"><spanclass="stringliteral">"to"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"amount"</span>: 1000</div><divclass="line"> },</div><divclass="line"><spanclass="stringliteral">"hex_data"</span>: <spanclass="stringliteral">"e54d000000000000b44c5a2400000000e803000000000000"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"output"</span>: [{</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"output"</span>: {</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> ]</div><divclass="line"> }</div><divclass="line">}</div></div><!-- fragment --><p>Now we can verify that the funds were received.</p>
<p>In order to push transaction as <code>inita</code>, you first need to <ahref="#importkey">import inita's private key to your wallet</a></p>
<p>Then create an account called tester </p><divclass="fragment"><divclass="line">$ ./eosc create account inita tester EOS4toFS3YXEQCkuuw1aqDLrtHim86Gz9u3hBdcBw5KNPZcursVHq EOS7d9A3uLe6As66jzN8j44TXJUqJSK3bFjjEEqR4oTvNAB3iM9SA</div><divclass="line">{</div><divclass="line"><spanclass="stringliteral">"transaction_id"</span>: <spanclass="stringliteral">"6acd2ece68c4b86c1fa209c3989235063384020781f2c67bbb80bc8d540ca120"</span>,</div><divclass="line"><spanclass="stringliteral">"processed"</span>: {</div><divclass="line"><spanclass="stringliteral">"refBlockNum"</span>: <spanclass="stringliteral">"25217"</span>,</div><divclass="line"><spanclass="stringliteral">"refBlockPrefix"</span>: <spanclass="stringliteral">"2095475630"</span>,</div><divclass="line"><spanclass="stringliteral">"expiration"</span>: <spanclass="stringliteral">"2017-07-25T17:54:55"</span>,</div><divclass="line"><spanclass="stringliteral">"scope"</span>: [</div><divclass="line"><spanclass="stringliteral">"eos"</span>,</div><divclass="line"><spanclass="stringliteral">"inita"</span></div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"signatures"</span>: [],</div><divclass="line"><spanclass="stringliteral">"messages"</span>: [{</div><divclass="line"><spanclass="stringliteral">"code"</span>: <spanclass="stringliteral">"eos"</span>,</div><divclass="line"><spanclass="stringliteral">"type"</span>: <spanclass="stringliteral">"newaccount"</span>,</div><divclass="line"><spanclass="stringliteral">"authorization"</span>: [{</div><divclass="line"><spanclass="stringliteral">"account"</span>: <spanclass="stringliteral">"inita"</span>,</div><divclass="line"><spanclass="stringliteral">"permission"</span>: <spanclass="stringliteral">"active"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"data"</span>: <spanclass="stringliteral">"c9251a0000000000b44c5a2400000000010000000102bcca6347d828d4e1868b7dfa91692a16d5b20d0ee3d16a7ca2ddcc7f6dd03344010000010000000102bcca6347d828d4e1868b7dfa91692a16d5b20d0ee3d16a7ca2ddcc7f6dd03344010000010000000001c9251a000000000061d0640b000000000100010000000000000008454f5300000000"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"output"</span>: [{</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> ]</div><divclass="line"> }</div><divclass="line">}</div></div><!-- fragment --><p> You can see that <code>tester</code> is now the controlled_account under <code>inita</code></p><divclass="fragment"><divclass="line">$ ./eosc <spanclass="keyword">get</span> servants inita</div><divclass="line">{</div><divclass="line"><spanclass="stringliteral">"controlled_accounts"</span>: [</div><divclass="line"><spanclass="stringliteral">"tester"</span></div><divclass="line"> ]</div><divclass="line">}</div></div><!-- fragment --><h1><aclass="anchor"id="transfereos"></a>
Transfer EOS</h1>
<p>After creating the account we can view the current account status like so:</p>
<divclass="fragment"><divclass="line">$ ./eosc <spanclass="keyword">get</span> account tester</div><divclass="line">{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"eos_balance"</span>: 0,</div><divclass="line"><spanclass="stringliteral">"staked_balance"</span>: 1,</div><divclass="line"><spanclass="stringliteral">"unstaking_balance"</span>: 0,</div><divclass="line"><spanclass="stringliteral">"last_unstaking_time"</span>: <spanclass="stringliteral">"1969-12-31T23:59:59"</span>,</div><divclass="line"><spanclass="stringliteral">"permissions"</span>: [{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"active"</span>,</div><divclass="line"><spanclass="stringliteral">"parent"</span>: <spanclass="stringliteral">"owner"</span>,</div><divclass="line"><spanclass="stringliteral">"required_auth"</span>: {</div><divclass="line"><spanclass="stringliteral">"threshold"</span>: 1,</div><divclass="line"><spanclass="stringliteral">"keys"</span>: [{</div><divclass="line"><spanclass="stringliteral">"key"</span>: <spanclass="stringliteral">"EOS7d9A3uLe6As66jzN8j44TXJUqJSK3bFjjEEqR4oTvNAB3iM9SA"</span>,</div><divclass="line"><spanclass="stringliteral">"weight"</span>: 1</div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"accounts"</span>: []</div><divclass="line"> }</div><divclass="line"> },{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"owner"</span>,</div><divclass="line"><spanclass="stringliteral">"parent"</span>: <spanclass="stringliteral">"owner"</span>,</div><divclass="line"><spanclass="stringliteral">"required_auth"</span>: {</div><divclass="line"><spanclass="stringliteral">"threshold"</span>: 1,</div><divclass="line"><spanclass="stringliteral">"keys"</span>: [{</div><divclass="line"><spanclass="stringliteral">"key"</span>: <spanclass="stringliteral">"EOS4toFS3YXEQCkuuw1aqDLrtHim86Gz9u3hBdcBw5KNPZcursVHq"</span>,</div><divclass="line"><spanclass="stringliteral">"weight"</span>: 1</div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"accounts"</span>: []</div><divclass="line"> }</div><divclass="line"> }</div><divclass="line"> ]</div><divclass="line">}</div></div><!-- fragment --><p>You will note that there is no balance because almost all genesis EOS tokens are currently allocated to the <code>eos</code> account and genesis accounts.</p>
<divclass="fragment"><divclass="line">{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"eos"</span>,</div><divclass="line"><spanclass="stringliteral">"eos_balance"</span>: <spanclass="stringliteral">"69000000.0000 EOS"</span>,</div><divclass="line"><spanclass="stringliteral">"staked_balance"</span>: <spanclass="stringliteral">"0.0000 EOS"</span>,</div><divclass="line"><spanclass="stringliteral">"unstaking_balance"</span>: <spanclass="stringliteral">"0.0000 EOS"</span>,</div><divclass="line"><spanclass="stringliteral">"last_unstaking_time"</span>: <spanclass="stringliteral">"1969-12-31T23:59:59"</span>,</div><divclass="line"><spanclass="stringliteral">"permissions"</span>: []</div><divclass="line">}</div></div><!-- fragment --><p>Since we have the private key of the genesis accounts (i.e. inita, initb, initc, etc) in the wallet. We can fund our <code>tester</code> account via <code>eosc</code> through any of the genesis account with the following command:</p>
<divclass="fragment"><divclass="line">$ ./eosc transfer inita tester 1000</div><divclass="line">{</div><divclass="line"><spanclass="stringliteral">"transaction_id"</span>: <spanclass="stringliteral">"eb4b94b72718a369af09eb2e7885b3f494dd1d8a20278a6634611d5edd76b703"</span>,</div><divclass="line"><spanclass="stringliteral">"processed"</span>: {</div><divclass="line"><spanclass="stringliteral">"refBlockNum"</span>: 2206,</div><divclass="line"><spanclass="stringliteral">"refBlockPrefix"</span>: 221394282,</div><divclass="line"><spanclass="stringliteral">"expiration"</span>: <spanclass="stringliteral">"2017-09-05T08:03:58"</span>,</div><divclass="line"><spanclass="stringliteral">"scope"</span>: [</div><divclass="line"><spanclass="stringliteral">"inita"</span>,</div><divclass="line"><spanclass="stringliteral">"tester"</span></div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"signatures"</span>: [</div><divclass="line"><spanclass="stringliteral">"1f22e64240e1e479eee6ccbbd79a29f1a6eb6020384b4cca1a958e7c708d3e562009ae6e60afac96f9a3b89d729a50cd5a7b5a7a647540ba1678831bf970e83312"</span></div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"messages"</span>: [{</div><divclass="line"><spanclass="stringliteral">"code"</span>: <spanclass="stringliteral">"eos"</span>,</div><divclass="line"><spanclass="stringliteral">"type"</span>: <spanclass="stringliteral">"transfer"</span>,</div><divclass="line"><spanclass="stringliteral">"authorization"</span>: [{</div><divclass="line"><spanclass="stringliteral">"account"</span>: <spanclass="stringliteral">"inita"</span>,</div><divclass="line"><spanclass="stringliteral">"permission"</span>: <spanclass="stringliteral">"active"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"data"</span>: {</div><divclass="line"><spanclass="stringliteral">"from"</span>: <spanclass="stringliteral">"inita"</span>,</div><divclass="line"><spanclass="stringliteral">"to"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"amount"</span>: 1000,</div><divclass="line"><spanclass="stringliteral">"memo"</span>: <spanclass="stringliteral">""</span></div><divclass="line"> },</div><divclass="line"><spanclass="stringliteral">"hex_data"</span>: <spanclass="stringliteral">"000000008040934b00000000c84267a1e80300000000000000"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"output"</span>: [{</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"output"</span>: {</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> },{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"inita"</span>,</div><divclass="line"><spanclass="stringliteral">"output"</span>: {</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> ]</div><divclass="line"> }</div><divclass="line">}</div></div><!-- fragment --><p>Now we can verify that the funds were received.</p>
<p>With account_history_api_plugin loaded in <code>eosd</code>, we can query for particular transaction </p><divclass="fragment"><divclass="line">$ ./eosc <spanclass="keyword">get</span> transaction eb4b94b72718a369af09eb2e7885b3f494dd1d8a20278a6634611d5edd76b703</div><divclass="line">{</div><divclass="line"><spanclass="stringliteral">"transaction_id"</span>: <spanclass="stringliteral">"eb4b94b72718a369af09eb2e7885b3f494dd1d8a20278a6634611d5edd76b703"</span>,</div><divclass="line"><spanclass="stringliteral">"processed"</span>: {</div><divclass="line"><spanclass="stringliteral">"refBlockNum"</span>: 2206,</div><divclass="line"><spanclass="stringliteral">"refBlockPrefix"</span>: 221394282,</div><divclass="line"><spanclass="stringliteral">"expiration"</span>: <spanclass="stringliteral">"2017-09-05T08:03:58"</span>,</div><divclass="line"><spanclass="stringliteral">"scope"</span>: [</div><divclass="line"><spanclass="stringliteral">"inita"</span>,</div><divclass="line"><spanclass="stringliteral">"tester"</span></div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"signatures"</span>: [</div><divclass="line"><spanclass="stringliteral">"1f22e64240e1e479eee6ccbbd79a29f1a6eb6020384b4cca1a958e7c708d3e562009ae6e60afac96f9a3b89d729a50cd5a7b5a7a647540ba1678831bf970e83312"</span></div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"messages"</span>: [{</div><divclass="line"><spanclass="stringliteral">"code"</span>: <spanclass="stringliteral">"eos"</span>,</div><divclass="line"><spanclass="stringliteral">"type"</span>: <spanclass="stringliteral">"transfer"</span>,</div><divclass="line"><spanclass="stringliteral">"authorization"</span>: [{</div><divclass="line"><spanclass="stringliteral">"account"</span>: <spanclass="stringliteral">"inita"</span>,</div><divclass="line"><spanclass="stringliteral">"permission"</span>: <spanclass="stringliteral">"active"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"data"</span>: {</div><divclass="line"><spanclass="stringliteral">"from"</span>: <spanclass="stringliteral">"inita"</span>,</div><divclass="line"><spanclass="stringliteral">"to"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"amount"</span>: 1000,</div><divclass="line"><spanclass="stringliteral">"memo"</span>: <spanclass="stringliteral">""</span></div><divclass="line"> },</div><divclass="line"><spanclass="stringliteral">"hex_data"</span>: <spanclass="stringliteral">"000000008040934b00000000c84267a1e80300000000000000"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"output"</span>: [{</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"output"</span>: {</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> },{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"inita"</span>,</div><divclass="line"><spanclass="stringliteral">"output"</span>: {</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> ]</div><divclass="line"> }</div><divclass="line">}</div></div><!-- fragment --><p> Also we can query list of transactions performed by certain account starting from recent one </p><divclass="fragment"><divclass="line">$ ./eosc <spanclass="keyword">get</span> transactions inita</div><divclass="line">[</div><divclass="line"> {</div><divclass="line"><spanclass="stringliteral">"transaction_id"</span>: <spanclass="stringliteral">"eb4b94b72718a369af09eb2e7885b3f494dd1d8a20278a6634611d5edd76b703"</span>,</div><divclass="line"> ...</div><divclass="line"> },</div><divclass="line"> {</div><divclass="line"><spanclass="stringliteral">"transaction_id"</span>: <spanclass="stringliteral">"6acd2ece68c4b86c1fa209c3989235063384020781f2c67bbb80bc8d540ca120"</span>,</div><divclass="line"> ...</div><divclass="line"> },</div><divclass="line"> ...</div><divclass="line">]</div></div><!-- fragment --><h1><aclass="anchor"id="createcontract"></a>
Creating a Contract</h1>
<p>In this section we will use <code>eosc</code> to create and publish a currency contract. You can find the example currency contract in the <code>eos/contracts/currency</code> directory.</p>
<p>The first step is to create an account for currency. We will have the <code>tester</code> account create the <code>currency</code> account.</p>
<divclass="fragment"><divclass="line">$ ./eosc create account tester <aclass="code"href="namespacecurrency.html">currency</a> EOS4toFS3YXEQCkuuw1aqDLrtHim86Gz9u3hBdcBw5KNPZcursVHq EOS7d9A3uLe6As66jzN8j44TXJUqJSK3bFjjEEqR4oTvNAB3iM9SA</div></div><!-- fragment --><p>The next step is to publish the contract (.wast) and its abi (.abi)</p>
<divclass="fragment"><divclass="line">$ ./eosc contract <aclass="code"href="namespacecurrency.html">currency</a> ../../contracts/<aclass="code"href="namespacecurrency.html">currency</a>/<aclass="code"href="namespacecurrency.html">currency</a>.wast ../../contracts/<aclass="code"href="namespacecurrency.html">currency</a>/<aclass="code"href="namespacecurrency.html">currency</a>.abi</div><divclass="line">Reading WAST...</div><divclass="line">Assembling WASM...</div><divclass="line">Publishing contract...</div><divclass="line">{</div><divclass="line"><spanclass="stringliteral">"transaction_id"</span>: <spanclass="stringliteral">"9990306e13f630a9c5436a5a0b6fb8fe2c7f3da2f342b4898a39c4a2c17dcdb3"</span>,</div><divclass="line"><spanclass="stringliteral">"processed"</span>: {</div><divclass="line"><spanclass="stringliteral">"refBlockNum"</span>: 1208,</div><divclass="line"><spanclass="stringliteral">"refBlockPrefix"</span>: 3058534156,</div><divclass="line"><spanclass="stringliteral">"expiration"</span>: <spanclass="stringliteral">"2017-08-24T18:29:52"</span>,</div><divclass="line"><spanclass="stringliteral">"scope"</span>: [</div><divclass="line"><spanclass="stringliteral">"currency"</span>,</div><divclass="line"><spanclass="stringliteral">"eos"</span></div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"signatures"</span>: [],</div><divclass="line"><spanclass="stringliteral">"messages"</span>: [{</div><divclass="line"><spanclass="stringliteral">"code"</span>: <spanclass="stringliteral">"eos"</span>,</div><divclass="line"><spanclass="stringliteral">"type"</span>: <spanclass="stringliteral">"setcode"</span>,</div><divclass="line"><spanclass="stringliteral">"authorization"</span>: [{</div><divclass="line"><spanclass="stringliteral">"account"</span>: <spanclass="stringliteral">"currency"</span>,</div><divclass="line"><spanclass="stringliteral">"permission"</span>: <spanclass="stringliteral">"active"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"data"</span>: <spanclass="stringliteral">"00000079b822651d0000e8150061736d0100000001390a60017e0060037e7e7f017f60047e7e7f7f017f60017f0060057e7e7e7f7f017f60027f7f0060027f7f017f60027e7f0060000060027e7e00029d010a03656e7606617373657274000503656e76086c6f61645f693634000403656e76067072696e7469000003656e76067072696e746e000003656e76067072696e7473000303656e760b726561644d657373616765000603656e760a72656d6f76655f693634000103656e760b7265717569726541757468000003656e760d726571756972654e6f74696365000003656e760973746f72655f6936340002030706000007030809040401700000050301000107cc0107066d656d6f72790200205f5a4e33656f733133726571756972654e6f74696365454e535f344e616d6545000a1e5f5a4e33656f7331317265717569726541757468454e535f344e616d6545000b345f5a4e3863757272656e6379313273746f72654163636f756e74454e33656f73344e616d6545524b4e535f374163636f756e7445000c355f5a4e3863757272656e637932336170706c795f63757272656e63795f7472616e7366657245524b4e535f385472616e7366657245000d04696e6974000e056170706c79000f0a9d0d060600200010080b0600200010070b3400024020012903084200510d0020004280808080a8d7bee3082001411010091a0f0b20004280808080a8d7bee308200110061a0b8a0604017e027f047e017f4100410028020441206b2208360204200029030821052000290300210720002903102104411010042004100241c000100442808080c887d7c8b21d100341d00010042007100341e000100420051003200029030021052000290308100820051008200029030010072000290300210142002105423b210441f00021034200210603400240024002400240024020054206560d0020032c00002202419f7f6a41ff017141194b0d01200241a0016a21020c020b420021072005420b580d020c030b200241ea016a41002002414f6a41ff01714105491b21020b2002ad42388642388721070b2007421f83200442ffffffff0f838621070b200341016a2103200542017c2105200720068421062004427b7c2204427a520d000b420021052008420037031820082006370310200142808080c887d7c8b21d4280808080a8d7bee308200841106a411010011a200041086a2903002101423b210441f00021034200210603400240024002400240024020054206560d0020032c00002202419f7f6a41ff017141194b0d01200241a0016a21020c020b420021072005420b580d020c030b200241ea016a41002002414f6a41ff01714105491b21020b2002ad42388642388721070b2007421f83200442ffffffff0f838621070b200341016a2103200542017c2105200720068421062004427b7c2204427a520d000b2008200637030020084200370308200142808080c887d7c8b21d4280808080a8d7bee3082008411010011a200841186a2203290300200041106a22022903005a418001100020032003290300200229030022057d370300200520082903087c20055a41b00110002008200829030820022903007c370308200029030021050240024020032903004200510d0020054280808080a8d7bee308200841106a411010091a0c010b20054280808080a8d7bee308200841106a10061a0b200041086a290300210502400240200841086a2903004200510d0020054280808080a8d7bee3082008411010091a0c010b20054280808080a8d7bee308200810061a0b4100200841206a3602040b980303027f057e017f4100410028020441106b220736020442002103423b210241e00121014200210403400240024002400240024020034207560d0020012c00002200419f7f6a41ff017141194b0d01200041a0016a21000c020b420021052003420b580d020c030b200041ea016a41002000414f6a41ff01714105491b21000b2000ad42388642388721050b2005421f83200242ffffffff0f838621050b200141016a2101200342017c2103200520048421042002427b7c2202427a520d000b42002103423b210241f00021014200210603400240024002400240024020034206560d0020012c00002200419f7f6a41ff017141194b0d01200041a0016a21000c020b420021052003420b580d020c030b200041ea016a41002000414f6a41ff01714105491b21000b2000ad42388642388721050b2005421f83200242ffffffff0f838621050b200141016a2101200342017c2103200520068421062002427b7c2202427a520d000b2007428094ebdc033703082007200637030020044280808080a8d7bee3082007411010091a4100200741106a3602040bb10303027f047e017f4100410028020441206b220836020442002105423b210441e00121034200210603400240024002400240024020054207560d0020032c00002202419f7f6a41ff017141194b0d01200241a0016a21020c020b420021072005420b580d020c030b200241ea016a41002002414f6a41ff01714105491b21020b2002ad42388642388721070b2007421f83200442ffffffff0f838621070b200341016a2103200542017c2105200720068421062004427b7c2204427a520d000b024020062000520d0042002105423b210441f00121034200210603400240024002400240024020054207560d0020032c00002202419f7f6a41ff017141194b0d01200241a0016a21020c020b420021072005420b580d020c030b200241ea016a41002002414f6a41ff01714105491b21020b2002ad42388642388721070b2007421f83200442ffffffff0f838621070b200341016a2103200542017c2105200720068421062004427b7c2204427a520d000b20062001520d00200842003703102008420037030820084200370318200841086a4118100541174b4180021000200841086a100d0b4100200841206a3602040b0bff010b0041040b04200500000041100b2254686973206170706561727320746f2062652061207472616e73666572206f6620000041c0000b0220000041d0000b072066726f6d20000041e0000b0520746f20000041f0000b086163636f756e7400004180010b2c696e746567657220756e646572666c6f77207375627472616374696e6720746f6b656e2062616c616e6365000041b0010b26696e7465676572206f766572666c6f7720616464696e6720746f6b656e2062616c616e6365000041e0010b0963757272656e6379000041f0010b097472616e7366657200004180020b1e6d6573736167652073686f72746572207468616e2065787065637465640000fd02046e616d651006617373657274020000086c6f61645f693634050000000000067072696e74690100067072696e746e0100067072696e747301000b726561644d6573736167650200000a72656d6f76655f693634030000000b726571756972654175746801000d726571756972654e6f7469636501000973746f72655f6936340400000000205f5a4e33656f733133726571756972654e6f74696365454e535f344e616d65450101301e5f5a4e33656f7331317265717569726541757468454e535f344e616d6545010130345f5a4e3863757272656e6379313273746f72654163636f756e74454e33656f73344e616d6545524b4e535f374163636f756e74450201300131355f5a4e3863757272656e637932336170706c795f63757272656e63795f7472616e7366657245524b4e535f385472616e73666572450901300131013201330134013501360137013804696e69740801300131013201330134013501360137056170706c7909013001310132013301340135013601370138010b4163636f756e744e616d65044e616d6502087472616e7366657200030466726f6d0b4163636f756e744e616d6502746f0b4163636f756e744e616d65087175616e746974790655496e743634076163636f756e740002036b65790655496e7436340762616c616e63650655496e74363401000000b298e982a4087472616e736665720100000080bafac608076163636f756e74"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"output"</span>: [{</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> ]</div><divclass="line"> }</div><divclass="line">}</div></div><!-- fragment --><p>After the contract is published it initially allocates all of the currency to the <code>currency</code> account. So lets transfer some of it to our tester.</p>
<divclass="fragment"><divclass="line">$ ./eosc push message <aclass="code"href="namespacecurrency.html">currency</a> transfer <spanclass="stringliteral">'{"from":"currency","to":"tester","quantity":50}'</span> -s <aclass="code"href="namespacecurrency.html">currency</a> -s tester -p active@<aclass="code"href="namespacecurrency.html">currency</a></div><divclass="line">1589302ms thread-0 main.cpp:271 operator() ] Converting argument to binary...</div><divclass="line">1589304ms thread-0 main.cpp:290 operator() ] Transaction result:</div><divclass="line">{</div><divclass="line"><spanclass="stringliteral">"transaction_id"</span>: <spanclass="stringliteral">"1c4911c0b277566dce4217edbbca0f688f7bdef761ed445ff31b31f286720057"</span>,</div><divclass="line"><spanclass="stringliteral">"processed"</span>: {</div><divclass="line"><spanclass="stringliteral">"refBlockNum"</span>: 1173,</div><divclass="line"><spanclass="stringliteral">"refBlockPrefix"</span>: 2184027244,</div><divclass="line"><spanclass="stringliteral">"expiration"</span>: <spanclass="stringliteral">"2017-08-24T18:28:07"</span>,</div><divclass="line"><spanclass="stringliteral">"scope"</span>: [</div><divclass="line"><spanclass="stringliteral">"currency"</span>,</div><divclass="line"><spanclass="stringliteral">"tester"</span></div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"signatures"</span>: [],</div><divclass="line"><spanclass="stringliteral">"messages"</span>: [{</div><divclass="line"><spanclass="stringliteral">"code"</span>: <spanclass="stringliteral">"currency"</span>,</div><divclass="line"><spanclass="stringliteral">"type"</span>: <spanclass="stringliteral">"transfer"</span>,</div><divclass="line"><spanclass="stringliteral">"authorization"</span>: [{</div><divclass="line"><spanclass="stringliteral">"account"</span>: <spanclass="stringliteral">"currency"</span>,</div><divclass="line"><spanclass="stringliteral">"permission"</span>: <spanclass="stringliteral">"active"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"data"</span>: {</div><divclass="line"><spanclass="stringliteral">"from"</span>: <spanclass="stringliteral">"currency"</span>,</div><divclass="line"><spanclass="stringliteral">"to"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"quantity"</span>: 50</div><divclass="line"> },</div><divclass="line"><spanclass="stringliteral">"hex_data"</span>: <spanclass="stringliteral">"00000079b822651d00000000c84267a13200000000000000"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"output"</span>: [{</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"output"</span>: {</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> ]</div><divclass="line"> }</div><divclass="line">}</div></div><!-- fragment --><p>eosc contains documentation for all of its commands. For a list of all commands known to eosc, simply run it with no arguments: </p><divclass="fragment"><divclass="line">$ ./eosc</div><divclass="line">ERROR: RequiredError: Subcommand required</div><divclass="line">Command Line Interface to Eos Daemon</div><divclass="line">Usage: ./eosc [OPTIONS] SUBCOMMAND</div><divclass="line"></div><divclass="line">Options:</div><divclass="line"> -h,--help Print <spanclass="keyword">this</span> help message and exit</div><divclass="line"></div><divclass="line">Subcommands:</div><divclass="line"> create Create various items, on and off the blockchain</div><divclass="line"><spanclass="keyword">get</span> Retrieve various items and information from the blockchain</div><divclass="line"> contract Create or update the contract on an account</div><divclass="line"> transfer Transfer EOS from account to account</div><divclass="line"> push Push arbitrary data to the blockchain</div></div><!-- fragment --><p> To get help with any particular subcommand, run it with no arguments as well: </p><divclass="fragment"><divclass="line">$ ./eosc create</div><divclass="line">ERROR: RequiredError: Subcommand required</div><divclass="line">Create various items, on and off the blockchain</div><divclass="line">Usage: ./eosc create SUBCOMMAND</div><divclass="line"></div><divclass="line">Subcommands:</div><divclass="line"> key Create a <spanclass="keyword">new</span> keypair and <aclass="code"href="namespaceeos.html#a1df73defa04d39763089df7faa35a934">print</a> the <spanclass="keyword">public</span> and <spanclass="keyword">private</span> keys</div><divclass="line"> account Create a <spanclass="keyword">new</span> account on the blockchain</div><divclass="line">$ ./eosc create account</div><divclass="line">ERROR: RequiredError: creator</div><divclass="line">Create a <spanclass="keyword">new</span> account on the blockchain</div><divclass="line">Usage: ./eosc create account creator name OwnerKey ActiveKey</div><divclass="line"></div><divclass="line">Positionals:</div><divclass="line"> creator TEXT The name of the account creating the <spanclass="keyword">new</span> account</div><divclass="line"> name TEXT The name of the <spanclass="keyword">new</span> account</div><divclass="line"> OwnerKey TEXT The owner <spanclass="keyword">public</span> key <spanclass="keywordflow">for</span> the account</div><divclass="line"> ActiveKey TEXT The active <spanclass="keyword">public</span> key <spanclass="keywordflow">for</span> the account</div></div><!-- fragment --><dlclass="section note"><dt>Note</dt><dd>at this time the blockchain is not validating signatures so anyone can do anything provided if they simply declare the proper authority. In the future the declared authorities will direct the wallet on which keys to use to sign the transaction. Also future revisions of this API may automatically detect <code>scope</code> and <code>authorization</code> via a trial run of the contract.</dd></dl>
<p>Now we can transfer it from <code>tester</code> to <code>inita</code> and require the permission of <code>tester</code>. This should drain the balance of <code>tester</code> to 0.</p>
<divclass="fragment"><divclass="line">$ ./eosc push message <aclass="code"href="namespacecurrency.html">currency</a> transfer <spanclass="stringliteral">'{"from":"tester","to":"inita","quantity":50}'</span> -s inita -s tester -p tester@active</div><divclass="line">3116153ms thread-0 main.cpp:271 operator() ] Converting argument to binary...</div><divclass="line">3116154ms thread-0 main.cpp:290 operator() ] Transaction result:</div><divclass="line">{</div><divclass="line"><spanclass="stringliteral">"transaction_id"</span>: <spanclass="stringliteral">"56b9f0f3b9f43254af446c5dca02a6fcb24ebcdb506d7248947fd4d52a27972a"</span>,</div><divclass="line"><spanclass="stringliteral">"processed"</span>: {</div><divclass="line"><spanclass="stringliteral">"refBlockNum"</span>: 2882,</div><divclass="line"><spanclass="stringliteral">"refBlockPrefix"</span>: 1880685856,</div><divclass="line"><spanclass="stringliteral">"expiration"</span>: <spanclass="stringliteral">"2017-08-24T19:53:34"</span>,</div><divclass="line"><spanclass="stringliteral">"scope"</span>: [</div><divclass="line"><spanclass="stringliteral">"inita"</span>,</div><divclass="line"><spanclass="stringliteral">"tester"</span></div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"signatures"</span>: [],</div><divclass="line"><spanclass="stringliteral">"messages"</span>: [{</div><divclass="line"><spanclass="stringliteral">"code"</span>: <spanclass="stringliteral">"currency"</span>,</div><divclass="line"><spanclass="stringliteral">"type"</span>: <spanclass="stringliteral">"transfer"</span>,</div><divclass="line"><spanclass="stringliteral">"authorization"</span>: [{</div><divclass="line"><spanclass="stringliteral">"account"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"permission"</span>: <spanclass="stringliteral">"active"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"data"</span>: {</div><divclass="line"><spanclass="stringliteral">"from"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"to"</span>: <spanclass="stringliteral">"inita"</span>,</div><divclass="line"><spanclass="stringliteral">"quantity"</span>: 50</div><divclass="line"> },</div><divclass="line"><spanclass="stringliteral">"hex_data"</span>: <spanclass="stringliteral">"00000000c84267a1000000008040934b3200000000000000"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"output"</span>: [{</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"inita"</span>,</div><divclass="line"><spanclass="stringliteral">"output"</span>: {</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> },{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"output"</span>: {</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> ]</div><divclass="line"> }</div><divclass="line">}</div></div><!-- fragment --><p>Now that <code>tester</code> has a balance of 0, if we attempt this transfer a second time it should fail:</p>
<p>The first step is to create an account for currency. We will have the <code>inita</code> account create the <code>currency</code> account. Ensure you have inita private key imported.</p>
<divclass="fragment"><divclass="line">$ ./eosc create account inita <aclass="code"href="namespacecurrency.html">currency</a> EOS4toFS3YXEQCkuuw1aqDLrtHim86Gz9u3hBdcBw5KNPZcursVHq EOS7d9A3uLe6As66jzN8j44TXJUqJSK3bFjjEEqR4oTvNAB3iM9SA</div></div><!-- fragment --><p>The next step is to publish the contract (.wast) and its abi (.abi).</p>
<p>We will need currency active key in our wallet for this </p><divclass="fragment"><divclass="line">$ ./eosc <spanclass="keyword">import</span> 5Hv22aPcjnENBv6X9o9nKGdkfrW44En6z4zJUt2PobAvbQXrT9z</div><divclass="line">imported <spanclass="keyword">private</span> key <spanclass="keywordflow">for</span>: EOS7d9A3uLe6As66jzN8j44TXJUqJSK3bFjjEEqR4oTvNAB3iM9SA</div></div><!-- fragment --><p> Then proceed with setting the code</p>
<p>After the contract is published it initially allocates all of the currency to the <code>currency</code> account. So lets transfer some of it to our tester.</p>
<p>We can query the blockchain for the .abi of the contract, on which we can check the list of available actions and their respective message structure </p><divclass="fragment"><divclass="line">$ ./eosc <spanclass="keyword">get</span> code --a <aclass="code"href="namespacecurrency.html">currency</a>.abi <aclass="code"href="namespacecurrency.html">currency</a></div><divclass="line">code hash: 9b9db1a7940503a88535517049e64467a6e8f4e9e03af15e9968ec89dd794975</div><divclass="line">saving abi to <aclass="code"href="namespacecurrency.html">currency</a>.abi</div><divclass="line">$ cat <aclass="code"href="namespacecurrency.html">currency</a>.abi</div><divclass="line">{</div><divclass="line"><spanclass="stringliteral">"types"</span>: [{</div><divclass="line"><spanclass="stringliteral">"newTypeName"</span>: <spanclass="stringliteral">"AccountName"</span>,</div><divclass="line"><spanclass="stringliteral">"type"</span>: <spanclass="stringliteral">"Name"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"structs"</span>: [{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"transfer"</span>,</div><divclass="line"><spanclass="stringliteral">"base"</span>: <spanclass="stringliteral">""</span>,</div><divclass="line"><spanclass="stringliteral">"fields"</span>: {</div><divclass="line"><spanclass="stringliteral">"from"</span>: <spanclass="stringliteral">"AccountName"</span>,</div><divclass="line"><spanclass="stringliteral">"to"</span>: <spanclass="stringliteral">"AccountName"</span>,</div><divclass="line"><spanclass="stringliteral">"amount"</span>: <spanclass="stringliteral">"UInt64"</span></div><divclass="line"> }</div><divclass="line"> },{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"account"</span>,</div><divclass="line"><spanclass="stringliteral">"base"</span>: <spanclass="stringliteral">""</span>,</div><divclass="line"><spanclass="stringliteral">"fields"</span>: {</div><divclass="line"><spanclass="stringliteral">"account"</span>: <spanclass="stringliteral">"Name"</span>,</div><divclass="line"><spanclass="stringliteral">"balance"</span>: <spanclass="stringliteral">"UInt64"</span></div><divclass="line"> }</div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"actions"</span>: [{</div><divclass="line"><spanclass="stringliteral">"action"</span>: <spanclass="stringliteral">"transfer"</span>,</div><divclass="line"><spanclass="stringliteral">"type"</span>: <spanclass="stringliteral">"transfer"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"tables"</span>: [{</div><divclass="line"><spanclass="stringliteral">"table"</span>: <spanclass="stringliteral">"account"</span>,</div><divclass="line"><spanclass="stringliteral">"indextype"</span>: <spanclass="stringliteral">"i64"</span>,</div><divclass="line"><spanclass="stringliteral">"keynames"</span>: [</div><divclass="line"><spanclass="stringliteral">"account"</span></div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"keytype"</span>: [],</div><divclass="line"><spanclass="stringliteral">"type"</span>: <spanclass="stringliteral">"account"</span></div><divclass="line"> }</div><divclass="line"> ]</div><divclass="line">}</div></div><!-- fragment --><p>From the above abi, we can see that <code>currency</code> contract accepts an action called <code>transfer</code> that accepts message with fields <code>from</code>, <code>to</code>, and <code>amount</code>.</p>
<divclass="fragment"><divclass="line">$ ./eosc push message <aclass="code"href="namespacecurrency.html">currency</a> transfer <spanclass="stringliteral">'{"from":"currency","to":"tester","amount":50}'</span> -S <aclass="code"href="namespacecurrency.html">currency</a> -S tester -p <aclass="code"href="namespacecurrency.html">currency</a>@active</div><divclass="line">1589302ms thread-0 main.cpp:271 operator() ] Converting argument to binary...</div><divclass="line">1589304ms thread-0 main.cpp:290 operator() ] Transaction result:</div><divclass="line">{</div><divclass="line"><spanclass="stringliteral">"transaction_id"</span>: <spanclass="stringliteral">"1c4911c0b277566dce4217edbbca0f688f7bdef761ed445ff31b31f286720057"</span>,</div><divclass="line"><spanclass="stringliteral">"processed"</span>: {</div><divclass="line"><spanclass="stringliteral">"refBlockNum"</span>: 1173,</div><divclass="line"><spanclass="stringliteral">"refBlockPrefix"</span>: 2184027244,</div><divclass="line"><spanclass="stringliteral">"expiration"</span>: <spanclass="stringliteral">"2017-08-24T18:28:07"</span>,</div><divclass="line"><spanclass="stringliteral">"scope"</span>: [</div><divclass="line"><spanclass="stringliteral">"currency"</span>,</div><divclass="line"><spanclass="stringliteral">"tester"</span></div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"signatures"</span>: [],</div><divclass="line"><spanclass="stringliteral">"messages"</span>: [{</div><divclass="line"><spanclass="stringliteral">"code"</span>: <spanclass="stringliteral">"currency"</span>,</div><divclass="line"><spanclass="stringliteral">"type"</span>: <spanclass="stringliteral">"transfer"</span>,</div><divclass="line"><spanclass="stringliteral">"authorization"</span>: [{</div><divclass="line"><spanclass="stringliteral">"account"</span>: <spanclass="stringliteral">"currency"</span>,</div><divclass="line"><spanclass="stringliteral">"permission"</span>: <spanclass="stringliteral">"active"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"data"</span>: {</div><divclass="line"><spanclass="stringliteral">"from"</span>: <spanclass="stringliteral">"currency"</span>,</div><divclass="line"><spanclass="stringliteral">"to"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"quantity"</span>: 50</div><divclass="line"> },</div><divclass="line"><spanclass="stringliteral">"hex_data"</span>: <spanclass="stringliteral">"00000079b822651d00000000c84267a13200000000000000"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"output"</span>: [{</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"output"</span>: {</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> ]</div><divclass="line"> }</div><divclass="line">}</div></div><!-- fragment --><p>Now we can transfer it from <code>tester</code> to <code>inita</code> and require the permission of <code>tester</code>. This should drain the balance of <code>tester</code> to 0.</p>
<divclass="fragment"><divclass="line">$ ./eosc push message <aclass="code"href="namespacecurrency.html">currency</a> transfer <spanclass="stringliteral">'{"from":"tester","to":"inita","amount":50}'</span> -S inita -S tester -p tester@active</div><divclass="line">3116153ms thread-0 main.cpp:271 operator() ] Converting argument to binary...</div><divclass="line">3116154ms thread-0 main.cpp:290 operator() ] Transaction result:</div><divclass="line">{</div><divclass="line"><spanclass="stringliteral">"transaction_id"</span>: <spanclass="stringliteral">"56b9f0f3b9f43254af446c5dca02a6fcb24ebcdb506d7248947fd4d52a27972a"</span>,</div><divclass="line"><spanclass="stringliteral">"processed"</span>: {</div><divclass="line"><spanclass="stringliteral">"refBlockNum"</span>: 2882,</div><divclass="line"><spanclass="stringliteral">"refBlockPrefix"</span>: 1880685856,</div><divclass="line"><spanclass="stringliteral">"expiration"</span>: <spanclass="stringliteral">"2017-08-24T19:53:34"</span>,</div><divclass="line"><spanclass="stringliteral">"scope"</span>: [</div><divclass="line"><spanclass="stringliteral">"inita"</span>,</div><divclass="line"><spanclass="stringliteral">"tester"</span></div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"signatures"</span>: [],</div><divclass="line"><spanclass="stringliteral">"messages"</span>: [{</div><divclass="line"><spanclass="stringliteral">"code"</span>: <spanclass="stringliteral">"currency"</span>,</div><divclass="line"><spanclass="stringliteral">"type"</span>: <spanclass="stringliteral">"transfer"</span>,</div><divclass="line"><spanclass="stringliteral">"authorization"</span>: [{</div><divclass="line"><spanclass="stringliteral">"account"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"permission"</span>: <spanclass="stringliteral">"active"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"data"</span>: {</div><divclass="line"><spanclass="stringliteral">"from"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"to"</span>: <spanclass="stringliteral">"inita"</span>,</div><divclass="line"><spanclass="stringliteral">"quantity"</span>: 50</div><divclass="line"> },</div><divclass="line"><spanclass="stringliteral">"hex_data"</span>: <spanclass="stringliteral">"00000000c84267a1000000008040934b3200000000000000"</span></div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"output"</span>: [{</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"inita"</span>,</div><divclass="line"><spanclass="stringliteral">"output"</span>: {</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> },{</div><divclass="line"><spanclass="stringliteral">"name"</span>: <spanclass="stringliteral">"tester"</span>,</div><divclass="line"><spanclass="stringliteral">"output"</span>: {</div><divclass="line"><spanclass="stringliteral">"notify"</span>: [],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> }</div><divclass="line"> ],</div><divclass="line"><spanclass="stringliteral">"sync_transactions"</span>: [],</div><divclass="line"><spanclass="stringliteral">"async_transactions"</span>: []</div><divclass="line"> }</div><divclass="line"> ]</div><divclass="line"> }</div><divclass="line">}</div></div><!-- fragment --><p>Now that <code>tester</code> has a balance of 0, if we attempt this transfer a second time it should fail:</p>
<p>After doing the transfer action on <code>currency</code> contract, we can verify the amount of token held by each account by looking at <code>currency</code>'s <code>account</code> table.</p>
<p>This table is stored on the scope of each account instead of on <code>currency</code> scope.</p>
<p>By default, <code>eosc</code> will connect to <code>eosd</code> running on localhost port 8888. You can connect to another <code>eosd</code> node by specifying its host and port. </p><divclass="fragment"><divclass="line">./eosc -H localhost -p 8889</div></div><!-- fragment --><h1><aclass="anchor"id="separatewallet"></a>
Using Separate Wallet App</h1>
<p>Instead of using the wallet functionality built-in to <code>eosd</code>, you can also use a separate wallet app which can be found inside programs/eos-walletd. By default, port 8888 is used by <code>eosd</code>, so choose another port for the wallet app. </p><divclass="fragment"><divclass="line">./<aclass="code"href="namespaceeos.html">eos</a>-walletd --http-server-endpoint 127.0.0.1:8887</div></div><!-- fragment --><p> Then for any operation that requires signing, use the –wallet-host and –wallet-port option </p><divclass="fragment"><divclass="line">./eosc --wallet-host 127.0.0.1 --wallet-port 8887 <COMMAND><SUBCOMMAND><PARAMS></div></div><!-- fragment --><h1><aclass="anchor"id="skippingsignature"></a>
Skipping Signatures</h1>
<p>As an easy way for developers to test functionality without dealing with keys, <code>eosd</code> can be run so that Transaction signatures are not required. </p><divclass="fragment"><divclass="line">./eosd --skip-transaction-signatures</div></div><!-- fragment --><p> And then for any operation that requires signing, use the <code>-s</code> option </p><divclass="fragment"><divclass="line">./eosc <COMMAND><SUBCOMMAND> -s <PARAMS></div></div><!-- fragment --><h1><aclass="anchor"id="additionaldoc"></a>
Additional Documentation</h1>
<p>eosc contains documentation for all of its commands. For a list of all commands known to eosc, simply run it with no arguments: </p><divclass="fragment"><divclass="line">$ ./eosc</div><divclass="line">ERROR: RequiredError: Subcommand required</div><divclass="line">Command Line Interface to Eos Daemon</div><divclass="line">Usage: ./eosc [OPTIONS] SUBCOMMAND</div><divclass="line"></div><divclass="line">Options:</div><divclass="line"> -h,--help Print <spanclass="keyword">this</span> help message and exit</div><divclass="line"> -H,--host TEXT=localhost the host where eosd is running</div><divclass="line"> -p,--port UINT=8888 the port where eosd is running</div><divclass="line"> --wallet-host TEXT=localhost</div><divclass="line"> the host where <aclass="code"href="namespaceeos.html">eos</a>-walletd is running</div><divclass="line"> --wallet-port UINT=8888 the port where <aclass="code"href="namespaceeos.html">eos</a>-walletd is running</div><divclass="line"></div><divclass="line">Subcommands:</div><divclass="line"> create Create various items, on and off the blockchain</div><divclass="line"><spanclass="keyword">get</span> Retrieve various items and information from the blockchain</div><divclass="line"><spanclass="keyword">set</span> Set or update blockchain state</div><divclass="line"> transfer Transfer EOS from account to account</div><divclass="line"> wallet Interact with local wallet</div><divclass="line"> benchmark Configure and execute benchmarks</div><divclass="line"> push Push arbitrary transactions to the blockchain</div></div><!-- fragment --><p> To get help with any particular subcommand, run it with no arguments as well: </p><divclass="fragment"><divclass="line">$ ./eosc create</div><divclass="line">ERROR: RequiredError: Subcommand required</div><divclass="line">Create various items, on and off the blockchain</div><divclass="line">Usage: ./eosc create SUBCOMMAND</div><divclass="line"></div><divclass="line">Subcommands:</div><divclass="line"> key Create a <spanclass="keyword">new</span> keypair and <aclass="code"href="namespaceeos.html#a1df73defa04d39763089df7faa35a934">print</a> the <spanclass="keyword">public</span> and <spanclass="keyword">private</span> keys</div><divclass="line"> account Create a <spanclass="keyword">new</span> account on the blockchain</div><divclass="line">$ ./eosc create account</div><divclass="line">ERROR: RequiredError: creator</div><divclass="line">Create a <spanclass="keyword">new</span> account on the blockchain</div><divclass="line">Usage: ./eosc create account creator name OwnerKey ActiveKey</div><divclass="line"></div><divclass="line">Positionals:</div><divclass="line"> creator TEXT The name of the account creating the <spanclass="keyword">new</span> account</div><divclass="line"> name TEXT The name of the <spanclass="keyword">new</span> account</div><divclass="line"> OwnerKey TEXT The owner <spanclass="keyword">public</span> key <spanclass="keywordflow">for</span> the account</div><divclass="line"> ActiveKey TEXT The active <spanclass="keyword">public</span> key <spanclass="keywordflow">for</span> the account</div></div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hrclass="footer"/><addressclass="footer"><small>
Generated by  <ahref="http://www.doxygen.org/index.html">
("enable-stale-production",boost::program_options::bool_switch()->notifier([this](boole){my->_production_enabled=e;}),"Enable block production, even if the chain is stale.")
("required-participation",boost::program_options::bool_switch()->notifier([this](inte){my->_required_producer_participation=uint32_t(e*config::Percent1);}),"Percent of producers (0-99) that must be participating in order to produce blocks")
To date, all work done to experiment with the EOS blockchain has been performed using a single instance of eosd hosting all 21 block producers. While this is a perfectly valid solution for validating features of the blockchain, developing new contracts, or whatever, it does not scale. Nor does it expose the sort of issues raised when contract and block data must be shared across multiple instances. Providing the ability to scale involves deploying multiple eosd nodes across many hosts and lining then into a peer-to-peer (p2p) network. Composing this network involves tailoring and distributing configuration files, coordinating starts and stops and other tasks.
Doing this manually is a tedious task and easily error prone. Fortunately a solution is provided, in the form of the Launcher application, described below.
...
...
@@ -33,26 +33,26 @@ Network topology or "shape" describes how the nodes are connected in order to sh
The Launcher has definitions of three different network "shapes" based on inter-nodal connections, which can be selected by a command line option, or you can supply your own network topology by editing the Launcher generated configuration file.
####Ring network
####Ring network
![](ring.png"Ring Diagram")
This is the simplest network, where each node identifies just the node next to it as it's only peer.
####Star network
####Star network
![](star.png"Star Diagram")
A "star" is intended to support the use larger number nodes in the testnet. In this case the number of peers connected to a node and the distribution of those nodes varies based on the number of nodes in the network.
A "star" is intended to support a larger number of nodes in the testnet. In this case the number of peers connected to a node and the distribution of those nodes varies based on the number of nodes in the network.
####Mesh network
####Mesh network
![](mesh.png"Mesh Diagram")
In a "mesh" network, each node is connected to as many peer nodes as possible.
#The Launcher Application
#The Launcher Application
To address the complexity implied by distributing multiple eosd nodes across a LAN or a wider network, the launcher application was created.
Based on a handful of command line arguments the Launcher is able to compose per-node configuration files, distribute these files securely amongst the peer hosts, then start up the multiple instances of eosd.
Eosd instances started this way have their output logged in individual text files. Finally the launcher application is also able to shut down some or all of the test network.
##Running the Launcher application
##Running the Launcher application
The launcher program is used to configure and deploy producing and non-producing eosd nodes that talk to each other using configured routes. The configuration for each node is stored in separate directories, permitting multiple nodes to be active on the same host, assuming the machine has sufficient memory and disk space for multiple eosd instances. The launcher makes use of multiple configuration sources in order to deploy a testnet. A handful of command line arguments can be used to set up simple local networks.
...
...
@@ -145,7 +145,7 @@ The ssh helper fields are paths to ssh and scp, an identity if necessary, and an
The rest of the testnet.json file is the collection of node descriptors. The fragment shown above was created with the command line `programs/launcher/launcher -p6 -s mesh -o testnet.json` and then edited to refer to a remote host named "remoteserv."
###Elements Of The JSON File
###Elements Of The JSON File
This table describes all of the key/value pairs used in the testnet.json file.
|Value | Description
...
...
@@ -177,7 +177,7 @@ keys | specify the authentication tokens for this node.
peers | this list indicates the other nodes in the network to which this one actively connects. Since this file may be edited to alter the hostname, public name, or p2p port values, the peers list here holds aliases for the actual endpoints eventually written to the individual config.ini files.
producers | this list identifies which of the producers from the genesis.json file are held by this node. Note that the launcher uses a round-robin algorithm to spread the producer instances across the producing nodes.
###Provisioning Distributed Servers
###Provisioning Distributed Servers
The ssh_helper section of the testnet.json file contains the ssh elements necessary to connect and issue commands to other servers. In addition to the ssh_helper section which provides access to global configuration settings, the per-node configuration may provide overriding identity and connection arguments.
It is also necessary to provision the server by at least copying the eosd executable, and the genesis.json files to their appropriate locations relative to some named EOS root directory. For example, I defined the EOS root to be `/home/phil/blockchain/eos`. When run, the launcher will run through a variety of shell commands using ssh and finally using scp to copy a config.ini file to the appropriate data directory on the remote.
...
...
@@ -196,7 +196,7 @@ The launcher app creates a separate date and configuration directory for each no
A file called "last_run.json" contains hints for a later instance of the launcher to be able to kill local and remote nodes when run with -k.
#What Remains To Be Done
#What Remains To Be Done
Functionality that remains to be implemented: caching signed transactions then purging them on a schedule. Sending summaries of blocks rather than whole blocks. Optimizing the routing between nodes. Failover during new node synchronization if a peer fails to respond timely enough