Бытом проекта :
Github: https://github.com/Bytom/bytom
Эта часть предназначена для пользователей, которые отправляют транзакции в режиме собственного счета Бытом.
1 transaction Транзакция построения
Транзакция API-интерфейса, транзакция , коды api / transact.go # L120
Возьмем транзакции со стандартным активом, не относящимся к BTM, например, , Актив BTM, идентификатор которого состоит из F, является только газом в этой транзакции. Эта транзакция означает, что на указанный адрес тратится 99 указанных активов , json встроенной транзакции его входного запроса следующим образом:
{
"base_transaction": null,
"actions": [
{
"account_id": "0ER7MEFGG0A02",
"amount": 20000000,
"asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"type": "spend_account"
},
{
"account_id": "0ER7MEFGG0A02",
"amount": 99,
"asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",
"type": "spend_account"
},
{
"amount": 99,
"asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",
"address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",
"type": "control_address"
}
],
"ttl": 0,
"time_range": 0
}
Исходный код соответствующего объекта ответа выглядит следующим образом:
// BuildRequest is main struct when building transactions
type BuildRequest struct {
Tx *types.TxData `json:"base_transaction"`
Actions []map[string]interface{} `json:"actions"`
TTL json.Duration `json:"ttl"`
TimeRange uint64 `json:"time_range"`
}
поля структуры:
- Tx
TxData
транзакции , зарезервированные поля , ноль
- TTL
время жизни (мс) построенной транзакции , это означает, что уже сохраненный в кэше utxo не может использоваться для другой транзакции сборки в течение этого периода времени ,, если левого utxo не достаточно для построения новой транзакции, или это не вызовет ошибку. Когда ttl
0, его значение по умолчанию составляет 600 с (5 минут)
- TimeRange
Временная метка означает, что транзакция не будет в цепочке после этой длины блока (временная метка). Чтобы избежать слишком долгого ожидания при передаче транзакции из-за задержки транспорта, транзакция истечет, если она не будет упакована в указанный TimeRange.
- Actions
actions
структура транзакции , все транзакции состоят из действия , map
тип interface{}
обеспечивает масштабируемость типа действия. Действие должно содержать поля типа, чтобы различать различные типы действий. action
в основном содержит input
и output
, его подробное введение:
- input action
тип :
- выпускать эмиссионный актив
- тратить_аккаунт тратить utxo в режиме аккаунта
- тратить_акcount_unspent_output тратить указанные непосредственно utxo
- output action
тип :
- control_address получить в адресном режиме
- получение control_program в контрактном режиме (программы)
- выбытие выбытие актива
Обратите внимание :
- Одна транзакция должна содержать вход и выход или t Сумма активов на входе a должна быть равна выходу при построении ввода и вывода, в противном случае транзакция будет отображать сообщение об ошибке в качестве дисбаланса ввода и вывода.
- Газ: актив BTM всех входов сводится к активу всех выходов
- Сумма актива в сделке все в единицах neu BT 1 BTM = 1000 mBTM = 100 000 000 neu
Действие введение
action
типы при построении транзакции:
вопрос
issueAction
Структурный исходный код:
type issueAction struct {
assets *Registry
bc.AssetAmount
}
type AssetAmount struct {
AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
Amount uint64 `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`
}
строительные поля :
- assets
управление активами , пользователям не нужно устанавливать параметры
- AssetAmount
ssetID и соответствующая сумма актива , необходимо создать AssetID
с помощью create-asset
, нельзя использовать идентификатор актива BTM
json
формат issueAction
:
{
"amount": 100000000,
"asset_id": "3152a15da72be51b330e1c0f8e1c0db669269809da4f16443ff266e07cc43680",
"type": "issue"
}
пример эмиссионного актива:
(Выпуск 900000000
, который assetID
равен 42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f
до sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me
, газ составляет 20000000
neu актива BTM)
{
"base_transaction": null,
"actions": [
{
"account_id": "0ER7MEFGG0A02",
"amount": 20000000,
"asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"type": "spend_account"
},
{
"amount": 900000000,
"asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",
"type": "issue"
},
{
"amount": 900000000,
"asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",
"address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",
"type": "control_address"
}
],
"ttl": 0,
"time_range": 0
}
spend_account
spendAction
Структурный исходный код:
type spendAction struct {
accounts *Manager
bc.AssetAmount
AccountID string `json:"account_id"`
ClientToken *string `json:"client_token"`
}
type AssetAmount struct {
AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
Amount uint64 `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`
}
поля структуры:
- accounts
account management.users не нужно устанавливать параметры
- AccountID
расходов_счет
- AssetAmount
AssetID и соответствующая сумма актива
- ClientToken
Зарезервированные лимиты пользователей UTXO , null
spendAction``json
формат spendAction
:
{
"account_id": "0BF63M2U00A04",
"amount": 2000000000,
"asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"type": "spend_account"
}
Пример транзакции выглядит следующим образом:
(Перевод 100000000
neu Бытом актив на sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me
, газ 20000000
neu = вход BTM актив - выход BTM актив)
{
"base_transaction": null,
"actions": [
{
"account_id": "0ER7MEFGG0A02",
"amount": 120000000,
"asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"type": "spend_account"
},
{
"amount": 100000000,
"asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",
"type": "control_address"
}
],
"ttl": 0,
"time_range": 0
}
spend_account_unspent_output
spendUTXOAction
Структурный исходный код:
type spendUTXOAction struct {
accounts *Manager
OutputID *bc.Hash `json:"output_id"`
ClientToken *string `json:"client_token"`
}
поля структуры:
- accounts
account management.users не нужно устанавливать параметры
- OutputID
ID запроса UTXO available доступен запрос UTXO по list-unspent-outputs
, OutputID
, соответствующему id
полям API, возвращаемых результатов
- ClientToken
зарезервированный лимит UTXO , ноль
json
формат spendUTXOAction
:
{
"type": "spend_account_unspent_output",
"output_id": "58f29f0f85f7bd2a91088bcbe536dee41cd0642dfb1480d3a88589bdbfd642d9"
}
пример транзакции осуществляемогоUTUTXO:
(Перевод UTXO 100000000
neu BTM актива в sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me
, газ = ввод UTXO актива BTM - вывод актива BTM)
{
"base_transaction": null,
"actions": [
{
"output_id": "58f29f0f85f7bd2a91088bcbe536dee41cd0642dfb1480d3a88589bdbfd642d9",
"type": "spend_account_unspent_output"
},
{
"amount": 100000000,
"asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",
"type": "control_address"
}
],
"ttl": 0,
"time_range": 0
}
control_address
controlAddressAction
Структурный исходный код:
type controlAddressAction struct {
bc.AssetAmount
Address string `json:"address"`
}
type AssetAmount struct {
AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
Amount uint64 `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`
}
Поле структуры:
- Address
получить адрес , можно создать адрес с помощью create-account-receiver
APIинтерфейса
- AssetAmount
идентификатор актива для получения исоответствующая сумма актива
json
формат controlAddressAction
:
{
"amount": 100000000,
"asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"address": "bm1q50u3z8empm5ke0g3ngl2t3sqtr6sd7cepd3z68",
"type": "control_address"
}
Пример транзакции:
(Перевод 100000000
neuBTM-адреса на sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me
в режиме учетной записи, control_address
введите адрес для получения)
{
"base_transaction": null,
"actions": [
{
"account_id": "0ER7MEFGG0A02",
"amount": 120000000,
"asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"type": "spend_account"
},
{
"amount": 100000000,
"asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",
"type": "control_address"
}
],
"ttl": 0,
"time_range": 0
}
control_program
controlProgramAction
Структурный исходный код:
type controlProgramAction struct {
bc.AssetAmount
Program json.HexBytes `json:"control_program"`
}
type AssetAmount struct {
AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
Amount uint64 `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`
}
Поля структуры:
- Program
сценарий контракта для получения актива , через create-account-receiver
построение API-интерфейса и получение program
(Результаты возврата program
и address
соответствуют переписке один к одному)
- AssetAmount
AssetID для получения и соответствующей суммы актива
json
формат controlProgramAction
:
{
"amount": 100000000,
"asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"control_program":"0014a3f9111f3b0ee96cbd119a3ea5c60058f506fb19",
"type": "control_program"
}
Пример транзакции:
(Перевести 100000000
neu BTM-актив в program
(один-в-один переписку с address
) 0014a3f9111f3b0ee96cbd119a3ea5c60058f506fb19
, control_program
тип использует program
для получения)
{
"base_transaction": null,
"actions": [
{
"account_id": "0ER7MEFGG0A02",
"amount": 120000000,
"asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"type": "spend_account"
},
{
"amount": 100000000,
"asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"control_program": "0014a3f9111f3b0ee96cbd119a3ea5c60058f506fb19",
"type": "control_program"
}
],
"ttl": 0,
"time_range": 0
}
уходить в отставку
retireAction
структурный исходный код выглядит следующим образом:
type retireAction struct {
bc.AssetAmount
}
type AssetAmount struct {
AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
Amount uint64 `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`
}
Структура поля :
- AssetAmount
идентификатор актива для получения и соответствующая сумма актива
json
формат retireAction
:
{
"amount": 900000000,
"asset_id": "3152a15da72be51b330e1c0f8e1c0db669269809da4f16443ff266e07cc43680",
"type": "retire"
}
Пример транзакции:
(Перевод 100000000
neu BTM выбывшего актива в режиме счета, retire
выбытие указанной суммы актива)
{
"base_transaction": null,
"actions": [
{
"account_id": "0ER7MEFGG0A02",
"amount": 120000000,
"asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"type": "spend_account"
},
{
"amount": 100000000,
"asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"type": "retire"
}
],
"ttl": 0,
"time_range": 0
}
Реализовать конструкцию ввода build-transaction
transaction вы можете отправить транзакцию по http-вызову result json result после реализации построения транзакции:
{
"allow_additional_actions": false,
"raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a077301000161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf456010003013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",
"signing_instructions": [
{
"position": 0,
"witness_components": [
{
"keys": [
{
"derivation_path": [
"010100000000000000",
"0100000000000000"
],
"xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
}
],
"quorum": 1,
"signatures": null,
"type": "raw_tx_signature"
},
{
"type": "data",
"value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"
}
]
},
{
"position": 1,
"witness_components": [
{
"keys": [
{
"derivation_path": [
"010100000000000000",
"0800000000000000"
],
"xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
}
],
"quorum": 1,
"signatures": null,
"type": "raw_tx_signature"
},
{
"type": "data",
"value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419"
}
]
}
]
}
Исходный код соответствующего объекта ответа выглядит следующим образом:
// Template represents a partially- or fully-signed transaction.
type Template struct {
Transaction *types.Tx `json:"raw_transaction"`
SigningInstructions []*SigningInstruction `json:"signing_instructions"`
// AllowAdditional affects whether Sign commits to the tx sighash or
// to individual details of the tx so far. When true, signatures
// commit to tx details, and new details may be added but existing
// ones cannot be changed. When false, signatures commit to the tx
// as a whole, and any change to the tx invalidates the signature.
AllowAdditional bool `json:"allow_additional_actions"`
}
поля структуры:
- Transaction
об информации о транзакциях, включая TxData
и bc.Tx
:
- TxData
Представляет часть данных транзакции, отображаемую пользователю, которая видна пользователю
- Version
версия транзакции
- SerializedSize
Размер после сериализации транзакции
- TimeRange
максимальная временная метка (высота блока) для отправки транзакции по цепочке (если транзакция не была в цепочке, когда высота блока достигает высоты блока , транзакция будет империей)
- Inputs
входы транзакций
- Outputs
выходные данные транзакции
- bc.Tx
Представляет структуру преобразования, используемую для обработки транзакций в системе. Эта часть не видна пользователям, поэтому подробно не описана
- SigningInstructions
подпись информация о транзакции
- Position
до input action
Место подписи
- Данные от WitnessComponents
до input action
подписи , signatures
транзакции здания null
* без подписи; Если транзакция подписана успешно, в этом поле будет существовать информация о подписи. Это поле является интерфейсом, в основном включает три различных типа:
- SignatureWitness
хешируйте программу контракта input action
в транзакции Template
,, затем подпишите для значения хеш-функции
- signatures
подпись транзакции (тип массива) , После выполнения sign-transaction
, будет значение
- keys
(тип массива) Включая основной открытый ключ xpub
и производный путь derivation_path
, они могут найти соответствующий производный частный ключ child_xprv
в период подписи, а затем использовать производный ключ для подписи.
- key
сумма quorum
счета , длина должна быть равна keys
выше 。Если quorum
равна 1 , это учетная запись с единой подписью , или учетная запись с несколькими подписями
- program
Данные подписи value значение хеша program
соответствует данным подписи。 Если program
пусто, то хеш генерируется на основе текущего идентификатора транзакции и соответствующего местоположения действия InputID ,, затем используйте их как данные команды для автоматического построения program
- RawTxSigWitness
хэш InoutID (это поле в формате bc.Tx) input action
с идентификатором транзакции Template
- signatures
подпись транзакции (тип массива) , После выполнения sign-transaction
be будет значение
- keys
(arraytype), включая xpub
и производный путь derivation_path
,, вы можете найти производный закрытый ключ в периоде его подписи child_xprv
,, а затем использовать производный закрытый ключ для подписи
- key
сумма quorum
учетной записи , длина должна быть равна keys
выше。Если quorum
равна 1 , она представляет собой учетную запись с единой подписью , или ее учетную запись с несколькими подписями
- DataWitness
этот тип не требует подписи , проверить дополнительные данные программы контракта
- AllowAdditional
Разрешить ли торговать дополнительными данными, если для true
, тогда дополнительные данные будут добавлены к транзакции, но не будут послеповлиять на выполнение транзакции program
скриптом, не повлияет на результат подписи; Если для false
, всю транзакцию в целом подписать, любые изменения данных будут влиять на подписи транзакции
Оценка газа
Интерфейс сметных комиссий estimate ws-transaction - gas
предназначен для build -transaction
сметных комиссий, результаты результатов оценки должны быть добавлены к build -transaction
результатам, а затем подписаны и отправлены на сделку. Основной процесс заключается в следующем:
build - estimate - build - sign - submit
估算 手续费 的 输入 请求 JSON 格式 如下:
{
"transaction_template": {
"allow_additional_actions": false,
"raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a077301000161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf456010003013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",
"signing_instructions": [
{
"position": 0,
"witness_components": [
{
"keys": [
{
"derivation_path": [
"010100000000000000",
"0100000000000000"
],
"xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
}
],
"quorum": 1,
"signatures": null,
"type": "raw_tx_signature"
},
{
"type": "data",
"value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"
}
]
},
{
"position": 1,
"witness_components": [
{
"keys": [
{
"derivation_path": [
"010100000000000000",
"0800000000000000"
],
"xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
}
],
"quorum": 1,
"signatures": null,
"type": "raw_tx_signature"
},
{
"type": "data",
"value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419"
}
]
}
]
}
}
Исходный код соответствующего объекта ответа выглядит следующим образом:
type request struct{
TxTemplate txbuilder.Template `json:"transaction_template"`
}
// Template represents a partially- or fully-signed transaction.
type Template struct {
Transaction *types.Tx `json:"raw_transaction"`
SigningInstructions []*SigningInstruction `json:"signing_instructions"`
// AllowAdditional affects whether Sign commits to the tx sighash or
// to individual details of the tx so far. When true, signatures
// commit to tx details, and new details may be added but existing
// ones cannot be changed. When false, signatures commit to the tx
// as a whole, and any change to the tx invalidates the signature.
AllowAdditional bool `json:"allow_additional_actions"`
}
Вы можете увидеть связанные поля, включая TxTemplate
в описании результата build-транзакции
Интерфейс вызова estimate ws-transaction - gas
после успешного возврата json приводит к следующим результатам:
{
"total_neu": 5000000,
"storage_neu": 3840000,
"vm_neu": 1419000
}
Исходный код для соответствующего объекта ответа выглядит следующим образом:
// EstimateTxGasResp estimate transaction consumed gas
type EstimateTxGasResp struct {
TotalNeu int64 `json:"total_neu"`
StorageNeu int64 `json:"storage_neu"`
VMNeu int64 `json:"vm_neu"`
}
Поле структуры объясняется следующим образом:
- TotalNeu
Расчетный газ (neu) , вы можете добавить значение к активу BTM билда-транзакции, введя действие
- StorageNeu
Газ для хранения транзакции
- VMNeu
Газ для работы на BVM