Contract con_gamma_phi_channel_impl_v1


Contract Code


  
1 # con_gamma_phi_channel_impl_v1
2 # owner: con_gamma_phi_profile_v5
3
4 import con_rsa_encryption as rsa
5
6 random.seed()
7
8 @export
9 def interact(payload: dict, state: dict, caller: str):
10 # state
11 total_users = state['total_users']
12 metadata = state['metadata']
13 usernames = state['usernames']
14 owner = state['owner']
15 channels = state['channels']
16
17 # action
18 function = payload['action']
19
20 if function == 'create_channel':
21 create_channel(
22 caller,
23 payload.get('users'),
24 payload.get('channel_name'),
25 channels,
26 metadata,
27 usernames
28 )
29 elif function == 'update_channel':
30 update_channel(
31 caller,
32 payload.get('users'),
33 payload.get('channel_name'),
34 channels,
35 metadata,
36 usernames
37 )
38
39 def generate_key() -> str:
40 return random.getrandbits(256).to_bytes(256 // 8, "big").hex()
41
42 def update_channel(caller: str, users: list, channel_name: str, channels: Any, metadata: Any, usernames: Any):
43 # sha256 key
44 assert metadata[caller, 'username'] is not None, 'This user does not exist.'
45 assert channel_name is not None, 'channel_name cannot be null.'
46 assert channels[channel_name, 'owner'] is not None, 'Channel does not exist.'
47 assert channels[channel_name, 'owner'] == caller, 'You do not own this channel.'
48 if caller in users:
49 users.remove(caller)
50
51 all_users = [caller] + users
52 key = generate_key()
53
54 user_addresses = []
55 for user in all_users:
56 user_address = usernames[user]
57 if user_address is None:
58 user_address = user
59 rsa_key = metadata[user, 'public_rsa_key']
60 assert rsa_key is not None, f'User {user} has not setup their encryption keys.'
61 rsa_keys = rsa_key.split('|')
62 encrypted = rsa.encrypt(
63 message_str=key,
64 n=int(rsa_keys[0]),
65 e=int(rsa_keys[1])
66 )
67 metadata[user, 'keys', channel_name] = encrypted
68 user_addresses.append(user_address)
69
70 channels[channel_name, 'users'] = user_addresses
71
72
73 def validate_channel_name(channel_name: str):
74 assert channel_name is not None and len(channel_name) > 0, 'channel_name cannot be null or empty'
75 assert isinstance(channel_name, str), 'channel_name must be a string.'
76 assert len(channel_name) <= 32, 'channel_name cannot be longer than 32 characters.'
77 assert all([c.isalnum() or c in ('_', '-') for c in channel_name]), 'channel_name has invalid characters. Each character must be alphanumeric, a hyphen, or an underscore.'
78 assert channel_name[0] not in ('-', '_') and channel_name[-1] not in ('-', '_'), 'channel_name cannot start or end with a hyphen or underscore.'
79
80
81 def create_channel(caller: str, users: list, channel_name: str, channels: Any, metadata: Any, usernames: Any):
82 # sha256 key
83 assert metadata[caller, 'username'] is not None, 'This user does not exist.'
84 assert channel_name is not None, 'channel_name cannot be null.'
85 assert channels[channel_name, 'owner'] is None, 'Channel already exists.'
86
87 validate_channel_name(channel_name)
88
89 if caller in users:
90 users.remove(caller)
91
92 all_users = [caller] + users
93
94 channels[channel_name, 'owner'] = caller
95
96 key = generate_key()
97
98 user_addresses = []
99 for user in all_users:
100 user_address = usernames[user]
101 if user_address is None:
102 user_address = user
103 rsa_key = metadata[user, 'public_rsa_key']
104 assert rsa_key is not None, f'User {user} has not setup their encryption keys.'
105 rsa_keys = rsa_key.split('|')
106 encrypted = rsa.encrypt(
107 message_str=key,
108 n=int(rsa_keys[0]),
109 e=int(rsa_keys[1])
110 )
111 metadata[user, 'keys', channel_name] = encrypted
112 user_addresses.append(user_address)
113
114 channels[channel_name, 'users'] = user_addresses
115

Byte Code

e30000000000000000000000000700000040000000737a000000640064016c005a0165026a038300010065046402830165056505650664039c0364046405840483015a07650664069c016407640884045a08650665096506650a650a650a64099c06640a640b84045a0b6506640c9c01640d640e84045a0c650665096506650a650a650a64099c06640f641084045a0d640153002911e9000000004eda1d636f6e5f67616d6d615f7068695f6368616e6e656c5f696d706c5f76312903da077061796c6f6164da057374617465da0663616c6c657263030000000000000009000000070000004300000073820000007c01640119007d037c01640219007d047c01640319007d057c01640419007d067c01640519007d077c00640619007d087c0864076b02725874007c027c006a01640883017c006a01640983017c077c047c05830601006e267c08640a6b02727e74027c027c006a01640883017c006a01640983017c077c047c058306010064005300290b4eda0b746f74616c5f7573657273da086d65746164617461da09757365726e616d6573da056f776e6572da086368616e6e656c73da06616374696f6eda0e6372656174655f6368616e6e656cda057573657273da0c6368616e6e656c5f6e616d65da0e7570646174655f6368616e6e656c2903da105f5f6372656174655f6368616e6e656cda03676574da105f5f7570646174655f6368616e6e656c29097203000000720400000072050000007206000000720700000072080000007209000000720a000000da0866756e6374696f6ea9007214000000da00da08696e74657261637405000000731800000000020801080108010801080108010801100110010801100172160000002901da0672657475726e630000000000000000000000000300000043000000731600000074006a01640183016a026404640383026a038300530029054ee900010000e908000000da03626967e9200000002904da0672616e646f6dda0b67657472616e6462697473da08746f5f6279746573da036865787214000000721400000072140000007215000000da0e5f5f67656e65726174655f6b65791500000073020000000001722000000029067205000000720d000000720e000000720a000000720700000072080000006306000000000000000e000000070000004300000073160100007c047c0064016602190064006b09731874006402830182017c0264006b09732874006403830182017c037c0264046602190064006b09734074006405830182017c037c026404660219007c006b02735874006406830182017c007c016b06726a7c016a017c00830101007c0067017c0117007d06740283007d0767007d0878867c0644005d7e7d097c057c0919007d0a7c0a64006b08729c7c097d0a7c047c096407660219007d0b7c0b64006b0973c0740064087c099b0064099d03830182017c0b6a03640a83017d0c74046a057c0774067c0c640b1900830174067c0c640c19008301640d8d037d0d7c0d7c047c09640e7c0266033c007c086a077c0a83010100718457007c087c037c02640f66023c006400530029104eda08757365726e616d657a1954686973207573657220646f6573206e6f742065786973742e7a1c6368616e6e656c5f6e616d652063616e6e6f74206265206e756c6c2e72090000007a174368616e6e656c20646f6573206e6f742065786973742e7a1c596f7520646f206e6f74206f776e2074686973206368616e6e656c2eda0e7075626c69635f7273615f6b65797a0555736572207a2520686173206e6f7420736574757020746865697220656e6372797074696f6e206b6579732efa017c7201000000e9010000002903da0b6d6573736167655f737472da016eda0165da046b657973720d0000002908da0e417373657274696f6e4572726f72da0672656d6f76657220000000da0573706c6974da03727361da07656e6372797074da03696e74da06617070656e64290e7205000000720d000000720e000000720a00000072070000007208000000da09616c6c5f7573657273da036b6579da0e757365725f616464726573736573da0475736572da0c757365725f61646472657373da077273615f6b6579da087273615f6b657973da09656e63727970746564721400000072140000007215000000721200000019000000733000000000020a010e0110010a010e010a010e0108010a010a01060104010a010801080104010c0118010a0112010e010e010e0172120000002901720e00000063010000000000000001000000030000004300000073800000007c0064006b09721474007c00830164016b04731c740164028301820174027c0074038302732e740164038301820174007c00830164046b017342740164058301820174046406640784007c00440083018301735c74016408830182017c0064011900640d6b0772747c00640e1900640f6b07737c7401640c830182016400530029104e72010000007a246368616e6e656c5f6e616d652063616e6e6f74206265206e756c6c206f7220656d7074797a1e6368616e6e656c5f6e616d65206d757374206265206120737472696e672e721b0000007a316368616e6e656c5f6e616d652063616e6e6f74206265206c6f6e676572207468616e20333220636861726163746572732e630100000000000000020000000500000053000000731c00000067007c005d147d017c016a00830070167c0164026b069102710453002903da015ffa012d2902723800000072390000002901da076973616c6e756d2902da022e30da0163721400000072140000007215000000fa0a3c6c697374636f6d703e3b000000730200000006007a2b5f5f76616c69646174655f6368616e6e656c5f6e616d652e3c6c6f63616c733e2e3c6c697374636f6d703e7a656368616e6e656c5f6e616d652068617320696e76616c696420636861726163746572732e204561636820636861726163746572206d75737420626520616c7068616e756d657269632c20612068797068656e2c206f7220616e20756e64657273636f72652e7239000000723800000072240000007a3d6368616e6e656c5f6e616d652063616e6e6f74207374617274206f7220656e64207769746820612068797068656e206f7220756e64657273636f72652e290272390000007238000000e9ffffffff2902723900000072380000002905da036c656e7229000000da0a6973696e7374616e6365da03737472da03616c6c2901720e000000721400000072140000007215000000da175f5f76616c69646174655f6368616e6e656c5f6e616d6535000000731200000000010e010e01120106010e0114010601120172430000006306000000000000000e000000070000004300000073120100007c047c0064016602190064006b09731874006402830182017c0264006b09732874006403830182017c037c0264046602190064006b087340740064058301820174017c02830101007c007c016b06725a7c016a027c00830101007c0067017c0117007d067c007c037c02640466023c00740383007d0767007d0878867c0644005d7e7d097c057c0919007d0a7c0a64006b0872987c097d0a7c047c096406660219007d0b7c0b64006b0973bc740064077c099b0064089d03830182017c0b6a04640983017d0c74056a067c0774077c0c640a1900830174077c0c640b19008301640c8d037d0d7c0d7c047c09640d7c0266033c007c086a087c0a83010100718057007c087c037c02640e66023c0064005300290f4e72210000007a1954686973207573657220646f6573206e6f742065786973742e7a1c6368616e6e656c5f6e616d652063616e6e6f74206265206e756c6c2e72090000007a174368616e6e656c20616c7265616479206578697374732e72220000007a0555736572207a2520686173206e6f7420736574757020746865697220656e6372797074696f6e206b6579732e72230000007201000000722400000029037225000000722600000072270000007228000000720d000000290972290000007243000000722a0000007220000000722b000000722c000000722d000000722e000000722f000000290e7205000000720d000000720e000000720a0000007207000000720800000072300000007231000000723200000072330000007234000000723500000072360000007237000000721400000072140000007215000000721000000041000000732e00000000020a010e0110011801080108010a010a010c01060104010a010801080104010c0118010a0112010e010e010e017210000000290eda12636f6e5f7273615f656e6372797074696f6e722c000000721c000000da0473656564da085f5f6578706f7274da0464696374724100000072160000007220000000da046c697374da03416e797212000000724300000072100000007214000000721400000072140000007215000000da083c6d6f64756c653e010000007312000000080108030601140f0e040601121b0e0c0601