Sandbox 為 IOTA Community 釋出的沙盒服務,能夠讓開發者測試 IRI API,sanbox 可由 open source 專案自行建構,也可直接使用 IOTA Community 提供的免費服務。
以 IOTA Community 提供的免費服務而言,整個架構雖非 open source,但根據 Dominik Schiener 的說法,sanbox 其實實做上是一個 GPU farm 大量的提供 API 計算服務。
而 open source 版的 sandbox 稍有不同,sandbox 為 fullnode 的反向代理,直接 relay IRI 所有的 API request,除了 attachToTangle
command 這是一個特例,文章之後的章節會把重點放在這個 API command 上。
Example (NodeInfo):
# coding=utf-8
from __future__ import absolute_import, division, print_function, \
unicode_literals
from iota import *
from iota.adapter.sandbox import SandboxAdapter
# Create the API object.
iota =\
Iota(
# To use sandbox mode, inject a ``SandboxAdapter``.
adapter = SandboxAdapter(
# URI of the sandbox node.
uri = 'https://sandbox.iota.org/api/v1/',
# Access token used to authenticate requests.
# Contact the node maintainer to get an access token.
auth_token = '7ad7d36f-f833-44fd-b77e-59eea41e213b',
),
# Seed used for cryptographic functions.
# If null, a random seed will be generated.
seed = b'OTJANRBSZNFGBZGEKPQBRZFZTDIXMDBNSXBXWZWOREODAMUNPGFYXBKYRKEJHHXHKVZGUGUSXU9MZ9E9N',
)
print(iota.get_node_info())
{u'neighbors': 9, u'packetQueueSize': 0, u'appName': u'IRI', u'jreAvailableProcessors': 4, u'appVersion': u'1.4.1.2', u'transactionsToRequest': 14, u'jreMaxMemory': 3817865216, u'latestSolidSubtangleMilestoneIndex': 295580, u'latestMilestone': TransactionHash('UEBPVPIA9ZUSE9KJZUNGJDKTZJODFQXRKZVY9ZL9WFFJ99HEARZ9VOPCUDINBHSKESQXLILISGIUA9999'), u'time': 1512377263685, u'duration': 0, u'jreTotalMemory': 3239051264, u'jreFreeMemory': 307163392, u'latestSolidSubtangleMilestone': TransactionHash('UEBPVPIA9ZUSE9KJZUNGJDKTZJODFQXRKZVY9ZL9WFFJ99HEARZ9VOPCUDINBHSKESQXLILISGIUA9999'), u'tips': 5065, u'latestMilestoneIndex': 295580}
Example (attachToTangle):
# coding=utf-8
from __future__ import absolute_import, division, print_function, \
unicode_literals
from iota import *
from iota.adapter.sandbox import SandboxAdapter
DEPTH = 7
MIN_WEIGHT_MAGNITUDE = 14
recipient_address = "ILXW9VMJQVFQVKVE9GUZSODEMIMGOJIJNFAX9PPJHYQPUHZLTWCJZKZKCZYKKJJRAKFCCNJN9EWOW9N9YDGZDDQDDC"
# Create the API object.
iota =\
Iota(
# To use sandbox mode, inject a ``SandboxAdapter``.
adapter = SandboxAdapter(
# URI of the sandbox node.
uri = 'https://sandbox.iota.org/api/v1/',
# Access token used to authenticate requests.
# Contact the node maintainer to get an access token.
auth_token = '7ad7d36f-f833-44fd-b77e-59eea41e213b',
),
# Seed used for cryptographic functions.
# If null, a random seed will be generated.
seed = b'OTJANRBSZNFGBZGEKPQBRZFZTDIXMDBNSXBXWZWOREODAMUNPGFYXBKYRKEJHHXHKVZGUGUSXU9MZ9E9N',
)
# print("Hello NodeInfo:")
# print(iota.get_node_info())
sender_tag = bytes("TEST")
sender_message = "TEST"
transfer_value = 0
txn = \
ProposedTransaction(
address = Address(
recipient_address
),
message = TryteString.from_string(sender_message),
tag = Tag(sender_tag),
value = transfer_value,
)
prepared_transferes = []
prepared_transferes.append(txn)
txn_id = iota.send_transfer(
depth=DEPTH,
transfers=prepared_transferes,
min_weight_magnitude=MIN_WEIGHT_MAGNITUDE
)
print("Hello txn ID:")
print (txn_id)
iota.adapter.BadApiResponse: 500 response from node: {u'message': u'failed to talk to IRI'}
Henrik Laxhuber [10:28 PM]
@yillkid Some commands are disabled on public nodes for security reasons, including attachToTangle
[10:28]
The full list: `getNeighbors, removeNeighbors, addNeighbors, attachTotangle, interruptAttachingToTangle`
$ sudo apt-get install golang-glide
$ sudo apt-get install golang-go
$ mkdir $HOME/go
$ mkdir $HOME/go/src
$ export GOPATH="$HOME/go"
$ git clone https://github.com/iotaledger/sandbox.git
$ cd sandbox/
$ glide install
$ go build -o sandbox-server ./cmd/server
$ go build -o sandbox-server ./cmd/server
# _/home/ubuntu/sandbox/cmd/server
cmd/server/limiter.go:25: too many arguments in call to tollbooth.NewLimiter
have (int64, time.Duration, nil)
want (int64, *limiter.ExpirableOptions)
cmd/server/limiter.go:28: too many arguments in call to tollbooth.NewLimiter
have (int64, time.Duration, nil)
want (int64, *limiter.ExpirableOptions)
cmd/server/main.go:700: too many arguments in call to tollbooth.NewLimiter
have (int64, time.Duration, nil)
want (int64, *limiter.ExpirableOptions)
因此修改 glide.yaml 檔案將 tollbooth/limiter 版本指定為 v2.2.0
./sandbox-server
{"level":"fatal","ts":1512503265.3413632,"caller":"server/main.go:550","msg":"pubsub topic","error":"rpc error: code = InvalidArgument desc = Invalid resource name given (name=projects//topics/). Refer to https://cloud.google.com/pubsub/overview#names for more information.","name":"","stacktrace":"main.(*App).initPubSub\n\t/home/ubuntu/sandbox/cmd/server/main.go:550\nmain.main\n\t/home/ubuntu/sandbox/cmd/server/main.go:655\nruntime.main\n\t/usr/lib/go-1.8/src/runtime/proc.go:185"}
iotaproxy 詳細的行為可參考IOTAProxy 筆記,簡單的說,iotaproxy 在技術上可以 relay 所有的 API request 到各個節點,但處理這些 API reuest 的最小單位為節點本身 (IRI),sandbox 在處理大部分的 API reuest 方面與 iotaproxy 相同。但在 attachToTangle
命令上,sandbox 選擇直接呼叫 ccurl 來做 POW. 最小的執行單位為 ccurl 命令。
我們在 11/23 號晚上與 Lewis 的餐敘中得知,sandbox 能夠以多執行緒的方式執行 POW (attachToTangle) 工作。
我大概看了一下 sandbox 的運作方式,整理一些資料如下:
整合好之後會是 web-backend (python) + sandbox (golang) + ccurl© 的結合。
我建議把 sandbox 直接用 pyhton celery 實現就好了。
我會另外開一篇文探討 ccurl 本身並筆記下來。