Command Line Wallet Tool
iwallet это инструмент командной строки для блокчейна IOST.
Вы можете использовать этот инструмент для подключения к блокчейну для перевода монет/создания аккаунтов/запроса баланса/вызова контрактов.
iwallet и API используют RPC API внутри себя. У них есть похожий функционал.
Установка
Вам вначале необходимо установить golang.
После установки golang, вы можете установить iwallet с помощью следующей команды:
go get github.com/iost-official/go-iost/iwallet
Если вы планируете развертывать смарт-контракты в блокчейне, вам вначале необходимо установить nodejs, а затем запускать команды.
Базовый функционал
Запрос аккаунта
iwallet можно использовать для запроса информации аккаунта включая баланс, RAM(количество оперативной памяти), GAS(количество доступного газа) и др.
Формат вывода такой же как getAccountInfo API .
Флаг --server внутри команды указывает на удаленный сервер IOST. Если вы запускаете сервер локально,вы можете пропустить флаг, используя значение по умолчанию (localhost:30002).
iwallet --server 127.0.0.1:30002 balance xxxx
{
    "name": "xxxx",
    "balance": 993939670,
    "createTime": "0",
    "gasInfo": {
        "currentTotal": 2994457,
        "increaseSpeed": 11,
        "limit": 3000000,
        "pledgedInfo": [            {
                "pledger": "xxxx",
                "amount": 10
            },
            {
                "pledger": "tttt",
                "amount": 10
            }
        ],
    },
    "ramInfo": {
        "available": "100000"
    },
    "permissions": ...
    "frozenBalances": [
        {
            "amount": 30,
            "time": "1543817610001412000"
        }
    ]
}
Запрос информации о блокчейне
Запрос информации о блокчейне и узле сервера. Вывод в данном случае комбинация из getNodeInfo и getChainInfo.
iwallet --server 127.0.0.1:30002 state
{
    "buildTime": "20181208_161822+0800",
    "gitHash": "c949172cb8063e076b087d434465ecc4f11c3000",
    "mode": "ModeNormal",
    "network": {
        "id": "12D3KooWK1ALkQ6arLJNd5vc49FLDLaPK931pggFr7X49EA5yhnr",
        "peerCount": 0,
        "peerInfo": [
        ]
    }
    "netName": "debugnet",
    "protocolVersion": "1.0",
    "headBlock": "9408",
    "headBlockHash": "FKtcg2qgUnfuXNe6Zz6p2CJMLSUjDSSK2PrvzPtpA3jp",
    "libBlock": "9408",
    "libBlockHash": "FKtcg2qgUnfuXNe6Zz6p2CJMLSUjDSSK2PrvzPtpA3jp",
    "witnessList": [
        "IOSTfQFocqDn7VrKV7vvPqhAQGyeFU9XMYo5SNn5yQbdbzC75wM7C"
    ]
}
Вызов контракта
Импорт аккаунта
Аккаунт должен быть импортирован до вызова каких-либо контрактов.
# This command will copy private key to ~/.iwallet/YOUR_ACCOUNT_ID_ed25519. It is done locally without any interaction with blockchain.
iwallet account --import $YOUR_ACCOUNT_ID $YOUR_PRIVATE_KEY
Использование командной строки
iwallet --account <ACCOUNT_NAME> [other flags] call <CONTRACT_NAME> <ACTION_NAME> '["ARG1",ARG2,...]'
| Флаг | Описание | По умолчанию | 
|---|---|---|
| server | адрес iserver для подключения | localhost:30002 | 
| account | кто вызывает контракт | None, needed | 
| gas_limit | максимальное количество газа разрешенное для вызова | 1000000 | 
| gas_ratio | транзакция с большим коэффицентом газа будет выполнена ранее | 1.0 | 
| amount_limit | все лимиты количества токенов | None, needed. Like iost:300.0|ram:2000. "*:unlimited" means no limit | 
Пример:перевод токенов
admin вызывает функцию 'transfer' контракта 'token.iost'
Последний аргумент команды это параметры функции 'transfer'. Параметры этой функции по порядку: тип токена, плательщик, получатель, сумма и дополнительная информация здесь.
iwallet --account admin call 'token.iost' 'transfer' '["iost","admin","lispczz","100",""]'
sending tx Tx{
    Time: 1543559175834283000,
    Publisher: admin,
    Action:
        Action{Contract: token.iost, ActionName: transfer, Data: ["iost","admin","lispczz","100",""]}
    AmountLimit:
[],
}
send tx done
the transaction hash is: GU4EHg4zE9VHu9A13JEwxqJSVbzij1VoqWGnQR5aV3Dv
exec tx done.  {
    "txHash": "GU4EHg4zE9VHu9A13JEwxqJSVbzij1VoqWGnQR5aV3Dv",
    "gasUsage": 2172,
    "ramUsage": {
        "admin": "43"
    },
    "statusCode": "SUCCESS",
    "message": "",
    "returns": [
        "[]"
    ],
    "receipts": [
        {
            "funcName": "token.iost/transfer",
            "content": "[\"iost\",\"admin\",\"lispczz\",\"100\",\"\"]"
        }
    ]
}
Создание аккаунта
Использование командной строки
iwallet --server <server_addres> --account <account_name> --amount_limit  <amount_limit> account --create <new_account_name> [other flags]
| Флаг | Описание | По умолчанию | 
|---|---|---|
| create | имя нового аккаунта | None, needed | 
| initial_ram | количество ram купленного для нового аккаунта создателем | 1024 | 
| initial_gas_pledge | количество IOST заложенного для gas создателем для нового аккаунта | 10 | 
| initial_balance | сумма IOST переведенная на новый аккаунт создателем | 0 | 
Для создания нового аккаунта требуется вызов контрактов, поэтому помимо указанных выше флагов также необходимы все флаги вызова.
# After creating account,  random keypair is generated, and private key will be saved to ~/.iwallet/$(new_account_name)_ed25519    
iwallet --server 127.0.0.1:30002 --account admin --amount_limit "ram:1000|iost:10" account --create lispczz3 --initial_balance 0 --initial_gas_pledge 10 --initial_ram 0
...
...
    "groups": {
    },
    "frozenBalances": [
    ]
}
your account private key is saved at:
/Users/zhangzhuo/.iwallet/lispczz3_ed25519
create account done
the iost account ID is: lispczz3
owner permission key: IOSTGdkyjGmhvpM435wvSkPt2m3TVUM6npU8wbRZYcmkdprpvp92K
active permission key: IOSTGdkyjGmhvpM435wvSkPt2m3TVUM6npU8wbRZYcmkdprpvp92K
Развертывание контракта
Публикация javascript контракта в два шага, первый шаг это генерация файла abi, второй шаг это публикация файла javascript и файла abi в блокчейне.
Генерация abi
Убедитесь, что node.js установлен и команда npm install внутри директории iwallet/contract была запущена.
# example.js.abi will be generated
iwallet compile example.js
Обычно создаваемый файл abi необходимо корректировать, параметры функции тип и лимит суммы могут быть скорректированы в соответствии с актуальным для вас использованием.
Публикация контракта
iwallet --server 127.0.0.1:30002 --account admin --amount_limit  "ram:100000" publish contract/lucky_bet.js contract/lucky_bet.js.abi
...
The contract id is ContractBgHM72pFxE9KbTpQWipvYcNtrfNxjEYdJD7dAEiEXXZh
ContractXXX последняя строка вывода это имя контракта, которое необходимо если позже кто-нибудь захочет вызвать новозагруженный контракт.
Расширенные возможности
Запрос блока
# Get information about block at height 10
iwallet block --method num 10
# Get information about block with hash 6RJtXTDPPRTP6iwK9FpG5LodeMaXofEnd8Lx2KA1kqbU
iwallet block --method hash 6RJtXTDPPRTP6iwK9FpG5LodeMaXofEnd8Lx2KA1kqbU
Запрос информации о транзакции
Получите детали транзакции
transaction это тоже, что и getTxByHash API
iwallet transaction 3aeqKCKLTanp8Myep99BUfkdRKPj1RAGZvEesDmsjqcx
{
    "status": "PACKED",
    "transaction": {
        "hash": "3aeqKCKLTanp8Myep99BUfkdRKPj1RAGZvEesDmsjqcx",
        "time": "1545470082534696000",
        "expiration": "1545470382534696000",
        "gasRatio": 1,
        "gasLimit": 1000000,
        "delay": "0",
        "actions": [
            {
                "contract": "token.iost",
                "actionName": "transfer",
                "data": "[\"iost\",\"admin\",\"admin\",\"10\",\"\"]"
            }
        ],
#
Получите receipt(квитанцию) транзакции по ее хешу
receipt это тоже, что и getTxReceiptByTxHash API
iwallet receipt 3aeqKCKLTanp8Myep99BUfkdRKPj1RAGZvEesDmsjqcx
{
    "txHash": "3aeqKCKLTanp8Myep99BUfkdRKPj1RAGZvEesDmsjqcx",
    "gasUsage": 2577,
    "ramUsage": {
    },
    "statusCode": "SUCCESS",
    "message": "",
    "returns": [
        "[]"
    ],
    "receipts": [
    ]
}
