Skip to content

Commit

Permalink
add getContract, getTransactions and deploy contracts in view.py
Browse files Browse the repository at this point in the history
  • Loading branch information
youwenbusi committed Aug 21, 2020
1 parent 7e6a262 commit 862fbf0
Show file tree
Hide file tree
Showing 5 changed files with 278 additions and 33 deletions.
16 changes: 16 additions & 0 deletions commands/event_sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,22 @@ def event_sync(mixer_addr: str):

indexed_value = None
try:
tag = True
print("check whether existed mixer contract")
sqlSearchMixer = "select * from contract where conType = %s"
MIXERTYPE = "mixer"
mixer_addr = ""
while tag:
cursor.execute(sqlSearchMixer, [MIXERTYPE])
resultMixer = cursor.fetchall()
db.commit()
if resultMixer:
tag = False
mixer_addr = resultMixer[0][2]
print("found mixer contract: ", mixer_addr)
else:
print("could not find mixer contract, waiting...")
time.sleep(10)
bcos_event = BcosEventCallback()
bcos_event.setclient(BcosClient())
print(bcos_event.client.getinfo())
Expand Down
101 changes: 99 additions & 2 deletions zkclientapp/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
from zeth.utils import EtherValue, from_zeth_units
from python_web3.eth_account.account import Account
from commands.constants import USER_DIR, FISCO_ADDRESS_FILE, WALLET_DIR_DEFAULT, ADDRESS_FILE_DEFAULT
from commands.constants import DATABASE_DEFAULT_ADDRESS, DATABASE_DEFAULT_PORT, DATABASE_DEFAULT_USER, DATABASE_DEFAULT_PASSWORD, DATABASE_DEFAULT_DATABASE

from django.shortcuts import render
from api.zeth_messages_pb2 import ZethNote
import json
Expand All @@ -26,7 +28,16 @@
from zeth.wallet import _ensure_dir
from . import models
from .models import merkletree

import pymysql
db = pymysql.connect(
host = DATABASE_DEFAULT_ADDRESS,
port = DATABASE_DEFAULT_PORT,
user = DATABASE_DEFAULT_USER,
password = DATABASE_DEFAULT_PASSWORD,
database = DATABASE_DEFAULT_DATABASE,
charset='utf8'
)
cursor = db.cursor()
'''
The wallet of user is designed as that every wallet need to be specified a username and store the
reference accounts and assets data of that user. There two kinds of account in the wallet of a user,
Expand Down Expand Up @@ -275,6 +286,12 @@ def depositBac(request) -> None:
result['commits'] = commits
result['total_value'] = total.ether()
'''
traType = "deposit"
output_specstr = output_specs[0] + ';' + output_specs[1]
timestr = time.strftime('%Y-%m-%d %H:%M:%S')
sqlInsert = "insert into transactions (traType, username, vin, vout, output_specs, time) values (%s, %s, %s, %s, %s, %s);"
cursor.execute(sqlInsert, [traType, req['username'], req['token_amount'], 0, output_specstr, timestr])
db.commit()
result['status'] = 0
result['text'] = 'deposit success'
return JsonResponse(result)
Expand Down Expand Up @@ -362,6 +379,17 @@ def mixBac(request) -> None:
result['commits'] = commits
result['total_value'] = total.ether()
'''
traType = "mix"
timestr = time.strftime('%Y-%m-%d %H:%M:%S')
inputstr = ""
for note_id in req['input_notes']:
inputstr = inputstr + note_id + ';'
outputstr = ""
for out_spec in req['output_specs']:
outputstr = outputstr + out_spec + ';'
sqlInsert = "insert into transactions (traType, username, vin, vout, input_notes, output_specs, time) values (%s, %s, %s, %s, %s, %s, %s);"
cursor.execute(sqlInsert, [traType, req['username'], req['vin'], req['vout'], inputstr, outputstr, timestr])
db.commit()
result['status'] = 0
result['text'] = 'mix success'
return JsonResponse(result)
Expand Down Expand Up @@ -433,4 +461,73 @@ def getCommits(request) -> None:
result['status'] = 1
result['text'] = 'your account is not recorded in server, please import it firstly or create a new one'
return JsonResponse(result)
'''
'''
def getContract(request) -> None:
result = {}
sqlSearch = "select * from contract"
cursor.execute(sqlSearch)
results = cursor.fetchall()
db.commit()
resultbac = results[0]
resultmixer = results[1]
bacContract = {
"contractName": resultbac[0],
"contractType": resultbac[1],
"contractAddr": resultbac[2],
"createtime": resultbac[3],
"ownerAddr": resultbac[4],
"totalAmount": resultbac[5],
"shortName": resultbac[6],
}
mixerContract = {
"contractName": resultmixer[0],
"contractType": resultmixer[1],
"contractAddr": resultmixer[2],
"createtime": resultmixer[3],
"ownerAddr": resultmixer[4],
"totalAmount": resultmixer[5],
"shortName": resultmixer[6],
}
result['contracts'] = {
"bacContract": bacContract,
"mixerContract": mixerContract,
}
result['status'] = 0
return JsonResponse(result)


def getTransactions(request) -> None:
result = {}
req = json.loads(request.body)
keystore_file = "{}/{}/{}".format(USER_DIR, req['username'], FISCO_ADDRESS_FILE)
if exists(keystore_file):
with open(keystore_file, "r") as dump_f:
keytext = json.load(dump_f)
privatekey = Account.decrypt(keytext, req['password'])
if privatekey:
sqlSearch = "select * from transactions where username = %s"
cursor.execute(sqlSearch, [req['username']])
results = cursor.fetchall()
db.commit()
result['transactions'] = []
for resultTra in results:
transacInfo = {
"trasactionType": resultTra[0],
"senderName": resultTra[1],
"publicInput": resultTra[2],
"publicOutput": resultTra[3],
"input_notes": resultTra[4],
"output_specs": resultTra[5],
"time": resultTra[6],
}
result['transactions'].append(transacInfo)
result['status'] = 0
return JsonResponse(result)
else:
result['status'] = 1
result['text'] = 'password not true'
return JsonResponse(result)
else:
result['status'] = 1
result['text'] = 'your account is not recorded in server, please import it firstly or create a new one'
return JsonResponse(result)
63 changes: 63 additions & 0 deletions zkclientapp/testsql.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@

import pymysql
import time
import re
db = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='8614',
database='merkle',
charset='utf8',
)
cursor = db.cursor()
#treedata = '{"depth": 5, "default_values": ["23453ee476428c4bd601f5f74b09fabe5af02f20a121803b46e728ad02dc3c"], "layers": [["12768d51ae7923fc132b23f9d91999384720785109715b1a66b12bf4b337b101"], ["0abd670539bfe8eef99ff2ef9dc797a5195ab496d738c6d94855cd7afdd2388a"]]}'
#treedata = pymysql.escape_string(treedata)
#sqlCreate = "create table tree (id INT auto_increment PRIMARY KEY ,treedata TEXT(10000) NOT NULL)"
#sqlInsert = "insert into tree (treedata) values (%s)"
#treedata1 = '{"depth":5}'
#sqlUpdate = "update tree set treedata=%s where id=1"
id = 0
sqlSearch = "show tables"
cursor.execute(sqlSearch)
results = cursor.fetchall()
print("results: ", results)
tables_list = re.findall('(\'.*?\')',str(results))
print("tables_list: ", tables_list)
tables_list = [re.sub("'",'',each) for each in tables_list]
print("tables_list: ", tables_list)
db.commit()
sqlCreateMer = "create table mtree (MID int, tree_data text(40000), blockNumber int)"
cursor.execute(sqlCreateMer)
db.commit()
#cursor.execute(sqlSearch, [id])
#results = cursor.fetchall()[0]
#print("blocknumber: ", results[3])
cursor.close()
db.close()

'''
from python_web3.eth_account.account import Account
import json
import ast
with open("./contract/mixer/abi/Groth16Mixer.abi", "r") as abistring:
abistr = abistring.readlines()[0]
#abistr = json.load(abistr)
list_list = ast.literal_eval(abistr)
print("abistring type: ", list_list)
with open("./contract/mixer/abi/Groth16Mixer.bin", "r") as binstring:
binstr = binstring.readlines()[0]
print("binstr type: ", type(binstr))
print("binstr: ", binstr)
'''
'''
keystore_file = "pyaccount.keystore"
with open(keystore_file, "r") as dump_f:
keytext = json.load(dump_f)
privatekey = Account.decrypt(keytext, '123456')
prikey = ''.join(['%02X' % b for b in privatekey])
prikey = "0x" + prikey.lower()
print(prikey)
'''
13 changes: 5 additions & 8 deletions zkclientapp/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,6 @@


urlpatterns = [

#主页

url(r'^$',views.index,name='index'),
url(r'^get\.html$', views.get_html),
url(r'^get$', views.get),
url(r'^post\.html$', views.post_html),
url(r'^post$', views.post),
#url(r'^genFiscoAddr$', routes.genFiscoAddr),
url(r'^genZbacAddr$', routes.genZbacAddr),
url(r'^deployToken$', routes.deployToken),
Expand All @@ -25,7 +17,12 @@
url(r'^mixBac$', routes.mixBac),
url(r'^sendAsset$', routes.sendAsset),
url(r'^getNotes$', routes.getNotes),
url(r'^importFiscoAddr$', routes.importFiscoAddr),
#url(r'^getCommits$', routes.getCommits),
url(r'^checkUser$', routes.checkUser),
url(r'^genAccount$', routes.genAccount),
#url(r'^getBacContract$', routes.getBacContract),
#url(r'^getMixerContract$', routes.getMixerContract),
url(r'^getTransactions$', routes.getTransactions),
url(r'^getContract$', routes.getContract),
]
118 changes: 95 additions & 23 deletions zkclientapp/views.py
Original file line number Diff line number Diff line change
@@ -1,31 +1,103 @@
from django.shortcuts import render

from commands.constants import DATABASE_DEFAULT_ADDRESS, DATABASE_DEFAULT_PORT, DATABASE_DEFAULT_USER, DATABASE_DEFAULT_PASSWORD, DATABASE_DEFAULT_DATABASE
from commands.zeth_token_deploy import deploy_asset
from commands.zeth_deploy import deploy
import pymysql
import time
import re
BACTYPE = "bac"
MIXERTYPE = "mixer"
db = pymysql.connect(
host = DATABASE_DEFAULT_ADDRESS,
port = DATABASE_DEFAULT_PORT,
user = DATABASE_DEFAULT_USER,
password = DATABASE_DEFAULT_PASSWORD,
database = DATABASE_DEFAULT_DATABASE,
charset='utf8'
)
cursor = db.cursor()
# Create your views here.
ownerAddr = "0x598cf8fba4dcc36417f4c11497dee7eb23fb1431"

def index(request):

"学习笔记的主页"
def create_table():
print("check whether existed tables")
sqlSearch = "show tables"
cursor.execute(sqlSearch)
tables = cursor.fetchall()
db.commit()
tables_list = re.findall('(\'.*?\')',str(tables))
tables_list = [re.sub("'",'',each) for each in tables_list]
mertab = "merkletree"
contab = "contract"
tratab = "transactions"
if not mertab in tables_list:
print("create table merkletree")
sqlCreateMer = "create table merkletree (MID int, tree_data text(40000), blockNumber int)"
cursor.execute(sqlCreateMer)
db.commit()
if not contab in tables_list:
print("create table contract")
sqlCreateCon = "create table contract (conName char(20), conType char(20), conAddr text(500), time char(60), owner text(500), totalAmount bigint, shortName char(20))"
cursor.execute(sqlCreateCon)
db.commit()
if not tratab in tables_list:
print("create table transactions")
sqlCreateTra = "create table transactions (traType char(20), username char(20), vin int, vout int, input_notes char(40), output_specs text(2000), time char(60))"
cursor.execute(sqlCreateTra)
db.commit()

return render(request,'zkclientapp/template/index.html')

def get_html(request):
return render(request, 'zkclientapp/template/get.html')

def get(request):
context = {}
# 通过request.GET['name']形式获取get表单内容
# result为重定向到的result.html所使用的变量
context['result'] = f"你搜索的内容为:{request.GET['q']}"
return render(request, 'zkclientapp/template/result.html', context)
def deploy_contract():
print("check whether existed bac token contract and mixer contract")
sqlSearchBac = "select * from contract where conType = %s"
cursor.execute(sqlSearchBac, [BACTYPE])
resultBac = cursor.fetchall()
db.commit()
if resultBac:
sqlSearchMixer = "select * from contract where conType = %s"
cursor.execute(sqlSearchMixer, [MIXERTYPE])
resultMixer = cursor.fetchall()
db.commit()
if resultMixer:
print("all contract existed")
return
else:
token_address = resultBac[0][2]
print("deploy mixer contract on bac token contract of: ", token_address)
mixer_address = deploy(token_address)
if mixer_address:
print("save mixer contract to database, address: ", mixer_address)
timestr = time.strftime('%Y-%m-%d %H:%M:%S')
sqlInsertMixer = "insert into contract (conName, conType, conAddr, time, owner, totalAmount, shortName) values (%s, %s, %s, %s, %s, %s, %s);"
conName = "Groth16Mixer"
shortName = "mixer_test"
cursor.execute(sqlInsertMixer, [conName, MIXERTYPE, mixer_address, timestr, ownerAddr, 0, shortName])
db.commit()
else:
print("deploy bac token contract")
shortName = "zk-AAA-demo"
minUnit = 18
totalAmount = 50000000000
token_address = deploy_asset("bac token test contract", shortName, minUnit, totalAmount)
if token_address:
print("save bac token contract to database, address: ", token_address)
timestr = time.strftime('%Y-%m-%d %H:%M:%S')
sqlInsertBac = "insert into contract (conName, conType, conAddr, time, owner, totalAmount, shortName) values (%s, %s, %s, %s, %s, %s, %s);"
conName = "BAC001"
cursor.execute(sqlInsertBac, [conName, BACTYPE, token_address, timestr, ownerAddr, totalAmount, shortName])
db.commit()
print("deploy mixer contract on bac token contract of: ", token_address)
mixer_address = deploy(token_address)
if mixer_address:
print("save mixer contract to database, address: ", mixer_address)
timestrMixer = time.strftime('%Y-%m-%d %H:%M:%S')
sqlInsertMixer = "insert into contract (conName, conType, conAddr, time, owner, totalAmount, shortName) values (%s, %s, %s, %s, %s, %s, %s);"
conNameMixer = "Groth16Mixer"
shortNameMixer = "mixer_test"
cursor.execute(sqlInsertMixer, [conNameMixer, MIXERTYPE, mixer_address, timestrMixer, ownerAddr, 0, shortNameMixer])
db.commit()

def post_html(request):
# 不能和get一样使用render_to_response必须使用render进行重定向,不然服务端不会设置csrf_token
# return render_to_response('post.html')
return render(request, 'zkclientapp/template/post.html')
create_table()

def post(request):
context = {}
# 通过request.GET['name']形式获取post表单内容
# result为重定向到的result.html所使用的变量
context['result'] = f"你搜索的内容为:{request.POST['q']}"
return render(request, 'zkclientapp/template/result.html', context)
deploy_contract()

0 comments on commit 862fbf0

Please sign in to comment.