モッピー!ポイ活応援ポイントサイト
未分類

AKASH上にsolanaのノード立てようとしたけど要件が足りなくて断念

この記事では、AkashnetにSolanaノードをデプロイする方法について説明します。
展開に必要なすべての手順を最初から利用できるようにしながら、短くするようにします。

これは本番のSolanaノードのデプロイメントではなく、この記事の最後に見られる理由による開発のデプロイメントであることを指摘する必要があります。

Ubuntu 20.04.2 LTS Linuxディストリビューションと次のソフトウェアを使用しました
– akash 🙁 Akashnetでv0.12.1動作するため)。
ソラナv1.6.10(Akashnetに展開します)。

ubuntu 20.04.2.LTS Linuxディストリビューションとは?

Linuxのubuntuバージョンということ。OS。

■Ubuntu

Debianをベースに作られた
世界的な人気を持つディストリビューションです。

使いやすいデスクトップで
初心者にも抵抗なく使えるのが特徴ですが、

Debianと同じく
多くの企業のシステムにも使われています。

素敵なあなたの新しい友達:
– Akashnetは将来の分散型クラウドです。
ソラナは、世界中のビルダーは、スケールの今日という暗号のアプリを作成する支援blockchain高性能です。

アイデアは単純です。SolanaコンテナをデプロイするためにAkashnetデクラウドを活用します。Amazon AWSよりもAkashnetでインスタンスを実行する方が

最大86%安価ですhttps://akashlytics.com/price-compare(この記事を書いた時点で)わかりました

solanaコンテナとは?

solanaのコンテナ。solanaを動かせるライブラリが入った環境。

これをAkashクラウド(インフラ)の上に立てたい

、私はあまり話すのが苦手なので、あなたと私の時間を節約するために、CLIに直接ジャンプしましょう。

1.akashクライアントをインストールします

AKASH_NET="https://raw.githubusercontent.com/ovrclk/net/master/mainnet"
AKASH_VERSION="$(curl -s "$AKASH_NET/version.txt")"
curl https://raw.githubusercontent.com/ovrclk/akash/master/godownloader.sh | sh -s -- "v$AKASH_VERSION"

jqこの記事で使用するツールもインストールしてください。

 

2.akashウォレットを作成します

akash keys add default

このコマンドは、意志の出力ニーモニックフレーズは、確認して安全な場所に保存します。
また、あなたの住所も出力されますakash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h。私の場合、住所はでした。

export AKASH_ACCOUNT_ADDRESS=akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h

Akashウォレットの詳細https://docs.akash.network/guides/wallet

3.akashウォレットに資金を提供します

開始するには、10 AKT(Akashトークン)について必要になります。
ここに記載されている取引所の1つで購入できますhttps://akash.network/token/

ウォレットの残高を照会できます

export AKASH_NET="https://raw.githubusercontent.com/ovrclk/net/master/mainnet"
export AKASH_NODE="$(curl -s "$AKASH_NET/rpc-nodes.txt" | shuf -n 1)"

akash \
  --node "$AKASH_NODE" \
  query bank balances "$AKASH_ACCOUNT_ADDRESS"

金種:1 akt = 1000000 uakt(akt * 10 ^ 6)、または-o json | jq -r '(.balances[0].amount | tonumber / pow(10; 6))'コマンドラインで追加できます;-)

プロダクションakashnet-2Akashネットワークを使用しています。さまざまなAkashネットワークの詳細については、https: //docs.akash.network/guides/versionを参照してください。

4.証明書ファイルを作成します

デプロイメントを作成するには、最初に証明書を作成する必要があります。これを行うには、次を実行します。

export AKASH_CHAIN_ID="$(curl -s "$AKASH_NET/chain-id.txt")"
akash tx cert create client \
  --from default \
  --chain-id $AKASH_CHAIN_ID \
  --node $AKASH_NODE \
  --gas-prices="0.025uakt" --gas="auto" --gas-adjustment=1.15

証明書はアカウントごとに1回だけ作成する必要があり、すべての展開で使用できます。証明書の詳細https://docs.akash.network/design/mtls

5.デプロイメントマニフェストファイルを準備します

solana.yml次の内容で名前を付けたファイルを作成します。

---
version: "2.0"

services:
  solana:
    image: solanalabs/solana:v1.6.10
    expose:
      - port: 8899
        as: 8899
        proto: tcp
        to:
          - global: true

profiles:
  compute:
    solana:
      resources:
        cpu:
          units: 0.1
        memory:
          size: 512Mi
        storage:
          size: 512Mi
  placement:
    akash:
      attributes:
        host: akash
      signedBy:
        anyOf:
          - "akash1365yvmc4s7awdyj3n2sav7xfx76adc6dnmlx63"
      pricing:
        solana: 
          denom: uakt
          amount: 10

deployment:
  solana:
    akash:
      profile: solana
      count: 1

価格設定-複数の異なるプロバイダーからの入札があることに注意してください。この場合、両方のプロバイダーがたまたま1uAKTの価格を受け入れる用意があります。これは、コンテナを実行するためにブロックごとに1uAKTまたは0.000001AKTを使用してリースを作成できることを意味します。
価格設定は制限を設定するため、プロバイダーは展開に入札する方法を知ることができます。つまり、ブロックごとのuaktの量(各ブロックは6秒ごとに発生します)を支払う用意があります。
したがって、1uaktの場合、月額= $ 3.28相当の1aktを支払うことになります。((1*((60/6)*60*24*30.436875))/10^6)*3.28$1.4431 May 2021

signedByakash1365yvmc4s7awdyj3n2sav7xfx76adc6dnmlx63ドキュメントのようにする必要がありますhttps://docs.akash.network/guides/deploy
signedByは「検証」です。プロバイダーがakashによって承認された後、セキュリティと信頼性を確保するためにakashによって署名されます。

Akashマニフェストの作成に使用されるSDL(スタック定義言語)の詳細https://docs.akash.network/documentation/sdl

6.デプロイメントを作成します

akash tx deployment create solana.yml \
  --from default \
  --node $AKASH_NODE \
  --chain-id $AKASH_CHAIN_ID \
  --gas-prices="0.025uakt" --gas="auto" --gas-adjustment=1.15

このコマンドが問題Error: RPC error -32603 - Internal error: timed out waiting for tx to be included in a blockなく終了する場合は、展開IDを見つけるためにakashブロックチェーンにクエリを実行できます。

$ akash query txs \
  --events "message.sender=$AKASH_ACCOUNT_ADDRESS&message.action=create-deployment" \
  --page 1 --limit 999999 \
  | jq -r '.txs[] | [ .tx.body.messages[].id[] ] | @csv' | \
  tail -5
"akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h","1172777"

デプロイメントを照会します。

メッセージの実行に失敗するのを避けるために、次の3つの「SEQ」変数を明示的に「エクスポート」していません。メッセージインデックス:0:後で「akashtxdeploymentcreate」で「Deploymentclosed」エラーが発生しました。このエラーが発生した場合は、単にunset AKASH_DSEQ

$ AKASH_DSEQ=1172777
$ AKASH_GSEQ=1
$ AKASH_OSEQ=1

$ akash query deployment get \
  --owner $AKASH_ACCOUNT_ADDRESS \
  --node $AKASH_NODE \
  --dseq $AKASH_DSEQ

deployment:
  created_at: "1172779"
  deployment_id:
    dseq: "1172777"
    owner: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h
  state: active
  version: R+bMsK3+N7Wtf8MWmUqoIJTgagXPunxFJqV4EXZahYE=
escrow_account:
  balance:
    amount: "5000000"
    denom: uakt
  id:
    scope: deployment
    xid: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h/1172777
  owner: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h
  settled_at: "1172791"
  state: open
  transferred:
    amount: "0"
    denom: uakt
groups:
- created_at: "1172779"
  group_id:
    dseq: "1172777"
    gseq: 1
    owner: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h
  group_spec:
    name: akash
    requirements:
      attributes:
      - key: host
        value: akash
      signed_by:
        all_of: []
        any_of:
        - akash1365yvmc4s7awdyj3n2sav7xfx76adc6dnmlx63
    resources:
    - count: 1
      price:
        amount: "10"
        denom: uakt
      resources:
        cpu:
          attributes: []
          units:
            val: "100"
        endpoints:
        - kind: RANDOM_PORT
        memory:
          attributes: []
          quantity:
            val: "536870912"
        storage:
          attributes: []
          quantity:
            val: "536870912"
  state: open

お気づきかもしれませんが、5 AKTは現在、の下にescrow_accountあり、akashウォレットの残高はその値だけ減少しています。これらのトークンは、リースを作成するとすぐにこのデプロイメントで使用されます。そして、それらは、リース/デプロイメントを閉じるとすぐに返されます(リース自体に使用されたものを除いたもの)。

展開の詳細https://docs.akash.network/guides/deploy

7.入札について市場に問い合わせる

実際にデプロイメントを実行したいので、市場が提供するものを確認し、快適な入札を受け入れ、リースを作成し、デプロイメントのマニフェストを送信して、デプロイメントを稼働させる必要があります。

$ akash query market bid list \
  --owner=$AKASH_ACCOUNT_ADDRESS \
  --node $AKASH_NODE \
  --dseq $AKASH_DSEQ \
  --state open

bids:
- bid:
    bid_id:
      dseq: "1172777"
      gseq: 1
      oseq: 1
      owner: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h
      provider: akash10cl5rm0cqnpj45knzakpa4cnvn5amzwp4lhcal
    created_at: "1172780"
    price:
      amount: "1"
      denom: uakt
    state: open
  escrow_account:
    balance:
      amount: "50000000"
      denom: uakt
    id:
      scope: bid
      xid: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h/1172777/1/1/akash10cl5rm0cqnpj45knzakpa4cnvn5amzwp4lhcal
    owner: akash10cl5rm0cqnpj45knzakpa4cnvn5amzwp4lhcal
    settled_at: "1172780"
    state: open
    transferred:
      amount: "0"
      denom: uakt
- bid:
    bid_id:
      dseq: "1172777"
      gseq: 1
      oseq: 1
      owner: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h
      provider: akash1f6gmtjpx4r8qda9nxjwq26fp5mcjyqmaq5m6j7
    created_at: "1172780"
    price:
      amount: "1"
      denom: uakt
    state: open
  escrow_account:
    balance:
      amount: "50000000"
      denom: uakt
    id:
      scope: bid
      xid: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h/1172777/1/1/akash1f6gmtjpx4r8qda9nxjwq26fp5mcjyqmaq5m6j7
    owner: akash1f6gmtjpx4r8qda9nxjwq26fp5mcjyqmaq5m6j7
    settled_at: "1172780"
    state: open
    transferred:
      amount: "0"
      denom: uakt
pagination:
  next_key: null
  total: "0"

AKASH_PROVIDER環境変数を、利用可能な市場入札から選択したものに設定します。

AKASH_PROVIDER=akash10cl5rm0cqnpj45knzakpa4cnvn5amzwp4lhcal

akash query market bid list入札が表示されていない場合は、unset AKASH_PROVIDER環境変数を確認してください。

8.リースを作成/入札を受け入れる

次のコマンドを実行して、上記で選択したプロバイダーからの入札のリースを作成します。

akash tx market lease create \
  --chain-id $AKASH_CHAIN_ID \
  --node $AKASH_NODE \
  --owner $AKASH_ACCOUNT_ADDRESS \
  --dseq $AKASH_DSEQ \
  --gseq $AKASH_GSEQ \
  --oseq $AKASH_OSEQ \
  --provider $AKASH_PROVIDER \
  --from default \
  --gas-prices="0.025uakt" --gas="auto" --gas-adjustment=1.15

次の手順でマニフェストをアップロードして展開プロセスを完了していなくても、リースが作成されると、プロバイダーは展開のエスクローアカウントからの引き落としを開始することに注意してください。

9.マニフェストを送信してSolanaノードをデプロイします

ここで、Solanaのデプロイを開始するには、マニフェストをプロバイダーに送信する必要があります。

akash provider send-manifest solana.yml \
  --node $AKASH_NODE \
  --dseq $AKASH_DSEQ \
  --provider $AKASH_PROVIDER \
  --from default

しばらくすると、展開を確認できるようになります。

$ akash provider lease-status \
  --node $AKASH_NODE \
  --dseq $AKASH_DSEQ \
  --provider $AKASH_PROVIDER \
  --from default
{
  "services": {
    "solana": {
      "name": "solana",
      "available": 1,
      "total": 1,
      "uris": null,
      "observed_generation": 1,
      "replicas": 1,
      "updated_replicas": 1,
      "ready_replicas": 1,
      "available_replicas": 1
    }
  },
  "forwarded_ports": {
    "solana": [
      {
        "host": "cluster.sjc1p0.mainnet.akashian.io",
        "port": 8899,
        "externalPort": 32509,
        "proto": "TCP",
        "available": 1,
        "name": "solana"
      }
    ]
  }
}

エンドポイントURIはcluster.sjc1p0.mainnet.akashian.io:32509、この記述の最後でわかるので
32509なく、ポートである理由8899です(nodePortを参照)。

10.AkashnetでSolanaコンテナのログを確認します

そこにSolanaノードのニーモニックシードフレーズが表示されます。

$ akash \
  --node "$AKASH_NODE" \
  provider lease-logs \
  --dseq "$AKASH_DSEQ" \
  --gseq "$AKASH_GSEQ" \
  --oseq "$AKASH_OSEQ" \
  --provider "$AKASH_PROVIDER" \
  --from default \
  --follow
[solana-648bbc8979-hrjq6] solana-faucet 1.6.10 (src:5d4654d2; feat:3533521759)
[solana-648bbc8979-hrjq6] solana-genesis 1.6.10 (src:5d4654d2; feat:3533521759)
[solana-648bbc8979-hrjq6] solana-keygen 1.6.10 (src:5d4654d2; feat:3533521759)
[solana-648bbc8979-hrjq6] solana-validator 1.6.10 (src:5d4654d2; feat:3533521759)
[solana-648bbc8979-hrjq6] + solana address
[solana-648bbc8979-hrjq6] Error: No such file or directory (os error 2)
[solana-648bbc8979-hrjq6] + echo Generating default keypair
[solana-648bbc8979-hrjq6] Generating default keypair
[solana-648bbc8979-hrjq6] + solana-keygen new --no-passphrase
[solana-648bbc8979-hrjq6] Generating a new keypair
[solana-648bbc8979-hrjq6] Wrote new keypair to /root/.config/solana/id.json
[solana-648bbc8979-hrjq6] ==============================================================================
[solana-648bbc8979-hrjq6] pubkey: 2tpqeMBuqQNd2F6pmQmb2Dyj1A6k2yqqCnWXuWh2pX14
[solana-648bbc8979-hrjq6] ==============================================================================
[solana-648bbc8979-hrjq6] Save this seed phrase to recover your new keypair:
[solana-648bbc8979-hrjq6] wagon layer regret misery divorce wild noodle rent actress reflect sister lift
[solana-648bbc8979-hrjq6] ==============================================================================
...
[solana-648bbc8979-hrjq6] [2021-05-31T13:06:27.045978808Z INFO  solana_core::cluster_info] 
[solana-648bbc8979-hrjq6]     IP Address        |Age(ms)| Node identifier                              | Version |Gossip| TPU  |TPUfwd| TVU  |TVUfwd|Repair|ServeR|ShredVer
[solana-648bbc8979-hrjq6]     ------------------+-------+----------------------------------------------+---------+------+------+------+------+------+------+------+--------
[solana-648bbc8979-hrjq6]     127.0.0.1       me|  4558 | 3QDTDmtqV3rLDdkLVPzP5RLg9TdXLFA7QPzv6Eeo72fi | 1.6.10  | 8001 | 8003 | 8004 | 8000 | 8002 | 8006 | 8007 | 48122
[solana-648bbc8979-hrjq6]     Nodes: 1
[solana-648bbc8979-hrjq6]     
[solana-648bbc8979-hrjq6]     RPC Address       |Age(ms)| Node identifier                              | Version | RPC  |PubSub|ShredVer
[solana-648bbc8979-hrjq6]     ------------------+-------+----------------------------------------------+---------+------+------+--------
[solana-648bbc8979-hrjq6]     127.0.0.1       me|  4558 | 3QDTDmtqV3rLDdkLVPzP5RLg9TdXLFA7QPzv6Eeo72fi | 1.6.10  | 8899 | 8900 | 48122
[solana-648bbc8979-hrjq6]     RPC Enabled Nodes: 1
...

11.AkashnetでSolanaノードをクエリします

使用ソラナのJSONのRPC APIを使用すると、あなたのソラナノードを照会することができます:

$ curl -s http://cluster.sjc1p0.mainnet.akashian.io:32509 -X POST -H "Content-Type: application/json" -d '
  {"jsonrpc":"2.0","id":1, "method":"getBlockTime","params":[5]}
' | jq -r '.result | todate'
2021-05-31T13:05:39Z

$ curl -s http://cluster.sjc1p0.mainnet.akashian.io:32509 -X POST -H "Content-Type: application/json" -d '
  {"jsonrpc":"2.0","id":1, "method":"getIdentity"}
'
{"jsonrpc":"2.0","result":{"identity":"3QDTDmtqV3rLDdkLVPzP5RLg9TdXLFA7QPzv6Eeo72fi"},"id":1}

$ curl -s http://cluster.sjc1p0.mainnet.akashian.io:32509 -X POST -H "Content-Type: application/json" -d '
  {"jsonrpc":"2.0", "id":1, "method":"getClusterNodes"}
' | jq .
{
  "jsonrpc": "2.0",
  "result": [
    {
      "featureSet": 3533521759,
      "gossip": "127.0.0.1:8001",
      "pubkey": "3QDTDmtqV3rLDdkLVPzP5RLg9TdXLFA7QPzv6Eeo72fi",
      "rpc": "127.0.0.1:8899",
      "shredVersion": 48122,
      "tpu": "127.0.0.1:8003",
      "version": "1.6.10"
    }
  ],
  "id": 1
}

12.展開の終了

テストが終了したら、展開を終了できます。

akash tx deployment close \
  --node $AKASH_NODE \
  --chain-id $AKASH_CHAIN_ID \
  --dseq $AKASH_DSEQ \
  --owner $AKASH_ACCOUNT_ADDRESS \
  --from default \
  --gas-prices="0.025uakt" --gas="auto" --gas-adjustment=1.15

13.展開のためにより多くのAKTをデポジットする

展開に満足していて、1日停止したくない場合は、エスクローアカウントにさらにAKTトークンをデポジットできます。

akash tx deployment deposit \
  --from default \
  --chain-id $AKASH_CHAIN_ID \
  --node $AKASH_NODE 1000000uakt \
  --dseq $AKASH_DSEQ \
  --gas-prices="0.025uakt" --gas="auto" --gas-adjustment=1.15

14.本番Solanaバリデーターノード

本番環境のSolanaバリデーターノードのデプロイでは、マニフェストファイルを次のように変更する必要があります。また、推奨されるように、CPU、メモリ、ストレージの制限も解除する必要があります。

---
version: "2.0"

services:
  solana:
    image: solanalabs/solana:v1.6.10
    expose:
      - port: 8899
        as: 8899
        proto: tcp
        to:
          - global: true
      - port: 8001
        as: 8001
        proto: tcp
        to:
          - global: true
      - port: 8900
        as: 8900
        proto: tcp
        to:
          - global: true
      - port: 8010
        as: 8010
        proto: udp
        to:
          - global: true
      - port: 8011
        as: 8011
        proto: udp
        to:
          - global: true
      - port: 8012
        as: 8012
        proto: udp
        to:
          - global: true
      - port: 8013
        as: 8013
        proto: udp
        to:
          - global: true
      - port: 8014
        as: 8014
        proto: udp
        to:
          - global: true
      - port: 8015
        as: 8015
        proto: udp
        to:
          - global: true
      - port: 8016
        as: 8016
        proto: udp
        to:
          - global: true
      - port: 8017
        as: 8017
        proto: udp
        to:
          - global: true
      - port: 8018
        as: 8018
        proto: udp
        to:
          - global: true
      - port: 8019
        as: 8019
        proto: udp
        to:
          - global: true
      - port: 8020
        as: 8020
        proto: udp
        to:
          - global: true
    env:
      - SOLANA_RUN_SH_CLUSTER_TYPE=mainnet-beta
      - |
        SOLANA_RUN_SH_VALIDATOR_ARGS=
        --trusted-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2
        --trusted-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ
        --trusted-validator DE1bawNcRJB9rVm3buyMVfr8mBEoyyu73NBovf2oXJsJ
        --trusted-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S
        --no-untrusted-rpc
        --private-rpc
        --entrypoint entrypoint.mainnet-beta.solana.com:8001
        --entrypoint entrypoint2.mainnet-beta.solana.com:8001
        --entrypoint entrypoint3.mainnet-beta.solana.com:8001
        --entrypoint entrypoint4.mainnet-beta.solana.com:8001
        --entrypoint entrypoint5.mainnet-beta.solana.com:8001
        --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d
        --wal-recovery-mode skip_any_corrupted_record
        --limit-ledger-size
        --dynamic-port-range 8010-8020

profiles:
  compute:
    solana:
      resources:
        cpu:
          units: 0.1
        memory:
          size: 512Mi
        storage:
          size: 512Mi
  placement:
    akash:
      attributes:
        host: akash
      signedBy:
        anyOf:
          - "akash1365yvmc4s7awdyj3n2sav7xfx76adc6dnmlx63"
      pricing:
        solana: 
          denom: uakt
          amount: 10

deployment:
  solana:
    akash:
      profile: solana
      count: 1

--dynamic-port-range 8010-8020引数で指定されたポートなど、より多くのポートを公開する必要がある可能性があります。

唯一の注意点は、次のようなnodePortポートを、いわゆる、非HTTP / HTTPS(80/443)TCPポートをエクスポートすることはできないということです8899/tcp8010:8020/udpそのまま直接。
Akashnetプロバイダーは、コンテナーを実際に実行するために内部でKubernetesを使用します。Kubernetesコントロールプレーンは、--service-node-port-rangeフラグ(default: 30000-32767)(nodePort)で指定された範囲からポートを割り当てます。
これは、オペレーターが最初にSolanaノードをデプロイしてから、プロバイダーのKubernetesがAkashデプロイメントに割り当てたポートを確認する必要があることを意味します。
次に、ロードバランサー/リバースプロキシ(つまり、nginx / haprorxy / traefik)を使用して、これらのポートに転送します。
また--public-rpc-address <HOST:PORT>、Solanaバリデーターノードへの引数を介してロードバランサーのホスト名を指定することにより、Solanaバリデーターにロードバランサーのホスト名を使用するように指示する必要があります。

ただし、目標は、完全な本番Solanaノードではなく、Akashnetを表示することでした。
Solanaの公式ドキュメントでは、本番環境でのDockerの導入は推奨されていません。本番環境のSolanaノード12コア、128Gi RAM、500Gi + SSDで実行する必要があります、Akashnetは非常に新しいネットワークであり、現在は供されていません。その多くのプロバイダーはまだです。投資アドバイスではありません。

この記事が気に入った場合は、こちらから投票してくださいhttps://forum.akash.network/t/twitter-deploy-challenge-solana-on-akash/160

PS
私自身(またはここからピックアップしてさらにプッシュしたい人)へのメモはほとんどありません:

ABOUT ME
たけ
はじめまして! たけといいます。 20代男性サラリーマンが資産運用で5年で3000万をめざします。 これを読んで自分でも出来るのではないかと思ってくれる人が増えると嬉しいです。 お金を得ることは手段に過ぎません。若いうちに稼いで、自分の時間をより大切なことに使いたいです。 【2019投資戦歴】 投資資金合計 300万 2019年度単年損益(年利) FX 15万(15%) 投信 9万(7%) 株式 4万(8%) ※投信、株式は含み益