http://www.7klian.com

利用Python建设智能合约区块链后端处事器应用

24
 6async def submit_transaction(request):
3}
113    # Get reference to the contract method to be called
117    try:
 [email protected](“/contracts/<contract>”)
 2…
 1# server/contracting_server.py
14
 53    assigns = [n for n in ast.walk(tree) if isinstance(n, ast.Assign)]
· 发送事务
3. method: 我们要定位的智能合约的名称。
21        func_name = definition.name
31        return response.json({‘status’: 1, ‘error’: err})
2    “status”: 1,
17
 85    # Get value
欣赏到我们的新端点http://localhost:3737/contracts/my_token,您将看到有关我们智能合约的所有元数据。
欣赏到我们的新端点http://localhost:3737/contracts/my_token/S?key=me以获取“ me”的余额。

 1# server/contracting_server.py
21    # If the variable or the value didn’t exists return None
 42    tree = ast.parse(contract_code)

35    #Return all Information
 39    hashes = []
11    funcs = []

28    for assign in assigns:
10    # Parse key from request object
 56            if assign.value.func.id == ‘Variable’:
103    # Set the sender
获取变量的当前状态
 5client = ContractingClient()
 2…
 47        func_name = definition.name
 83    k = client.raw_driver.make_key(contract=contract, variable=variable, args=key)
· 获取事务状态
39        ‘methods’: funcs,
 91
 76        return response.json({‘error’: ‘{} does not exist’.format(contract)}, status=404)
 5async def get_variable(request, contract, variable):

变动为不存在的密钥。如“ you”,将返回空值,因为它不存在于状态中。

 [email protected](“/”, methods=[“POST”,])
 11    code = f.read()
  2
 2from sanic import Sanic, response
 41    # Parse the code into a walkable tree
 [email protected](“/contracts”)
29        return response.json({‘status’: 0})
 6    # Check if contract exists. If not, return error
20    for definition in function_defs:
要到达此端点,我们需要建设一个http POST请求。最简朴的要领是利用如下所示的curl语句。挪用我们的要领需要以下信息:
· Code
 67        ‘hashes’: hashes
112
第二种要领是我们的传输要领,我们可以看到它需要2个参数,AMOUNT和RECEIVER。
· variable:要查询的状态变量(单个或哈希)
21        return response.json({‘error’: ‘{} does not exist’.format(contract)}, status=404)
  8client = ContractingClient()
23
4import ast
2. contract:我们要定位的智能条约的名称。
  3from sanic import Sanic, response
 93    return response.json({‘value’: value}, status=200, dumps=encode)
1. sender: 发送生意业务的人的身份。这将成为我们智能合约中的ctx.caller。
我们的合约网络
处事器不需要做任何这些。我们不需要区块或共鸣,所以我们可以简朴地写我们的代价告诉。这有助于快速成长。

这是我们方才建设的整个开拓处事器代码。
 32
19    function_defs = [n for n in ast.walk(tree) if isinstance(n, ast.FunctionDef)]
106    # Get reference to contract
 58            elif assign.value.func.id == ‘Hash’:
11    sender = request.json.get(‘sender’)
 9    return response.json({‘contracts’: contracts})
36    return response.json({
应该获得这个输出,指示您的web处事器处于勾当状态,并监听端口3737。
114    method = getattr(contract, method_name)
查察我们
区块链上所有合约的名称
 65        ‘methods’: funcs,
这个端点需要比以前的端点更多的信息。
102
16    tree = ast.parse(contract_code)
11if __name__ == “__main__”:
3import ast
22        kwargs = [arg.arg for arg in definition.args.args]
18
· S-存储状态的变量
 2…
 9    client.submit(code, name=’my_token’)
 28# Get the source code of a specific contract
1localhost:3737/contracts/my_token/S?key=me
 64        ‘code’: contract_code,

全仓库开拓人员习惯于同时开拓后端和前端。利用作为后端的问题是,它们的配置凡是很巨大,与之交互更巨大。这会减慢存储和用户交互之间的简朴交互。
 89    if value is None:
· key:查询时提供哈希的key
25
GET /contracts/<variable>
20
确保我们的处事器正在响

17    contract = client.get_contract(contract_name)
14    client.signer = sender
 5# Get all Contracts in State (list of names)
 13

建设一个新的处事器目次和一个名为contracting_server.py的文件。

 8    return response.json({‘status’: ‘online’})
通过添加以下代码来建设端点,以提供挪用client.get_contracts()的功效。
12…
 81
44if __name__ == “__main__”:
我们需要ast包来遍历代码,因此请在contracting_server.py顶部添加该导入。
31                variables.append(assign.targets[0].id.lstrip(‘__’))
 3return response.json({‘contracts’: contracts})
27    try:
 97    # Get transaction details
 26
 4
14
2from sanic import Sanic, response
 96async def submit_transaction(request):
18    # Parse out all functions
假如实验发送太多令牌,则会返回断言错误。
 7with open(‘my_token.py’) as f:
 [email protected](“/contracts/<contract>/<variable>”)
16    k = client.raw_driver.make_key(contract=contract, variable=variable, args=key)
105
 57                variables.append(assign.targets[0].id.lstrip(‘__’))
 8    contracts = client.get_contracts()
 51
 94
GET /contracts
将该导入语句添加到contracting_server.py的顶部。
在真正的区块链上,生意业务功效不是即时的,因为它需要列队才气被节点处理惩罚。当您提交生意业务时,区块链将回覆一个收据(称为生意业务哈希),然后您可以利用它来查找生意业务的乐成。
4}
 33    # Return an error response if the code does not exist
125    app.run(host=”0.0.0.0″, port=3737)

1python3 test/contracting_server.py
 3
33…
23        return response.json({‘value’: None}, status=404)
4  “method”: “transfer”,
 2…
提交生意业务记录
 45    function_defs = [n for n in ast.walk(tree) if isinstance(n, ast.FunctionDef)]
119        return response.json({‘status’: 0})
此刻,当智能合约处事器启动时,它将默认添加我们的智能合约。
37        ‘name’: contract,
Lamden的主节点已经通过API向民众区块链提供处事。假如我们但愿我们的签约处事器仿照区块链,这是一个很好的起点。
40        ‘variables’: variables,
将此粘贴到contracting_server.py。
GET /ping
 54    for assign in assigns:

 78    key = request.args.get(‘key’)
 10with open(‘my_token.py’) as f:
 77    # Parse key from request object
GET /contracts/<contract>
10
  5
26    return response.json({‘value’: value}, status=200, dumps=encode)

 9    method_name = request.json.get(‘method’)
  4import ast
 6
115
 79    if key is not None:
3    “error”: “Transfer amount exceeds available token balance”
26    # Parse out all defined state Variables and Hashes
POST /
20    if contract_name is None:
 35        return response.json({‘error’: ‘{} does not exist’.format(contract)}, status=404)
接下来我们需要安装Sanic处事器,它将是我们的
Python web处事器。
到今朝为止,我们的API正在形成相当好的状态。此刻我们需要做的就是接管一个生意业务进入我们的网络。
 73    # Check if contract exists. If not, return error
假如您在这里碰着错误,,请查抄mongodb是否已安装并启动。
 14app = Sanic(“contracting server”)
 74    contract_code = client.raw_driver.get_contract(contract)
 1#server/contracting_server.py
 38    variables = []
6from contracting.db.encoder import encode
 25    return response.json({‘contracts’: contracts})
· key-要为其分派值的密钥的名称
 50        funcs.append({‘name’: func_name, ‘arguments’: kwargs})
2
10    kwargs = request.json.get(‘args’)
 31    contract_code = client.raw_driver.get_contract(contract)
 23async def get_contracts(request):
 80        key = key.split(‘,’)
 5
 9    contract_code = client.raw_driver.get_contract(contract)
虽然您可以利用选择的任何措施来测试API(譬喻Postman或Paw)。只需利用正文JSON并将请求发送到http:// localhost:3737/,您就应该返回此响应。
25    # If there was a value, return it formatted
1{
  1# server/contracting_server.py
 15

首先复制sanic快速启动代码,并确保我们可以启动简朴的处事器。
 34    if contract_code is None:

完美,我们此刻可以添加一些端点来返回有关我们的合约情况的信息。
然后我们可以利用之前建造的变量端点来查抄状态是否已变动

13    # Set the sender
116    # Call method with supplied arguments and return status
15    # Create the key contracting will use to get the value
25
 18async def ping(request):
15    # Parse the code into a walkable tree
 7async def get_contract(request, contract):
122
 9        return response.json({‘error’: ‘{} does not exist’.format(contract)}, status=404)
12    if key is not None:
 60
 [email protected](“/ping”)
 8    code = f.read()
 [email protected](“/”, methods=[“POST”,])
[email protected](“/ping”)
 24    contracts = client.get_contracts()
· 从智能合约获取当前状态
然后从项目目次运行
27…
22
 46    for definition in function_defs:
100    kwargs = request.json.get(‘args’)
 61    #Return all Information
我们需要从收缩到正确名目化我们的值举办传输的encode函数。
107    contract = client.get_contract(contract_name)
 [email protected](“/contracts/<contract>”)
masternode API有很多与块,随机数和事务哈希有关的路由。可是我们的订约网络处事器不会耗费许多精神或告竣共鸣,因此我们不需要任何这些。
 1# server/contracting_server.py
16    # Get reference to contract
 63        ‘name’: contract,
我们需要什么?

22    if value is None:
110    if contract_name is None:
· State Variables
 72async def get_variable(request, contract, variable):
 7    contract_code = client.raw_driver.get_contract(contract)
7from contracting.client import ContractingClient
3  “contract”: “my_token”,
3from sanic import Sanic, response
33                hashes.append(assign.targets[0].id.lstrip(‘__’))
 21# Get all Contracts in State (list of names)
 3# If there was a value, return it formatted
118        method(**kwargs)
  9
1pip3 install sanic
6}’ -v -i ‘http://localhost:3737/’
1# server/contracting_server.py
 88    # If the variable or the value didn’t exists return None
我们还要测试一下我们的API的ping端点是否正常运行。打开您的Internet欣赏器,然后导航到http://localhost:3737 / ping。您将得到一个JSON状态工具,指示处事器在线!

 6# Get the source code of a specific contract
 69
32if __name__ == “__main__”:
1# server/contracting_server.py
此刻添加此新路由的代码,然后从头启动处事器。
123
 3# Return the current state of a variable
 8    if contract_code is None:
默认环境下,条约包仅包括1个合约(提交合约)。因此我们需要添加我们的合约来相识合约。通过添加签约客户并挪用前一教程的测试中的要领来做到这一点。
我们可以利用此端点获取有关合约的元数据。这对付调试我们本身的智能合约或显示有关智能合约的动态信息很有用。
可以或许查询S哈希的状态以获取我们的余额会很有辅佐。我们已经在测试文件中做到了这一点,因此让它动态化并重新端点提供它,以便今后可用于我们的网络应用措施。
19    value = client.raw_driver.get(k)
43
124if __name__ == “__main__”:
9…
13    hashes = []
1{
查察有关我们区块链上智能合约的特定信息:
 30    # Use the client raw_driver to get the contract code from the db
12
 7    # Get transaction details
17
30    except Exception as err:
添加此新路由的代码并从头启动处事器。
4
6from contracting.client import ContractingClient
 1# server/contracting_server.py
5from contracting.db.encoder import encode
 4from contracting.client import ContractingClient
 37    funcs = []
client.get_contracts()将返回加载到签约客户端中的所有智能合约的列表。
 99    method_name = request.json.get(‘method’)
5  “args”: “{“amount”:10,”receiver”:”you”}”
32            elif assign.value.func.id == ‘Hash’:
 87
 16# Make sure the server is online
120    except Exception as err:

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读