In this short post, I will test out SONM.

SONM is a decentralized cloud provider. In this case, cloud is just someone else’s computer literally. I read on the website that this is called “fog computing.” In essense, anyone can become a “miner” to run application in exchange for SONM tokens. The technology is enabled by Docker, Yandex Cocaine and its own network discovery module(insomnia) and a blockchain interface. There are two binaries: hub for discovery(presumably one for a computing cluster) and miner to run on each host machine, both written in Go. I’d like to think of SONM as Kubernetes on a blockchain.

To test the project at its current stage, I will deploy a Factorio docker server and judge by the ease of use for both sysadmin and end user.

Installing SONM Toolbelt

Following alpha release the tutorial step by step, I downloaded the 0.2.1 release from Github.

$ ./sonmhub INFO [10-12|19:26:40] Starting P2P networking INFO [10-12|19:26:42] UDP listener up self=enode://b1ac08dd98423379ed75a4ea28ea5f4d96896743a8648d7c20880f79378a13ef910e8e2d98c50c01fa2442d7ffd5811a3ce25650f8592aa3ee2ae10970f5b7a4@207.244.97.166:30343 INFO [10-12|19:26:42] Whisper started 2017-10-12T19:26:42.982Z INFO hub/server.go:288 listening for connections from Miners {"address": "[::]:10002"} 2017-10-12T19:26:42.984Z INFO hub/server.go:297 listening for gRPC API connections {"address": "[::]:10001"} INFO [10-12|19:26:42] RLPx listener up self=enode://b1ac08dd98423379ed75a4ea28ea5f4d96896743a8648d7c20880f79378a13ef910e8e2d98c50c01fa2442d7ffd5811a3ce25650f8592aa3ee2ae10970f5b7a4@207.244.97.166:30343

Then in a separate session,

$ sudo ./sonmminer 2017-10-12T19:27:09.595Z DEBUG miner/builder.go:75 building a miner {"config": {"HubConfig":{"Endpoint":"127.0.0.1:10002","Resources":null},"FirewallConfig":null,"GPUConfig":null,"SSHConfig":null,"LoggingConfig":{"Level":-1}}} 2017-10-12T19:27:09.603Z DEBUG miner/builder.go:83 discovering public IP address ... 2017-10-12T19:27:09.611Z INFO miner/builder.go:109 discovered public IP address {"addr": "207.244.97.166", "nat": "Not behind a NAT"} 2017-10-12T19:27:09.611Z INFO miner/builder.go:140 collected Hardware info {"hardware": {"CPU":[{"cpu":0,"vendorId":"GenuineIntel","family":"6","model":"2","stepping":3,"physicalId":"0","coreId":"0","cores":1,"modelName":"QEMU Virtual CPU version 1.2.1","mhz":2400.082,"cacheSize":4096,"flags":["fpu","de","pse","tsc","msr","pae","mce","cx8","apic","sep","mtrr","pge","mca","cmov","pse36","clflush","mmx","fxsr","sse","sse2","syscall","nx","lm","rep_good","nopl","pni","vmx","cx16","popcnt","hypervisor","lahf_lm"],"microcode":"0x1"}],"Memory":{"total":1040777216,"available":554799104,"used":485978112,"usedPercent":46.69376928405013,"free":53800960,"active":423022592,"inactive":442867712,"wired":0,"buffers":51183616,"cached":404344832,"writeback":0,"dirty":8192,"writebacktmp":0,"shared":10915840,"slab":87986176,"pagetables":5287936,"swapcached":7966720},"GPU":[]}} 2017-10-12T19:27:09.614Z INFO miner/overseer.go:207 subscribe to Docker events {"since": "1507836429"} 2017-10-12T19:27:09.622Z DEBUG miner/server.go:571 Using hub IP from config {"IP": "127.0.0.1:10002"} 2017-10-12T19:27:09.632Z INFO miner/server.go:156 handling Handshake request {"req": ""} 2017-10-12T19:27:09.639Z INFO miner/server.go:415 starting tasks status server 2017-10-12T19:27:09.639Z DEBUG miner/server.go:368 handling tasks status request 2017-10-12T19:27:09.639Z INFO miner/server.go:343 sending result {"info": {}, "statuses": {}} 2017-10-12T19:27:14.627Z INFO miner/server.go:512 yamux.Ping OK {"rtt": "201.763µs"}

I assume that one hub supports a cluster of nearby hosts, similar to the master node on Kubernetes.

Finally, to run a docker container, create a yml file:

$ cat > task.yml <<END > task: > container: > name: dtandersen/factorio:latest > resources: > CPU: 1 > RAM: 10240kb >END

Now we need to figure out the miner on which to run the task:

$ ./sonmcli --addr 127.0.0.1:10001 miner list Miner: 127.0.0.1:50928 Idle $ ./sonmcli --addr 127.0.0.1:10001 miner status 127.0.0.1:50928 Miner: "127.0.0.1:50928" (003fe205-af29-4777-aa2c-a70fd50569ab): Hardware: CPU0: 1 x QEMU Virtual CPU version 1.2.1 GPU: None RAM: Total: 992.6 MB Used: 463.5 MB No active tasks

Now we can deploy the task:

$ ./sonmcli --addr 127.0.0.1:10001 task start 127.0.0.1:50320 task.yml Starting "dtandersen/factorio:latest" on miner 127.0.0.1:50928... ID 94b59103-0c43-4c1e-bc87-9e06abf39ad5 Endpoint [27015/tcp->207.244.97.166:32772 34197/udp->207.244.97.166:32769]

This command returns when the task is deployed.

We inspect the miner again:

$ ./sonmcli --addr 127.0.0.1:10001 miner status 127.0.0.1:50928 Miner: "127.0.0.1:50928" (003fe205-af29-4777-aa2c-a70fd50569ab): Hardware: CPU0: 1 x QEMU Virtual CPU version 1.2.1 GPU: None RAM: Total: 992.6 MB Used: 463.5 MB Tasks: 1) 94b59103-0c43-4c1e-bc87-9e06abf39ad5

The entire process took less than 3 minutes in wall clock time.

Of course, a system this complex will have lots of edge cases. I hope the SONM team have solutions to these pressing issues with fog computing:

Security: user side and miner side Proof of execution Dishonest nodes GPU tasks - SONM will support OpenCL but what about nvidia-docker required to run TensorFlow?

SONM marketplace release is scheduled this winter along with a wallet prototype. Here is a diagram of how it works:

I will test these products as they are released.