with Docker containers
git clone https://github.com/proof-media/rchain-notebook.git
cd rchain-notebook
docker-compose up
Then open http://localhost:8888
# password is set in the `.env` file
# and shared to notebook container
%env NOTEBOOK_PASSWORD
'prooflikesrchainalot'
Because Truth Matters
We are building a platform which leverages the wisdom of the crowds to establish truth.
Rchain is needed to register tokens/hashes computed
when each user votes
Our backend is based on Python 3.7+
and Django framework
beetleman
)https://github.com/proof-media/rchain-grpc/graphs/contributors
! pip search rchain | grep -i grpc
rchain-grpc (0.0.10) - python client to rchain gRPC
0.0.10
-> code developed tested with RNode 0.6.x
0.0.11
release -> compatible with RNode 0.7.x
move the repo into rchain
GitHub space, see issue
(after those previous problems are solved)
With current docker-compose
for the notebook you are running a RNode standalone instance
# we have the OS NODE_NAME variable holding the other container name
RNODE_HOST = %env NODE_NAME
! apk add curl
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz (1/1) Installing curl (7.61.1-r0) 7 0% 87100% ██████████████████████████████████████████████████████████████████████████8Executing busybox-1.28.4-r1.trigger OK: 36 MiB in 48 packages
! curl $RNODE_HOST:40403/version
/bin/sh: curl: not found
Now we can open a channel through gRPC
against the RChain node
using the Python library!
NOTE: in running docker image the package is already installed,
while normally you would do:
pip install rchain-grpc
from rchain_grpc import casper
connection = casper.create_connection(host=RNODE_HOST)
connection
<rchain_grpc.utils.Connection at 0x7fdfa0144208>
In a notebook you can write a file like this
%%file hello_world.rho
new print(`rho:io:stdout`) in {
print!("Hello World!")
}
Writing hello_world.rho
Then edit it inside the notebook server, e.g. link to file
# then read the file to use the code in python
with open('hello_world.rho') as fh:
rholang_code = fh.read()
# alternative: write directly the code with triple quoted strings
rholang_code = """
new print(`rho:io:stdout`) in {
print!("Hello World!")
}
"""
print(rholang_code)
new print(`rho:io:stdout`) in { print!("Hello World!") }
casper.deploy(connection, rholang_code)
{'success': True, 'message': 'Success!'}
casper.propose(connection)
{'success': True, 'message': 'Success! Block 4b15fa7621... created and added.'}
Now check logs of the rnode to see if we have Hello World!
string
output = casper.get_blocks(connection, depth=1)
# NOTE: protobuf outputs are always converted into Python dictionaries by our library
output
[{'blockHash': '4b15fa762195810bcc89a8db188927a4f1517f9a0d175f06b468908fb4bde506', 'blockSize': '1340', 'blockNumber': 1, 'deployCount': 1, 'tupleSpaceHash': '781bbcd09fa259caa17bab1c2d6b339c5bee99576bc04c8c012e5c06a9a0316c', 'timestamp': 1540215055121, 'faultTolerance': -1.0, 'mainParentHash': '8d08dd96ef1152951b80b551fb1bfb928f0a5e46742038da52c2be39e5f16d26', 'parentsHashList': ['8d08dd96ef1152951b80b551fb1bfb928f0a5e46742038da52c2be39e5f16d26'], 'sender': 'eabe5a1a0750d2a8745709bb0bdb24f63c6a8ac3a887b9bed40b34b0598ddf08'}]
block_hash = output.pop().get('blockHash')
block_hash
'4b15fa762195810bcc89a8db188927a4f1517f9a0d175f06b468908fb4bde506'
block = casper.get_block(connection, block_hash=block_hash)
block
{'blockHash': '4b15fa762195810bcc89a8db188927a4f1517f9a0d175f06b468908fb4bde506', 'blockSize': '1340', 'blockNumber': 1, 'deployCount': 1, 'tupleSpaceHash': '781bbcd09fa259caa17bab1c2d6b339c5bee99576bc04c8c012e5c06a9a0316c', 'tupleSpaceDump': '@{Unforgeable(0xa4fd447dedfc960485983ee817632cf36d79f45fd1796019edfb4a84a81d1697)}!({}) |\n@{"proofOfStake"}!(Unforgeable(0xc02c72fad36bc255f9f93a5b569d4d2bd502bed3fe6ed37534a544113c1e4e3f)) |\n@{Unforgeable(0x651923755db27e1ed7e69bd7b8576330a2d20c7b16253b46e71b5c1386b91e2d)}!(1222) |\n@{Unforgeable(0x51ff32c8ed4b7b774ab5fe0c5e4f7e3b5bd4bdf31903ddf8e5ca65c6aa4070b5)}!({5122eac8a5c99b7da8f6d40d5f3269c6844dabde0418749ece2aeedc64c27703 : (288, "secp256k1Verify", Nil, 1), 5a3fff1ed432237e779fc6aa20d7549d043cc0dd92180ebee0346229598870f8 : (228, "secp256k1Verify", Nil, 2), d6b0c603a51fbcd56db1606a0591310876f93bdbf2309c7bdbc277a080368990 : (188, "secp256k1Verify", Nil, 4), a3158195b3ca6dfb88b8f0cb0788b01f25ea11421104df071bd043ca27f2def4 : (202, "secp256k1Verify", Nil, 3), e84b0ca96139b9c5e1a58b55e9d84682318a2030eaf24923204a1473ed659b34 : (224, "secp256k1Verify", Nil, 5), eabe5a1a0750d2a8745709bb0bdb24f63c6a8ac3a887b9bed40b34b0598ddf08 : (92, "secp256k1Verify", Nil, 6)}) |\n@{Unforgeable(0x151d45b278f53a0ffcd58a40ff6ed0e1a6298592932844bb95b8574dd02fdd69)}!!(1) |\nfor( @{x0} <= @{"MakeMint"} ) {\n new x1, x2, x3 in {\n @{x0}!(x1) |\n for( @{x4}, @{x5} <= @{(x1, "makePurse")} ) {\n new x6 in {\n @{("MakeMint", "int2NN")}!(x4, x6) |\n for( @{x7} <- @{x6} ) {\n @{x2}!(x7, x5)\n }\n }\n } |\n for( @{x4}, @{x5} <= @{x2} ) {\n new x6 in {\n @{x5}!(x6) |\n for( @{x7}, @{x8}, @{x9} <= @{(x6, "deposit")} ) {\n new x10 in {\n @{(x8, x3)}!(x7, x10) |\n for( @{x11} <- @{x10} ) {\n match x11 {\n true => @{(x4, "add")}!(x7, x9) ;\n false => @{x9}!(false)\n }\n }\n }\n } |\n for( @{x7} <= @{(x6, "getBalance")} ) {\n @{(x4, "value")}!(x7)\n } |\n for( @{x7}, @{x8} <= @{(x6, "split")} ) {\n new x9, x10 in {\n @{(x6, "sprout")}!(x9) |\n for( @{x11} <- @{x9} ) {\n @{(x11, "deposit")}!(x7, x6, x10) |\n for( @{x12} <- @{x10} ) {\n match x12 {\n true => @{x8}!([x11]) ;\n false => @{x8}!([])\n }\n }\n }\n }\n } |\n for( @{x7} <= @{(x6, "sprout")} ) {\n @{(x1, "makePurse")}!(0, x7)\n } |\n for( @{x7}, @{x8} <= @{(x6, x3)} ) {\n @{(x4, "sub")}!(x7, x8)\n }\n }\n }\n }\n} |\nfor( @{x0} <= @{(Unforgeable(0xc0e1db8bd0baabd4e0ecca7ec9804b6e53e3fc8ed0179b9272bd8291286bed41), "getBalance")} ) {\n @{(Unforgeable(0x2b6d3d1aeebe4f5cbffea98f589bc48516f3934851886f16c165190ea8ab62ef), "value")}!(x0)\n} |\nfor( @{x0}, @{x1}, @{x2}, @{x3}, @{x4} <= @{(Unforgeable(0xc02c72fad36bc255f9f93a5b569d4d2bd502bed3fe6ed37534a544113c1e4e3f), "bond")} ) {\n new x5, x6, x7, x8 in {\n @{Unforgeable(0xcca5b98e5dbcc18b0dbee1d0d647ebcbac28938528f094486663746af39592df)}!(x2, x6) |\n for( @{x9}, @{x10} <- @{x7} ) {\n new x11 in {\n @{(Unforgeable(0xc02c72fad36bc255f9f93a5b569d4d2bd502bed3fe6ed37534a544113c1e4e3f), "isBonded")}!(x0, x11) |\n for( @{x12} <- @{x11} ) {\n match x12 {\n true => @{x10}!(("Left", ("Public key ${pk} already bonded." %% {"pk" : x0}))) ;\n false => @{x10}!(("Right", x9))\n }\n }\n }\n } |\n for( @{x9} <- @{x6} ) {\n match x9 {\n ("Right", (x10, x11)) => @{("Either", "compose")}!(x10, [(Unforgeable(0xc02c72fad36bc255f9f93a5b569d4d2bd502bed3fe6ed37534a544113c1e4e3f), "validateBondAmount"), (Unforgeable(0xc02c72fad36bc255f9f93a5b569d4d2bd502bed3fe6ed37534a544113c1e4e3f), "validateBondingRate"), x7, x8], x5) |\n for( @{_}, @{x12} <- @{x8} ) {\n @{Unforgeable(0x4f306dc2c8ec82696544fad1a6c23266314e18f706c3766b985af7e783bc6092)}!(x10, x11, x12)\n } |\n for( @{x12} <- @{x5} ) {\n match x12 {\n ("Right", _) => @{Unforgeable(0x85402e07e431f7f07b6816ce4c3a8ac8e32b268baf90b9e413c5d918b91b3719)}!(x0, x1, x11, x3, x4) ;\n ("Left", x13) => @{(x2, "deposit")}!(x11, x10, x5) |\n for( @{_} <- @{x5} ) {\n @{x4}!((false, x13))\n }\n }\n } ;\n ("Left", x10) => @{x4}!((false, x10))\n }\n }\n }\n} |\nfor( @{x0}, @{x1}, @{x2}, @{x3} <= @{"BasicWallet"} ) {\n new x4 in {\n for( @{x5} <- @{x4} ) {\n match x5 {\n [] => @{x3}!([]) ;\n [x6] => new x7, x8, x9 in {\n @{x9}!(-1) |\n @{x3}!([x7]) |\n for( @{x10}, @{x11}, @{x12} <= @{(x7, "deposit")} ) {\n @{(x0, "deposit")}!(x10, x11, x12)\n } |\n for( @{x10} <= @{(x7, "getBalance")} ) {\n @{(x0, "getBalance")}!(x10)\n } |\n for( @{x10} <= @{(x7, "getNonce")} ) {\n for( @{x11} <- @{x9} ) {\n @{x10}!(x11) |\n @{x9}!(x11)\n }\n } |\n for( @{x10}, @{x11}, @{x12}, @{x13}, @{x14} <= @{(x7, "transfer")} ) {\n new x15 in {\n @{x8}!(x11, x10, x13, x12, x15) |\n for( @{x16} <- @{x15} ) {\n match x16 {\n true => new x17 in {\n @{(x0, "split")}!(x10, x17) |\n for( @{x18} <- @{x17} ) {\n match x18 {\n [] => @{x14}!("Overdraft") ;\n [x19] => @{x14}!("Success") |\n @{x13}!(x19)\n }\n }\n } ;\n false => @{x14}!("Invalid signature or nonce")\n }\n }\n }\n } |\n for( @{x10}, @{x11}, @{x12}, @{x13}, @{x14} <= @{x8} ) {\n for( @{x15} <- @{x9} ) {\n match (x10 == (x15 + 1)) {\n true => new x16, x17 in {\n @{"blake2b256Hash"}!(([x10, x11, x12]).toByteArray(), x17) |\n for( @{x18} <- @{x17} ) {\n @{x6}!(x18, (x13).hexToBytes(), (x2).hexToBytes(), x16) |\n for( @{x19} <- @{x16} ) {\n match x19 {\n true => @{x14}!(true) |\n @{x9}!(x10) ;\n false => @{x14}!(false) |\n @{x9}!(x15)\n }\n }\n }\n } ;\n false => @{x14}!(false) |\n @{x9}!(x15)\n }\n }\n }\n }\n }\n } |\n match x1 {\n "ed25519" => @{x4}!(["ed25519Verify"]) ;\n "secp256k1" => @{x4}!(["secp256k1Verify"]) ;\n _ => @{x4}!([])\n }\n }\n} |\nfor( @{x0}, @{x1}, @{x2}, @{x3}, @{x4} <= @{Unforgeable(0x85402e07e431f7f07b6816ce4c3a8ac8e32b268baf90b9e413c5d918b91b3719)} ) {\n new x5, x6, x7 in {\n for( @{x8} <- @{Unforgeable(0x151d45b278f53a0ffcd58a40ff6ed0e1a6298592932844bb95b8574dd02fdd69)} ; @{x9} <- @{Unforgeable(0x51ff32c8ed4b7b774ab5fe0c5e4f7e3b5bd4bdf31903ddf8e5ca65c6aa4070b5)} ) {\n @{Unforgeable(0xc1ecaf0168b913e5a5ff3aa785cd9dba308a4cda7d3bf89dc0e632d557b4e599)}!((x9).size(), x8, x5) |\n for( @{x10} <- @{x5} ) {\n @{x6}!(x9, x10, {}, x7) |\n for( @{x11} <- @{x7} ) {\n @{x4}!((true, "Bond successful!")) |\n @{Unforgeable(0x51ff32c8ed4b7b774ab5fe0c5e4f7e3b5bd4bdf31903ddf8e5ca65c6aa4070b5)}!((x11).set(x0,((x2 - x8), x1, x3, ((x9).size() + 1))))\n }\n }\n } |\n for( @{x8}, @{x9}, @{x10}, @{x11} <= @{x6} ) {\n match x8 {\n {x13 : (x14, x15, x16, x17)...x12} => @{x6}!(x12, x9, (x10).set(x13,((x14 + (x9).nth((x17 - 1))), x15, x16, x17)), x11) ;\n _ => @{x11}!(x10)\n }\n }\n }\n} |\nfor( @{x0}, @{x1}, @{x2} <= @{Unforgeable(0x4f306dc2c8ec82696544fad1a6c23266314e18f706c3766b985af7e783bc6092)} ) {\n new x3 in {\n @{(Unforgeable(0xc0e1db8bd0baabd4e0ecca7ec9804b6e53e3fc8ed0179b9272bd8291286bed41), "deposit")}!(x1, x0, x3) |\n for( @{x4} <- @{x3} ) {\n match x4 {\n true => @{x2}!(("Right", x0)) ;\n false => @{x2}!(("Left", "Deposit failed."))\n }\n }\n }\n} |\nfor( @{x0}, @{x1} <= @{"blake2b256Hash"} ) {\n Nil\n} |\nfor( @{x0} <= @{Unforgeable(0x00)} ) {\n Nil\n} |\nfor( @{x0} <= @{(Unforgeable(0xc0e1db8bd0baabd4e0ecca7ec9804b6e53e3fc8ed0179b9272bd8291286bed41), "sprout")} ) {\n @{(Unforgeable(0x27b2c01187ecb6461ca47aca42b7b6abc143c036ed2242b52b378a1cecf2b07c), "makePurse")}!(0, x0)\n} |\nfor( @{x0}, @{x1}, @{x2} <= @{("ListOps", "parMap")} ) {\n new x3, x4, x5 in {\n @{("ListOps", "map")}!(x0, x4, x3) |\n for( @{x6} <- @{x3} ) {\n @{("ListOps", "map")}!(x6, x5, x2)\n } |\n for( @{x6}, @{x7} <= @{x5} ) {\n for( @{x8} <- @{x6} ) {\n @{x7}!(x8)\n }\n } |\n for( @{x6}, @{x7} <= @{x4} ) {\n new x8 in {\n @{x7}!(x8) |\n @{x1}!(x6, x8)\n }\n }\n }\n} |\nfor( @{x0}, @{x1} <= @{"BasicWalletFaucet"} ) {\n new x2 in {\n @{x1}!(x2) |\n for( @{x3}, @{x4}, @{x5}, @{x6} <= @{x2} ) {\n new x7 in {\n @{(x0, "makePurse")}!(x3, x7) |\n for( @{x8} <- @{x7} ) {\n @{"BasicWallet"}!(x8, x4, x5, x6)\n }\n }\n }\n }\n} |\nfor( @{x0}, @{x1}, @{x2}, @{x3} <= @{("ListOps", "fold")} ) {\n new x4 in {\n for( @{x5}, @{x6}, @{x7} <= @{x4} ) {\n new x8 in {\n @{x2}!(x5, x6, x8) |\n for( @{x9} <- @{x8} ) {\n @{x7}!(false, x9)\n }\n }\n } |\n new x5 in {\n @{("ListOps", "partialFold")}!(x0, x1, x4, x5) |\n for( @{_}, @{x6} <- @{x5} ) {\n @{x3}!(x6)\n }\n }\n }\n} |\nfor( @{x0}, @{x1} <= @{Unforgeable(0x03)} ) {\n Nil\n} |\nfor( @{x0}, @{x1}, @{x2} <= @{("ListOps", "unorderedParMap")} ) {\n new x3, x4, x5, x6, x7 in {\n for( @{x8} <= @{x4} ) {\n for( @{x9} <- @{x7} ; @{x10} <- @{x6} ; @{x11} <- @{x5} ) {\n @{x5}!(x11) |\n match (x11 == (x10 + 1)) {\n true => @{("ListOps", "prepend")}!(x8, x9, x2) ;\n false => @{("ListOps", "prepend")}!(x8, x9, x7) |\n @{x6}!((x10 + 1))\n }\n }\n } |\n for( @{x8}, @{x9} <= @{x3} ) {\n match x8 {\n [x11...x10] => new x12 in {\n @{x3}!(x10, (x9 + 1)) |\n @{x1}!(x11, x12) |\n for( @{x13} <- @{x12} ) {\n @{x4}!(x13)\n }\n } ;\n _ => @{x5}!(x9)\n }\n } |\n match x0 {\n [] => @{x2}!([]) ;\n _ => @{x7}!([]) |\n @{x6}!(0) |\n @{x3}!(x0, 0)\n }\n }\n} |\nfor( @{x0}, @{x1}, @{x2} <= @{("ListOps", "map")} ) {\n new x3 in {\n @{("ListOps", "fold")}!(x0, [], x3, x2) |\n for( @{x4}, @{x5}, @{x6} <= @{x3} ) {\n new x7 in {\n @{x1}!(x4, x7) |\n for( @{x8} <- @{x7} ) {\n @{("ListOps", "append")}!(x5, x8, x6)\n }\n }\n }\n }\n} |\nfor( @{x0}, @{x1} <= @{(Unforgeable(0xc02c72fad36bc255f9f93a5b569d4d2bd502bed3fe6ed37534a544113c1e4e3f), "isBonded")} ) {\n for( @{x2} <- @{Unforgeable(0x51ff32c8ed4b7b774ab5fe0c5e4f7e3b5bd4bdf31903ddf8e5ca65c6aa4070b5)} ) {\n @{x1}!((x2).contains(x0)) |\n @{Unforgeable(0x51ff32c8ed4b7b774ab5fe0c5e4f7e3b5bd4bdf31903ddf8e5ca65c6aa4070b5)}!(x2)\n }\n} |\nfor( @{x0}, @{x1} <= @{"NonNegativeNumber"} ) {\n new x2, x3 in {\n @{x1}!(x2) |\n for( @{x4}, @{x5} <= @{(x2, "add")} ) {\n match (x4 >= 0) {\n true => for( @{x6} <- @{x3} ) {\n match ((x6 + x4) > x6) {\n true => @{x5}!(true) |\n @{x3}!((x6 + x4)) ;\n false => @{x5}!(false) |\n @{x3}!(x6)\n }\n } ;\n false => @{x5}!(false)\n }\n } |\n for( @{x4}, @{x5} <= @{(x2, "sub")} ) {\n match (x4 >= 0) {\n true => for( @{x6} <- @{x3} ) {\n match (x4 <= x6) {\n true => @{x5}!(true) |\n @{x3}!((x6 - x4)) ;\n false => @{x5}!(false) |\n @{x3}!(x6)\n }\n } ;\n false => @{x5}!(false)\n }\n } |\n for( @{x4} <= @{(x2, "value")} ) {\n for( @{x5} <- @{x3} ) {\n @{x4}!(x5) |\n @{x3}!(x5)\n }\n } |\n match (x0 >= 0) {\n true => @{x3}!(x0) ;\n _ => @{x3}!(0)\n }\n }\n} |\nfor( @{x0}, @{x1} <= @{("WalletCheck", "create")} ) {\n new x2 in {\n @{x2}!(false) |\n for( @{[x3, x4]}, @{x5} <= @{x0} ) {\n for( @{x6} <- @{x2} ) {\n match x6 {\n true => @{x4}!([false, "Already claimed wallet"]) |\n @{x2}!(x6) ;\n false => new x7, x8, x9 in {\n @{"keccak256Hash"}!(([x3, x4]).toByteArray(), x9) |\n for( @{x10} <- @{x9} ) {\n @{"secp256k1Verify"}!(x10, (x5).hexToBytes(), (("04" ++ x3)).hexToBytes(), x7) |\n for( @{x11} <- @{x7} ) {\n match x11 {\n true => @{("WalletCheck", "publicToAddr")}!(x3, x8) |\n for( @{x12} <- @{x8} ) {\n match (x12 == ((x0).slice(2,(x0).length())).hexToBytes()) {\n true => new x13 in {\n @{"BasicWallet"}!(x1, "secp256k1", ("04" ++ x3), x13) |\n @{x2}!(true) |\n for( @{[x14]} <- @{x13} ) {\n @{x4}!([true, x14]) |\n @{x3}!!(x14)\n }\n } ;\n false => @{x4}!([false, "Public key is not the preimage of hash"]) |\n @{x2}!(x6)\n }\n } ;\n false => @{x4}!([false, "Signature verification failed"]) |\n @{x2}!(x6)\n }\n }\n }\n }\n }\n }\n }\n }\n} |\nfor( @{x0}, @{x1} <= @{(Unforgeable(0xc0e1db8bd0baabd4e0ecca7ec9804b6e53e3fc8ed0179b9272bd8291286bed41), "split")} ) {\n new x2, x3 in {\n @{(Unforgeable(0xc0e1db8bd0baabd4e0ecca7ec9804b6e53e3fc8ed0179b9272bd8291286bed41), "sprout")}!(x2) |\n for( @{x4} <- @{x2} ) {\n @{(x4, "deposit")}!(x0, Unforgeable(0xc0e1db8bd0baabd4e0ecca7ec9804b6e53e3fc8ed0179b9272bd8291286bed41), x3) |\n for( @{x5} <- @{x3} ) {\n match x5 {\n true => @{x1}!([x4]) ;\n false => @{x1}!([])\n }\n }\n }\n }\n} |\nfor( @{x0}, @{x1}, @{x2}, @{x3} <= @{"secp256k1Verify"} ) {\n Nil\n} |\nfor( @{x0}, @{x1} <= @{Unforgeable(0xb8e2ba52606495c0e8949645b55a7b8ad14dc3147041f14a98517c5ab9d0146f)} ) {\n new x2 in {\n @{x1}!(x2) |\n for( @{x3}, @{x4}, @{x5} <= @{(x2, "deposit")} ) {\n new x6 in {\n @{(x4, Unforgeable(0xd498054223e4bf5c4bf037f2e4c0b9d93fe4eaa7e5051833be6558619f27ced8))}!(x3, x6) |\n for( @{x7} <- @{x6} ) {\n match x7 {\n true => @{(x0, "add")}!(x3, x5) ;\n false => @{x5}!(false)\n }\n }\n }\n } |\n for( @{x3} <= @{(x2, "getBalance")} ) {\n @{(x0, "value")}!(x3)\n } |\n for( @{x3}, @{x4} <= @{(x2, "split")} ) {\n new x5, x6 in {\n @{(x2, "sprout")}!(x5) |\n for( @{x7} <- @{x5} ) {\n @{(x7, "deposit")}!(x3, x2, x6) |\n for( @{x8} <- @{x6} ) {\n match x8 {\n true => @{x4}!([x7]) ;\n false => @{x4}!([])\n }\n }\n }\n }\n } |\n for( @{x3} <= @{(x2, "sprout")} ) {\n @{(Unforgeable(0x27b2c01187ecb6461ca47aca42b7b6abc143c036ed2242b52b378a1cecf2b07c), "makePurse")}!(0, x3)\n } |\n for( @{x3}, @{x4} <= @{(x2, Unforgeable(0xd498054223e4bf5c4bf037f2e4c0b9d93fe4eaa7e5051833be6558619f27ced8))} ) {\n @{(x0, "sub")}!(x3, x4)\n }\n }\n} |\nfor( @{x0}, @{x1}, @{x2} <= @{("ListOps", "foreach")} ) {\n new x3, x4 in {\n @{("ListOps", "fold")}!(x0, Nil, x3, x4) |\n for( @{_} <- @{x4} ) {\n @{x2}!(true)\n } |\n for( @{x5}, @{x6}, @{x7} <= @{x3} ) {\n new x8 in {\n @{x1}!(x5, x8) |\n for( @{_} <- @{x8} ) {\n @{x7}!(Nil)\n }\n }\n }\n }\n} |\nfor( @{x0} <= @{("Rev", "makePurse")} ) {\n @{(Unforgeable(0x27b2c01187ecb6461ca47aca42b7b6abc143c036ed2242b52b378a1cecf2b07c), "makePurse")}!(0, x0)\n} |\nfor( @{x0}, @{x1}, @{x2} <= @{("ListOps", "range")} ) {\n new x3 in {\n @{x3}!((x1 - 1), []) |\n for( @{x4}, @{x5} <= @{x3} ) {\n match (x4 < x0) {\n true => @{x2}!(x5) ;\n false => @{x3}!((x4 - 1), ([x4] ++ x5))\n }\n }\n }\n} |\nfor( @{x0}, @{x1}, @{x2}, @{x3} <= @{Unforgeable(0x0b)} ) {\n Nil\n} |\nfor( @{x0}, @{x1} <= @{("ListOps", "reverse")} ) {\n @{("ListOps", "fold")}!(x0, [], ("ListOps", "prepend"), x1)\n} |\nfor( @{x0}, @{x1}, @{x2} <= @{("Either", "compose")} ) {\n new x3 in {\n @{("ListOps", "fold")}!(x1, ("Right", x0), x3, x2) |\n for( @{x4}, @{x5}, @{x6} <= @{x3} ) {\n @{("Either", "flatMap")}!(x5, x4, x6)\n }\n }\n} |\nfor( @{x0}, @{x1}, @{x2} <= @{(Unforgeable(0xc0e1db8bd0baabd4e0ecca7ec9804b6e53e3fc8ed0179b9272bd8291286bed41), "deposit")} ) {\n new x3 in {\n @{(x1, Unforgeable(0xd498054223e4bf5c4bf037f2e4c0b9d93fe4eaa7e5051833be6558619f27ced8))}!(x0, x3) |\n for( @{x4} <- @{x3} ) {\n match x4 {\n true => @{(Unforgeable(0x2b6d3d1aeebe4f5cbffea98f589bc48516f3934851886f16c165190ea8ab62ef), "add")}!(x0, x2) ;\n false => @{x2}!(false)\n }\n }\n }\n} |\nfor( @{x0}, @{x1}, @{x2} <= @{("ListOps", "append")} ) {\n @{x2}!((x0 ++ [x1]))\n} |\nfor( @{x0}, @{x1}, @{x2} <= @{("ListOps", "prepend")} ) {\n @{x2}!(([x0] ++ x1))\n} |\nfor( @{x0}, @{x1}, @{x2} <= @{("Either", "map")} ) {\n match x0 {\n ("Right", x3) => new x4 in {\n @{x1}!(x3, x4) |\n for( @{x5} <- @{x4} ) {\n @{x2}!(("Right", x5))\n }\n } ;\n ("Left", _) => @{x2}!(x0)\n }\n} |\nfor( @{x0}, @{x1}, @{x2} <= @{Unforgeable(0xc1ecaf0168b913e5a5ff3aa785cd9dba308a4cda7d3bf89dc0e632d557b4e599)} ) {\n new x3, x4, x5, x6, x7, x8 in {\n @{("ListOps", "range")}!(1, (x0 + 1), x3) |\n for( @{x9} <- @{x3} ) {\n @{("ListOps", "map")}!(x9, x4, x5) |\n for( @{x10} <- @{x5} ) {\n @{("ListOps", "fold")}!(x10, 0, x6, x8) |\n for( @{x11} <- @{x8} ) {\n @{x2}!(([(((x10).nth(0) + x1) - x11)] ++ (x10).slice(1,x0)))\n }\n }\n } |\n for( @{x9}, @{x10}, @{x11} <= @{x6} ) {\n @{x11}!((x9 + x10))\n } |\n for( @{x9}, @{x10} <= @{x4} ) {\n @{x10}!((2 * x1) * ((x0 + 1) - x9) / (x0 * (x0 + 1)))\n }\n }\n} |\nfor( @{x0} <= @{Unforgeable(0x02)} ) {\n Nil\n} |\nfor( @{x0}, @{x1} <= @{Unforgeable(0xcca5b98e5dbcc18b0dbee1d0d647ebcbac28938528f094486663746af39592df)} ) {\n new x2, x3 in {\n @{(x0, "getBalance")}!(x2) |\n for( @{x4} <- @{x2} ) {\n @{(x0, "split")}!(x4, x3) |\n for( @{x5} <- @{x3} ) {\n match x5 {\n [] => @{x1}!(("Left", "Could not extract funds from given purse")) ;\n [x6] => @{x1}!(("Right", (x6, x4)))\n }\n }\n }\n }\n} |\nfor( @{x0}, @{x1} <= @{(Unforgeable(0x2b6d3d1aeebe4f5cbffea98f589bc48516f3934851886f16c165190ea8ab62ef), "sub")} ) {\n match (x0 >= 0) {\n true => for( @{x2} <- @{Unforgeable(0x651923755db27e1ed7e69bd7b8576330a2d20c7b16253b46e71b5c1386b91e2d)} ) {\n match (x0 <= x2) {\n true => @{x1}!(true) |\n @{Unforgeable(0x651923755db27e1ed7e69bd7b8576330a2d20c7b16253b46e71b5c1386b91e2d)}!((x2 - x0)) ;\n false => @{x1}!(false) |\n @{Unforgeable(0x651923755db27e1ed7e69bd7b8576330a2d20c7b16253b46e71b5c1386b91e2d)}!(x2)\n }\n } ;\n false => @{x1}!(false)\n }\n} |\nfor( @{x0}, @{x1} <= @{Unforgeable(0x09)} ) {\n Nil\n} |\nfor( @{x0}, @{x1} <= @{(Unforgeable(0xc02c72fad36bc255f9f93a5b569d4d2bd502bed3fe6ed37534a544113c1e4e3f), "validateBondAmount")} ) {\n new x2 in {\n @{(x0, "getBalance")}!(x2) |\n for( @{x3} <- @{x2} ; @{x4} <- @{Unforgeable(0x151d45b278f53a0ffcd58a40ff6ed0e1a6298592932844bb95b8574dd02fdd69)} ) {\n match ((x3 - x4) < 1) {\n true => @{x1}!(("Left", "Bond less than minimum!")) ;\n false => match ((x3 - x4) > 9223372036854775807) {\n true => @{x1}!(("Left", "Bond greater than maximum!")) ;\n false => @{x1}!(("Right", x0))\n }\n }\n }\n }\n} |\nfor( @{x0}, @{x1} <= @{(Unforgeable(0x27b2c01187ecb6461ca47aca42b7b6abc143c036ed2242b52b378a1cecf2b07c), "makePurse")} ) {\n new x2 in {\n @{("MakeMint", "int2NN")}!(x0, x2) |\n for( @{x3} <- @{x2} ) {\n @{Unforgeable(0xb8e2ba52606495c0e8949645b55a7b8ad14dc3147041f14a98517c5ab9d0146f)}!(x3, x1)\n }\n }\n} |\nfor( @{x0}, @{x1} <= @{(Unforgeable(0xc0e1db8bd0baabd4e0ecca7ec9804b6e53e3fc8ed0179b9272bd8291286bed41), Unforgeable(0xd498054223e4bf5c4bf037f2e4c0b9d93fe4eaa7e5051833be6558619f27ced8))} ) {\n @{(Unforgeable(0x2b6d3d1aeebe4f5cbffea98f589bc48516f3934851886f16c165190ea8ab62ef), "sub")}!(x0, x1)\n} |\nfor( @{x0}, @{x1} <= @{("MakeMint", "int2NN")} ) {\n new x2 in {\n @{"NonNegativeNumber"}!(x0, x2) |\n for( @{x3} <- @{x2} ) {\n @{x1}!(x3)\n }\n }\n} |\nfor( @{x0}, @{x1}, @{x2} <= @{("Either", "flatMap")} ) {\n match x0 {\n ("Right", x3) => @{x1}!(x3, x2) ;\n ("Left", _) => @{x2}!(x0)\n }\n} |\nfor( @{x0} <= @{(Unforgeable(0xc02c72fad36bc255f9f93a5b569d4d2bd502bed3fe6ed37534a544113c1e4e3f), "getBonds")} ) {\n for( @{x1} <- @{Unforgeable(0x51ff32c8ed4b7b774ab5fe0c5e4f7e3b5bd4bdf31903ddf8e5ca65c6aa4070b5)} ) {\n @{x0}!(x1) |\n @{Unforgeable(0x51ff32c8ed4b7b774ab5fe0c5e4f7e3b5bd4bdf31903ddf8e5ca65c6aa4070b5)}!(x1)\n }\n} |\nfor( @{x0}, @{x1} <= @{"sha256Hash"} ) {\n Nil\n} |\nfor( @{x0}, @{x1} <= @{Unforgeable(0x01)} ) {\n Nil\n} |\nfor( @{x0}, @{x1} <= @{("WalletCheck", "publicToAddr")} ) {\n new x2 in {\n @{"keccak256Hash"}!((x0).hexToBytes(), x2) |\n for( @{x3} <- @{x2} ) {\n @{x1}!((x3).slice(12,32))\n }\n }\n} |\nfor( @{x0} <= @{(Unforgeable(0x2b6d3d1aeebe4f5cbffea98f589bc48516f3934851886f16c165190ea8ab62ef), "value")} ) {\n for( @{x1} <- @{Unforgeable(0x651923755db27e1ed7e69bd7b8576330a2d20c7b16253b46e71b5c1386b91e2d)} ) {\n @{x0}!(x1) |\n @{Unforgeable(0x651923755db27e1ed7e69bd7b8576330a2d20c7b16253b46e71b5c1386b91e2d)}!(x1)\n }\n} |\nfor( @{x0}, @{x1}, @{x2}, @{x3} <= @{("ListOps", "partialFold")} ) {\n new x4 in {\n @{x4}!(x1, x0) |\n for( @{x5}, @{x6} <= @{x4} ) {\n match x6 {\n [x8...x7] => new x9 in {\n @{x2}!(x8, x5, x9) |\n for( @{x10}, @{x11} <- @{x9} ) {\n match x10 {\n true => @{x3}!(x10, x11) ;\n false => @{x4}!(x11, x7)\n }\n }\n } ;\n _ => @{x3}!(false, x5)\n }\n }\n }\n} |\nfor( @{x0}, @{x1} <= @{(Unforgeable(0xc02c72fad36bc255f9f93a5b569d4d2bd502bed3fe6ed37534a544113c1e4e3f), "validateBondingRate")} ) {\n @{x1}!(("Right", x0))\n} |\nfor( @{x0}, @{x1} <= @{Unforgeable(0x0a)} ) {\n Nil\n} |\nfor( @{x0}, @{x1}, @{x2} <= @{("ListOps", "zip")} ) {\n new x3 in {\n @{x3}!((x0, x1), [], x2) |\n for( @{x4}, @{x5}, @{x6} <= @{x3} ) {\n match x4 {\n ([x8...x7], [x10...x9]) => @{x3}!((x7, x9), (x5 ++ [(x8, x10)]), x6) ;\n _ => @{x6}!(x5)\n }\n }\n }\n} |\nfor( @{x0}, @{x1}, @{x2}, @{x3}, @{x4} <= @{"MakePoS"} ) {\n new x5, x6, x7, x8, x9, x10, x11 in {\n @{x6}!(x3) |\n @{x4}!(x5) |\n @{x7}!!(x1) |\n for( @{x12}, @{x13}, @{x14}, @{x15}, @{x16} <= @{(x5, "bond")} ) {\n new x17, x18, x19, x20 in {\n @{x8}!(x14, x18) |\n for( @{x21}, @{x22} <- @{x19} ) {\n new x23 in {\n @{(x5, "isBonded")}!(x12, x23) |\n for( @{x24} <- @{x23} ) {\n match x24 {\n true => @{x22}!(("Left", ("Public key ${pk} already bonded." %% {"pk" : x12}))) ;\n false => @{x22}!(("Right", x21))\n }\n }\n }\n } |\n for( @{x21} <- @{x18} ) {\n match x21 {\n ("Right", (x22, x23)) => @{("Either", "compose")}!(x22, [(x5, "validateBondAmount"), (x5, "validateBondingRate"), x19, x20], x17) |\n for( @{_}, @{x24} <- @{x20} ) {\n @{x9}!(x22, x23, x24)\n } |\n for( @{x24} <- @{x17} ) {\n match x24 {\n ("Right", _) => @{x10}!(x12, x13, x23, x15, x16) ;\n ("Left", x25) => @{(x14, "deposit")}!(x23, x22, x17) |\n for( @{_} <- @{x17} ) {\n @{x16}!((false, x25))\n }\n }\n } ;\n ("Left", x22) => @{x16}!((false, x22))\n }\n }\n }\n } |\n for( @{x12} <= @{(x5, "getBonds")} ) {\n for( @{x13} <- @{x6} ) {\n @{x12}!(x13) |\n @{x6}!(x13)\n }\n } |\n for( @{x12}, @{x13} <= @{(x5, "isBonded")} ) {\n for( @{x14} <- @{x6} ) {\n @{x13}!((x14).contains(x12)) |\n @{x6}!(x14)\n }\n } |\n for( @{x12}, @{x13} <= @{(x5, "validateBondAmount")} ) {\n new x14 in {\n @{(x12, "getBalance")}!(x14) |\n for( @{x15} <- @{x14} ; @{x16} <- @{x7} ) {\n match ((x15 - x16) < x1) {\n true => @{x13}!(("Left", "Bond less than minimum!")) ;\n false => match ((x15 - x16) > x2) {\n true => @{x13}!(("Left", "Bond greater than maximum!")) ;\n false => @{x13}!(("Right", x12))\n }\n }\n }\n }\n } |\n for( @{x12}, @{x13} <= @{(x5, "validateBondingRate")} ) {\n @{x13}!(("Right", x12))\n } |\n for( @{x12}, @{x13}, @{x14} <= @{x11} ) {\n new x15, x16, x17, x18, x19, x20 in {\n @{("ListOps", "range")}!(1, (x12 + 1), x15) |\n for( @{x21} <- @{x15} ) {\n @{("ListOps", "map")}!(x21, x16, x17) |\n for( @{x22} <- @{x17} ) {\n @{("ListOps", "fold")}!(x22, 0, x18, x20) |\n for( @{x23} <- @{x20} ) {\n @{x14}!(([(((x22).nth(0) + x13) - x23)] ++ (x22).slice(1,x12)))\n }\n }\n } |\n for( @{x21}, @{x22}, @{x23} <= @{x18} ) {\n @{x23}!((x21 + x22))\n } |\n for( @{x21}, @{x22} <= @{x16} ) {\n @{x22}!((2 * x13) * ((x12 + 1) - x21) / (x12 * (x12 + 1)))\n }\n }\n } |\n for( @{x12}, @{x13}, @{x14}, @{x15}, @{x16} <= @{x10} ) {\n new x17, x18, x19 in {\n for( @{x20} <- @{x7} ; @{x21} <- @{x6} ) {\n @{x11}!((x21).size(), x20, x17) |\n for( @{x22} <- @{x17} ) {\n @{x18}!(x21, x22, {}, x19) |\n for( @{x23} <- @{x19} ) {\n @{x16}!((true, "Bond successful!")) |\n @{x6}!((x23).set(x12,((x14 - x20), x13, x15, ((x21).size() + 1))))\n }\n }\n } |\n for( @{x20}, @{x21}, @{x22}, @{x23} <= @{x18} ) {\n match x20 {\n {x25 : (x26, x27, x28, x29)...x24} => @{x18}!(x24, x21, (x22).set(x25,((x26 + (x21).nth((x29 - 1))), x27, x28, x29)), x23) ;\n _ => @{x23}!(x22)\n }\n }\n }\n } |\n for( @{x12}, @{x13}, @{x14} <= @{x9} ) {\n new x15 in {\n @{(x0, "deposit")}!(x13, x12, x15) |\n for( @{x16} <- @{x15} ) {\n match x16 {\n true => @{x14}!(("Right", x12)) ;\n false => @{x14}!(("Left", "Deposit failed."))\n }\n }\n }\n } |\n for( @{x12}, @{x13} <= @{x8} ) {\n new x14, x15 in {\n @{(x12, "getBalance")}!(x14) |\n for( @{x16} <- @{x14} ) {\n @{(x12, "split")}!(x16, x15) |\n for( @{x17} <- @{x15} ) {\n match x17 {\n [] => @{x13}!(("Left", "Could not extract funds from given purse")) ;\n [x18] => @{x13}!(("Right", (x18, x16)))\n }\n }\n }\n }\n }\n }\n} |\nfor( @{x0}, @{x1}, @{x2}, @{x3} <= @{"ed25519Verify"} ) {\n Nil\n} |\nfor( @{x0}, @{x1}, @{x2} <= @{("ListOps", "indexOf")} ) {\n new x3 in {\n for( @{x4}, @{x5}, @{x6} <= @{x3} ) {\n @{x6}!((x4 == x1), (x5 + 1))\n } |\n new x4 in {\n @{("ListOps", "partialFold")}!(x0, -1, x3, x4) |\n for( @{x5}, @{x6} <- @{x4} ) {\n match x5 {\n true => @{x2}!(x6) ;\n false => @{x2}!(-1)\n }\n }\n }\n }\n} |\nfor( @{x0}, @{x1} <= @{(Unforgeable(0x2b6d3d1aeebe4f5cbffea98f589bc48516f3934851886f16c165190ea8ab62ef), "add")} ) {\n match (x0 >= 0) {\n true => for( @{x2} <- @{Unforgeable(0x651923755db27e1ed7e69bd7b8576330a2d20c7b16253b46e71b5c1386b91e2d)} ) {\n match ((x2 + x0) > x2) {\n true => @{x1}!(true) |\n @{Unforgeable(0x651923755db27e1ed7e69bd7b8576330a2d20c7b16253b46e71b5c1386b91e2d)}!((x2 + x0)) ;\n false => @{x1}!(false) |\n @{Unforgeable(0x651923755db27e1ed7e69bd7b8576330a2d20c7b16253b46e71b5c1386b91e2d)}!(x2)\n }\n } ;\n false => @{x1}!(false)\n }\n} |\nfor( @{x0}, @{x1} <= @{"keccak256Hash"} ) {\n Nil\n}', 'timestamp': 1540215055121, 'faultTolerance': -1.0, 'mainParentHash': '8d08dd96ef1152951b80b551fb1bfb928f0a5e46742038da52c2be39e5f16d26', 'parentsHashList': ['8d08dd96ef1152951b80b551fb1bfb928f0a5e46742038da52c2be39e5f16d26'], 'sender': 'eabe5a1a0750d2a8745709bb0bdb24f63c6a8ac3a887b9bed40b34b0598ddf08', 'shardId': 'rchain'}
block.get('blockNumber')
1
The connection provided by the library can be used in a with
python statement
# all previous operations in one context
with casper.create_connection(host=RNODE_HOST) as connection:
# deploy / propose
casper.deploy(connection, rholang_code)
print(casper.propose(connection))
# handle output
output = casper.get_blocks(connection, depth=1)
block_hash = output.pop().get('blockHash')
block = casper.get_block(connection, block_hash=block_hash)
print(f"Current block number is {block.get('blockNumber')}\nwith hash {block_hash}")
# connection here is closed
{'success': True, 'message': 'Success! Block 40d0252c21... created and added.'} Current block number is 2 with hash 40d0252c212fb57e09a812b8356d06926ead79becc86e4c4e02c6f3d543a275c
Now we'll take advantage of the listenForDataAtName
functionality inside the RChain gRPC definition.
We can specify a channel to receive the results of the new block proposed.
output_placeholder = "your_channel_name"
rholang_code = f"""
{output_placeholder}!("bar")
"""
print(rholang_code)
# your_channel_name will be replaced with @"RANDOMNAME"
your_channel_name!("bar")
with casper.create_connection(host=RNODE_HOST) as connection:
block = casper.run_and_get_value_from(
connection=connection,
term=rholang_code,
# this name gets replaced with a channel name
output_placeholder=output_placeholder
)
# what's used for replacing the placeholder
import secrets
ack_name = f'ack_{secrets.token_hex(30)}'
ack_name
'ack_b2859ffa8914757d71c63ff685b5b880f36f0a1e69952a7d1c2f23b44008'
block
{'status': 'Success', 'blockResults': [{'postBlockData': [['bar']], 'block': {'blockHash': '14e19feeba18e8840bd85e2dda5d7bf93066c10e228ebbffe0d9ad23f541d276', 'blockSize': '1144', 'blockNumber': 6, 'deployCount': 1, 'tupleSpaceHash': 'd7184933b08e4d3e23afc3451de901a4c6fe0507cff15f7349ecf6cf051a50a8', 'timestamp': 1540215534547, 'faultTolerance': -1.0, 'mainParentHash': '05ff25f824832ff5219e01be5eb4adeb05976ad5612d7b74981e2002915e708d', 'parentsHashList': ['05ff25f824832ff5219e01be5eb4adeb05976ad5612d7b74981e2002915e708d'], 'sender': 'eabe5a1a0750d2a8745709bb0bdb24f63c6a8ac3a887b9bed40b34b0598ddf08'}}], 'length': 1}
results = block.get('blockResults').pop()
for message in results.get('postBlockData'):
print("Received: ", message.pop())
Received: bar
Using the techniques tested so far we can now:
unforgeable name
so - all programmatically from Python -
we can (almost) call a contract in a secure way.
ack_name = 'placeholder_something'
rholang_code = """
new newName, ack, register(`rho:registry:insertArbitrary`), stdout(`rho:io:stdout`) in
{
register!(bundle+{*newName}, *ack)
|
contract newName(@msg) = {
stdout!("Contract called with message: " ++ msg)
}
|
for (@msg <- ack) {
%s!(["From registry: ", msg])
}
}
""" % ack_name
print(rholang_code)
new newName, ack, register(`rho:registry:insertArbitrary`), stdout(`rho:io:stdout`) in { register!(bundle+{*newName}, *ack) | contract newName(@msg) = { stdout!("Contract called with message: " ++ msg) } | for (@msg <- ack) { placeholder_something!(["From registry: ", msg]) } }
# run and get the value in the block output
with casper.create_connection(host=RNODE_HOST) as connection:
block = casper.run_and_get_value_from(connection, rholang_code, ack_name)
from pprint import pprint
pprint(block)
{'blockResults': [{'block': {'blockHash': '8d40c550e9cd169c4bf80eb2d598835aed674f72becf933571d2406ea835a25e', 'blockNumber': 9, 'blockSize': '3185', 'deployCount': 1, 'faultTolerance': -1.0, 'mainParentHash': '40472937049565f99775e329dfdb334b5af4a362baf38138ea5b3cd836f2c3c8', 'parentsHashList': ['40472937049565f99775e329dfdb334b5af4a362baf38138ea5b3cd836f2c3c8'], 'sender': 'eabe5a1a0750d2a8745709bb0bdb24f63c6a8ac3a887b9bed40b34b0598ddf08', 'timestamp': 1540215840006, 'tupleSpaceHash': '2c0846b670edfd62a536b5e6cfa7307037c5144105f7676075f755f0a844b95c'}, 'postBlockData': [[{'ps': [['From registry: '], ['rho:id:c1wqhooe5f9f8st4qe69zs7t5jrj8zszbx4zd51qu7pi5sdc6hh1iw']]}]]}], 'length': 1, 'status': 'Success'}
We are looking to find a better way to handle the "post block data"
post_block_data = block.get('blockResults').pop().get('postBlockData')
post_block_data
[[{'ps': [['From registry: '], ['rho:id:c1wqhooe5f9f8st4qe69zs7t5jrj8zszbx4zd51qu7pi5sdc6hh1iw']]}]]
list(post_block_data[0][0].values())[0][1][0]
'rho:id:c1wqhooe5f9f8st4qe69zs7t5jrj8zszbx4zd51qu7pi5sdc6hh1iw'
# alternative with json/regular expression
import re
import json
post_block_str = json.dumps(post_block_data)
match = re.search(r"rho:id:[^\"]+", post_block_str)
registry_id = match.group()
registry_id
'rho:id:c1wqhooe5f9f8st4qe69zs7t5jrj8zszbx4zd51qu7pi5sdc6hh1iw'
rholang_code = """
new return, lookup(`rho:registry:lookup`), stdout(`rho:io:stdout`) in
{
lookup!(`%s`, *return) |
for (myContract <- return) {
myContract!("Proof test")
}
}
""" % registry_id
print(rholang_code)
new return, lookup(`rho:registry:lookup`), stdout(`rho:io:stdout`) in { lookup!(`rho:id:c1wqhooe5f9f8st4qe69zs7t5jrj8zszbx4zd51qu7pi5sdc6hh1iw`, *return) | for (myContract <- return) { myContract!("Proof test") } }
with casper.create_connection(host=RNODE_HOST) as connection:
print(casper.deploy(connection, rholang_code))
print(casper.propose(connection))
{'success': True, 'message': 'Success!'} {'success': True, 'message': 'Success! Block 06319c14c3... created and added.'}
go check the logs!