PCEtLXtzdWJ0ZW1wbGF0ZSBjb21tb24vaGVhZGVyX2NvbW1vbn0tLT4JPCEtLXtpZiAkX0dFVFsnbW9kJ10gPT0gJ3ZpZXd0aHJlYWQnICYmICFlbXB0eSgkX0dbJ3RpZCddKX0tLT4KCTxsaW5rIHJlbD0iY2Fub25pY2FsIiBocmVmPSJodHRwczovL3d3dy5xaWRhbzEyMy5jb20vYmJzL3RocmVhZC17JF9HWyd0aWQnXX0tMS0xLmh0bWwiIC8+Cgk8IS0te2Vsc2VpZiAkX0dFVFsnbW9kJ10gPT0gJ2ZvcnVtZGlzcGxheScgJiYgIWVtcHR5KCRfR1snZmlkJ10pfS0tPgoJPGxpbmsgcmVsPSJjYW5vbmljYWwiIGhyZWY9Imh0dHBzOi8vd3d3LnFpZGFvMTIzLmNvbS9iYnMvZm9ydW0teyRfR1snZmlkJ119LTEuaHRtbCIgLz4KCTwhLS17ZWxzZWlmICRfR0VUWydtb2QnXSA9PSAnZ3VpZGUnfS0tPgoJPGxpbmsgcmVsPSJjYW5vbmljYWwiIGhyZWY9Imh0dHBzOi8vd3d3LnFpZGFvMTIzLmNvbS9iYnMvZ3VpZGUvIiAvPgoJPCEtLXtlbHNlaWYgJF9HWydiYXNlc2NyaXB0J10gPT0gJ2ZvcnVtJyAmJiAoZW1wdHkoJF9HRVRbJ21vZCddKSB8fCAkX0dFVFsnbW9kJ10gPT0gJ2luZGV4Jyl9LS0+Cgk8bGluayByZWw9ImNhbm9uaWNhbCIgaHJlZj0iaHR0cHM6Ly93d3cucWlkYW8xMjMuY29tL2Jicy8iIC8+Cgk8IS0tey9pZn0tLT4KCXJgbmB0PG1ldGEgbmFtZT0iYXBwbGljYXRpb24tbmFtZSIgY29udGVudD0iJF9HWydzZXR0aW5nJ11bJ2JibmFtZSddIiAvPgoJPG1ldGEgbmFtZT0ibXNhcHBsaWNhdGlvbi10b29sdGlwIiBjb250ZW50PSIkX0dbJ3NldHRpbmcnXVsnYmJuYW1lJ10iIC8+Cgk8IS0te2lmICRfR1snc2V0dGluZyddWydwb3J0YWxzdGF0dXMnXX0tLT48bWV0YSBuYW1lPSJtc2FwcGxpY2F0aW9uLXRhc2siIGNvbnRlbnQ9Im5hbWU9JF9HWydzZXR0aW5nJ11bJ25hdnMnXVsxXVsnbmF2bmFtZSddO2FjdGlvbi11cmk9e2VjaG8gIWVtcHR5KCRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ3BvcnRhbCddKSA/ICRfR1snc2NoZW1lJ10uJzovLycuJF9HWydzZXR0aW5nJ11bJ2RvbWFpbiddWydhcHAnXVsncG9ydGFsJ10gOiAkX0dbc2l0ZXVybF0uJ3BvcnRhbC5waHAnfTtpY29uLXVyaT17JF9HW3NpdGV1cmxdfXtJTUdESVJ9L3BvcnRhbC5pY28iIC8+PCEtLXsvaWZ9LS0+Cgk8bWV0YSBuYW1lPSJtc2FwcGxpY2F0aW9uLXRhc2siIGNvbnRlbnQ9Im5hbWU9JF9HWydzZXR0aW5nJ11bJ25hdnMnXVsyXVsnbmF2bmFtZSddO2FjdGlvbi11cmk9e2VjaG8gIWVtcHR5KCRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2ZvcnVtJ10pID8gJF9HWydzY2hlbWUnXS4nOi8vJy4kX0dbJ3NldHRpbmcnXVsnZG9tYWluJ11bJ2FwcCddWydmb3J1bSddIDogJF9HW3NpdGV1cmxdLidmb3J1bS5waHAnfTtpY29uLXVyaT17JF9HW3NpdGV1cmxdfXtJTUdESVJ9L2Jicy5pY28iIC8+Cgk8IS0te2lmICRfR1snc2V0dGluZyddWydncm91cHN0YXR1cyddfS0tPjxtZXRhIG5hbWU9Im1zYXBwbGljYXRpb24tdGFzayIgY29udGVudD0ibmFtZT0kX0dbJ3NldHRpbmcnXVsnbmF2cyddWzNdWyduYXZuYW1lJ107YWN0aW9uLXVyaT17ZWNobyAhZW1wdHkoJF9HWydzZXR0aW5nJ11bJ2RvbWFpbiddWydhcHAnXVsnZ3JvdXAnXSkgPyAkX0dbJ3NjaGVtZSddLic6Ly8nLiRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2dyb3VwJ10gOiAkX0dbc2l0ZXVybF0uJ2dyb3VwLnBocCd9O2ljb24tdXJpPXskX0dbc2l0ZXVybF19e0lNR0RJUn0vZ3JvdXAuaWNvIiAvPjwhLS17L2lmfS0tPgoJPCEtLXtpZiBoZWxwZXJfYWNjZXNzOjpjaGVja19tb2R1bGUoJ2ZlZWQnKX0tLT48bWV0YSBuYW1lPSJtc2FwcGxpY2F0aW9uLXRhc2siIGNvbnRlbnQ9Im5hbWU9JF9HWydzZXR0aW5nJ11bJ25hdnMnXVs0XVsnbmF2bmFtZSddO2FjdGlvbi11cmk9e2VjaG8gIWVtcHR5KCRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2hvbWUnXSkgPyAkX0dbJ3NjaGVtZSddLic6Ly8nLiRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2hvbWUnXSA6ICRfR1tzaXRldXJsXS4naG9tZS5waHAnfTtpY29uLXVyaT17JF9HW3NpdGV1cmxdfXtJTUdESVJ9L2hvbWUuaWNvIiAvPjwhLS17L2lmfS0tPgoJPCEtLXtpZiAkX0dbJ2Jhc2VzY3JpcHQnXSA9PSAnZm9ydW0nICYmICRfR1snc2V0dGluZyddWydhcmNoaXZlciddfS0tPgoJCTxsaW5rIHJlbD0iYXJjaGl2ZXMiIHRpdGxlPSIkX0dbJ3NldHRpbmcnXVsnYmJuYW1lJ10iIGhyZWY9InskX0dbc2l0ZXVybF19YXJjaGl2ZXIvIiAvPgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmICFlbXB0eSgkcnNzaGVhZCl9LS0+JHJzc2hlYWQ8IS0tey9pZn0tLT4KCTwhLS17aWYgd2lkdGhhdXRvKCl9LS0+CgkJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBpZD0iY3NzX3dpZHRoYXV0byIgdHlwZT0idGV4dC9jc3MiIGhyZWY9J3skX0dbJ3NldHRpbmcnXVsnY3NzcGF0aCddfXtTVFlMRUlEfV93aWR0aGF1dG8uY3NzP3tWRVJIQVNIfScgLz4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+SFRNTE5PREUuY2xhc3NOYW1lICs9ICcgd2lkdGhhdXRvJzwvc2NyaXB0PgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmICRfR1snYmFzZXNjcmlwdCddID09ICdmb3J1bScgfHwgJF9HWydiYXNlc2NyaXB0J10gPT0gJ2dyb3VwJ30tLT4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JF9HW3NldHRpbmddW2pzcGF0aF19Zm9ydW0uanM/e1ZFUkhBU0h9Ij48L3NjcmlwdD4KCTwhLS17ZWxzZWlmICRfR1snYmFzZXNjcmlwdCddID09ICdob21lJ30tLT4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JF9HW3NldHRpbmddW2pzcGF0aF19aG9tZS5qcz97VkVSSEFTSH0iPjwvc2NyaXB0PgoJPCEtLXtlbHNlaWYgJF9HWydiYXNlc2NyaXB0J10gPT0gJ3BvcnRhbCd9LS0+CgkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ieyRfR1tzZXR0aW5nXVtqc3BhdGhdfXBvcnRhbC5qcz97VkVSSEFTSH0iPjwvc2NyaXB0PgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmICRfR1snYmFzZXNjcmlwdCddICE9ICdwb3J0YWwnICYmICRfR0VUWydkaXknXSA9PSAneWVzJyAmJiBjaGVja19kaXlfcGVybSgkdG9waWMpfS0tPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InskX0dbc2V0dGluZ11banNwYXRoXX1wb3J0YWwuanM/e1ZFUkhBU0h9Ij48L3NjcmlwdD4KCTwhLS17L2lmfS0tPgoJPCEtLXtpZiAkX0dFVFsnZGl5J10gPT0gJ3llcycgJiYgY2hlY2tfZGl5X3Blcm0oJHRvcGljKX0tLT4KCQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBpZD0iZGl5X2NvbW1vbiIgaHJlZj0ieyRfR1snc2V0dGluZyddWydjc3NwYXRoJ119e1NUWUxFSUR9X2Nzc19kaXkuY3NzP3tWRVJIQVNIfSIgLz4KCTwhLS17L2lmfS0tPgo8L2hlYWQ+Cgo8Ym9keSBpZD0ibnZfeyRfR1tiYXNlc2NyaXB0XX0iIGNsYXNzPSJwZ197Q1VSTU9EVUxFfXtpZiAkX0dbJ2Jhc2VzY3JpcHQnXSA9PT0gJ3BvcnRhbCcgJiYgQ1VSTU9EVUxFID09PSAnbGlzdCcgJiYgIWVtcHR5KCRjYXQpfSB7JGNhdFsnYm9keWNzcyddfXsvaWZ9IiBvbmtleWRvd249ImlmKGV2ZW50LmtleUNvZGU9PTI3KSByZXR1cm4gZmFsc2U7Ij4KCTxkaXYgaWQ9ImFwcGVuZF9wYXJlbnQiPjwvZGl2PjxkaXYgaWQ9ImFqYXh3YWl0aWQiPjwvZGl2PgoJPCEtLXtpZiAkX0dFVFsnZGl5J10gPT0gJ3llcycgJiYgY2hlY2tfZGl5X3Blcm0oJHRvcGljKX0tLT4KCQk8IS0te3RlbXBsYXRlIGNvbW1vbi9oZWFkZXJfZGl5fS0tPgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmIGNoZWNrX2RpeV9wZXJtKCR0b3BpYyl9LS0+CgkJPCEtLXt0ZW1wbGF0ZSBjb21tb24vaGVhZGVyX2RpeW5hdn0tLT4KCTwhLS17L2lmfS0tPgoJPCEtLXtpZiBDVVJNT0RVTEUgPT0gJ3RvcGljJyAmJiAkdG9waWMgJiYgZW1wdHkoJHRvcGljWyd1c2VoZWFkZXInXSkgJiYgY2hlY2tfZGl5X3Blcm0oJHRvcGljKX0tLT4KCQkkZGl5bmF2Cgk8IS0tey9pZn0tLT4KCTwhLS17aWYgZW1wdHkoJHRvcGljKSB8fCAkdG9waWNbJ3VzZWhlYWRlciddfS0tPgoJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ21vYmlsZSddWydhbGxvd21vYmlsZSddICYmICghJF9HWydzZXR0aW5nJ11bJ2NhY2hlaW5kZXhsaWZlJ10gJiYgISRfR1snc2V0dGluZyddWydjYWNoZXRocmVhZG9uJ10gfHwgJF9HWyd1aWQnXSkgJiYgKCRfR0VUWydkaXknXSAhPSAneWVzJyB8fCAhJF9HRVRbJ2luYWpheCddKSAmJiAoJF9HWydtb2JpbGUnXSAhPSAnJyAmJiAkX0dbJ2Nvb2tpZSddWydtb2JpbGUnXSA9PSAnJyAmJiAkX0dFVFsnbW9iaWxlJ10gIT0gJ25vJyl9LS0+CgkJCTxkaXYgY2xhc3M9InhpMSBibSBibV9jIj4KCQkJICAgIHtsYW5nIHlvdXJfbW9iaWxlX2Jyb3dzZXJ9PGEgaHJlZj0ieyRfR1snc2l0ZXVybCddfWZvcnVtLnBocD9tb2JpbGU9eWVzIj57bGFuZyBnb190b19tb2JpbGV9PC9hPiA8c3BhbiBjbGFzcz0ieGcxIj58PC9zcGFuPiA8YSBocmVmPSIkX0dbJ3NldHRpbmcnXVsnbW9iaWxlJ11bJ25vbW9iaWxldXJsJ10iPntsYW5nIHRvX2JlX2NvbnRpbnVlfTwvYT4KCQkJPC9kaXY+CgkJPCEtLXsvaWZ9LS0+CgkJPCEtLXtpZiAhZW1wdHkoJF9HWydzZXR0aW5nJ11bJ3Nob3J0Y3V0J10pICYmICRfR1snbWVtYmVyJ11bY3JlZGl0c10gPj0gJF9HWydzZXR0aW5nJ11bJ3Nob3J0Y3V0J119LS0+CgkJCTxkaXYgaWQ9InNob3J0Y3V0Ij4KCQkJCTxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgaWQ9InNob3J0Y3V0Y2xvc2VpZCIgdGl0bGU9IntsYW5nIGNsb3NlfSI+e2xhbmcgY2xvc2V9PC9hPjwvc3Bhbj4KCQkJCXtsYW5nIHNob3J0Y3V0X25vdGljZX0KCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgaWQ9InNob3J0Y3V0dGlwIj57bGFuZyBzaG9ydGN1dF9hZGR9PC9hPgoKCQkJPC9kaXY+CgkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5zZXRUaW1lb3V0KHNldFNob3J0Y3V0LCAyMDAwKTs8L3NjcmlwdD4KCQk8IS0tey9pZn0tLT4KCQk8ZGl2IGlkPSJ0b3B0YiIgY2xhc3M9ImNsIj4KCQkJPCEtLXtob29rL2dsb2JhbF9jcG5hdl90b3B9LS0+CgkJCTxkaXYgY2xhc3M9IndwIj4KCQkJCTxkaXYgY2xhc3M9InoiPgoJCQkJCTwhLS17bG9vcCAkX0dbJ3NldHRpbmcnXVsndG9wbmF2cyddWzBdICRuYXZ9LS0+CgkJCQkJCTwhLS17aWYgaXNfYXJyYXkoJG5hdikgJiYgJG5hdlsnYXZhaWxhYmxlJ10gJiYgKCEkbmF2WydsZXZlbCddIHx8ICgkbmF2WydsZXZlbCddID09IDEgJiYgJF9HWyd1aWQnXSkgfHwgKCRuYXZbJ2xldmVsJ10gPT0gMiAmJiAkX0dbJ2FkbWluaWQnXSA+IDApIHx8ICgkbmF2WydsZXZlbCddID09IDMgJiYgJF9HWydhZG1pbmlkJ10gPT0gMSkpfS0tPiRuYXZbY29kZV08IS0tey9pZn0tLT4KCQkJCQk8IS0tey9sb29wfS0tPgoJCQkJCTwhLS17aG9vay9nbG9iYWxfY3BuYXZfZXh0cmExfS0tPgoJCQkJPC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJ5Ij4KCQkJCQk8YSBpZD0ic3dpdGNoYmxpbmQiIGhyZWY9ImphdmFzY3JpcHQ6OyIgb25jbGljaz0idG9nZ2xlQmxpbmQodGhpcykiIHRpdGxlPSJ7bGFuZyBzd2l0Y2hfYmxpbmR9IiBjbGFzcz0ic3dpdGNoYmxpbmQiPjwvYT4KCQkJCQk8IS0te2hvb2svZ2xvYmFsX2NwbmF2X2V4dHJhMn0tLT4KCQkJCQk8IS0te2xvb3AgJF9HWydzZXR0aW5nJ11bJ3RvcG5hdnMnXVsxXSAkbmF2fS0tPgoJCQkJCQk8IS0te2lmIGlzX2FycmF5KCRuYXYpICYmICRuYXZbJ2F2YWlsYWJsZSddICYmICghJG5hdlsnbGV2ZWwnXSB8fCAoJG5hdlsnbGV2ZWwnXSA9PSAxICYmICRfR1sndWlkJ10pIHx8ICgkbmF2WydsZXZlbCddID09IDIgJiYgJF9HWydhZG1pbmlkJ10gPiAwKSB8fCAoJG5hdlsnbGV2ZWwnXSA9PSAzICYmICRfR1snYWRtaW5pZCddID09IDEpKX0tLT4kbmF2W2NvZGVdPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXsvbG9vcH0tLT4KCQkJCQk8IS0te2lmIGVtcHR5KCRfR1snZGlzYWJsZWR3aWR0aGF1dG8nXSkgJiYgJF9HWydzZXR0aW5nJ11bJ3N3aXRjaHdpZHRoYXV0byddfS0tPgoJCQkJCQk8YSBocmVmPSJqYXZhc2NyaXB0OjsiIGlkPSJzd2l0Y2h3aWR0aCIgb25jbGljaz0id2lkdGhhdXRvKHRoaXMpIiB0aXRsZT0ie2lmIHdpZHRoYXV0bygpfXtsYW5nIHN3aXRjaF9uYXJyb3d9e2Vsc2V9e2xhbmcgc3dpdGNoX3dpZGV9ey9pZn0iIGNsYXNzPSJzd2l0Y2h3aWR0aCI+PCEtLXtpZiB3aWR0aGF1dG8oKX0tLT57bGFuZyBzd2l0Y2hfbmFycm93fTwhLS17ZWxzZX0tLT57bGFuZyBzd2l0Y2hfd2lkZX08IS0tey9pZn0tLT48L2E+CgkJCQkJPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXtpZiAkX0dbJ3VpZCddICYmICFlbXB0eSgkX0dbJ3N0eWxlJ11bJ2V4dHN0eWxlJ10pfS0tPjxhIGlkPSJzc2xjdCIgaHJlZj0iamF2YXNjcmlwdDo7IiBvbm1vdXNlb3Zlcj0iZGVsYXlTaG93KHRoaXMsIGZ1bmN0aW9uKCkge3Nob3dNZW51KHsnY3RybGlkJzonc3NsY3QnLCdwb3MnOiczNCEnfSl9KTsiPntsYW5nIGNoYW5nZXN0eWxlfTwvYT48IS0tey9pZn0tLT4KCQkJCQk8IS0te2lmIGNoZWNrX2RpeV9wZXJtKCR0b3BpYyl9LS0+CgkJCQkJCSRkaXluYXYKCQkJCQk8IS0tey9pZn0tLT4KCQkJCTwvZGl2PgoJCQk8L2Rpdj4KCQk8L2Rpdj4KCgkJPCEtLXtpZiAhSVNfUk9CT1R9LS0+CgkJCTwhLS17aWYgJF9HWyd1aWQnXSAmJiAhJF9HWydzZXR0aW5nJ11bJ2JiY2xvc2VkJ10gJiYgZW1wdHkoJF9HWydtZW1iZXInXVsnZnJlZXplJ10pICYmICRfR1snbWVtYmVyJ11bJ2dyb3VwaWQnXSAhPSA1fS0tPgoJCQk8dWwgaWQ9Im15cHJvbXB0X21lbnUiIGNsYXNzPSJwX3BvcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQkJCTxsaT48YSBocmVmPSJob21lLnBocD9tb2Q9c3BhY2UmZG89cG0iIGlkPSJwbV9udGMiIHN0eWxlPSJiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsiPjxlbSBjbGFzcz0icHJvbXB0X25ld3N7aWYgZW1wdHkoJF9HW21lbWJlcl1bbmV3cG1dKX1fMHsvaWZ9Ij48L2VtPntsYW5nIHBtX2NlbnRlcn08L2E+PC9saT4KCQkJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ2ZvbGxvd3N0YXR1cyddfS0tPgoJCQkJCTxsaT48YSBocmVmPSJob21lLnBocD9tb2Q9Zm9sbG93JmRvPWZvbGxvd2VyIj48ZW0gY2xhc3M9InByb21wdF9mb2xsb3dlcntpZiBlbXB0eSgkX0dbbWVtYmVyXVtuZXdwcm9tcHRfbnVtXVtmb2xsb3dlcl0pfV8wey9pZn0iPjwvZW0+PCEtLXtsYW5nIG5vdGljZV9pbnRlcmFjdGl2ZV9mb2xsb3dlcn0tLT57aWYgJF9HW21lbWJlcl1bbmV3cHJvbXB0X251bV1bZm9sbG93ZXJdfSgkX0dbbWVtYmVyXVtuZXdwcm9tcHRfbnVtXVtmb2xsb3dlcl0pey9pZn08L2E+PC9saT4KCQkJCQk8IS0te2lmICRfR1ttZW1iZXJdW25ld3Byb21wdF0gJiYgJF9HW21lbWJlcl1bbmV3cHJvbXB0X251bV1bZm9sbG93XX0tLT4KCQkJCQkJPGxpPjxhIGhyZWY9ImhvbWUucGhwP21vZD1mb2xsb3ciPjxlbSBjbGFzcz0icHJvbXB0X2NvbmNlcm4iPjwvZW0+PCEtLXtsYW5nIG5vdGljZV9pbnRlcmFjdGl2ZV9mb2xsb3d9LS0+KCRfR1ttZW1iZXJdW25ld3Byb21wdF9udW1dW2ZvbGxvd10pPC9hPjwvbGk+CgkJCQkJPCEtLXsvaWZ9LS0+CgkJCQk8IS0tey9pZn0tLT4KCQkJCTwhLS17aWYgJF9HW21lbWJlcl1bbmV3cHJvbXB0XX0tLT4KCQkJCQk8IS0te2xvb3AgJF9HWydtZW1iZXInXVsnY2F0ZWdvcnlfbnVtJ10gJGtleSAkdmFsfS0tPgoJCQkJCQk8bGk+PGEgaHJlZj0iaG9tZS5waHA/bW9kPXNwYWNlJmRvPW5vdGljZSZ2aWV3PSRrZXkiPjxlbSBjbGFzcz0ibm90aWNlXyRrZXkiPjwvZW0+PCEtLXtlY2hvIGxhbmcoJ3RlbXBsYXRlJywgJ25vdGljZV8nLiRrZXkpfS0tPig8c3BhbiBjbGFzcz0icnEiPiR2YWw8L3NwYW4+KTwvYT48L2xpPgoJCQkJCTwhLS17L2xvb3B9LS0+CgkJCQk8IS0tey9pZn0tLT4KCQkJCTwhLS17aWYgZW1wdHkoJF9HWydjb29raWUnXVsnaWdub3JlX25vdGljZSddKX0tLT4KCQkJCQk8bGkgY2xhc3M9Imlnbm9yZV9ub3RpY2VsaSI+PGEgaHJlZj0iamF2YXNjcmlwdDo7IiBvbmNsaWNrPSJzZXRjb29raWUoJ2lnbm9yZV9ub3RpY2UnLCAxKTtoaWRlTWVudSgnbXlwcm9tcHRfbWVudScpIiB0aXRsZT0ie2xhbmcgdGVtcG9yYXJpbHlfdG9fcmVtaW5kfSI+PGVtIGNsYXNzPSJpZ25vcmVfbm90aWNlIj48L2VtPjwvYT48L2xpPgoJCQkJPCEtLXsvaWZ9LS0+CgkJCTwvdWw+CgkJCTwhLS17L2lmfS0tPgoJCQk8IS0te2lmICRfR1sndWlkJ10gJiYgIWVtcHR5KCRfR1snc3R5bGUnXVsnZXh0c3R5bGUnXSl9LS0+CgkJCQk8ZGl2IGlkPSJzc2xjdF9tZW51IiBjbGFzcz0iY2wgcF9wb3AiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJCQkJPCEtLXtpZiAhJF9HW3N0eWxlXVtkZWZhdWx0ZXh0c3R5bGVdfS0tPjxzcGFuIGNsYXNzPSJzc2xjdF9idG4iIG9uY2xpY2s9ImV4dHN0eWxlKCcnKSIgdGl0bGU9IntsYW5nIGRlZmF1bHR9Ij48aT48L2k+PC9zcGFuPjwhLS17L2lmfS0tPgoJCQkJCTwhLS17bG9vcCAkX0dbJ3N0eWxlJ11bJ2V4dHN0eWxlJ10gJGV4dHN0eWxlfS0tPgoJCQkJCQk8c3BhbiBjbGFzcz0ic3NsY3RfYnRuIiBvbmNsaWNrPSJleHRzdHlsZSgnJGV4dHN0eWxlWzBdJykiIHRpdGxlPSIkZXh0c3R5bGVbMV0iPjxpIHN0eWxlPSdiYWNrZ3JvdW5kOiRleHRzdHlsZVsyXSc+PC9pPjwvc3Bhbj4KCQkJCQk8IS0tey9sb29wfS0tPgoJCQkJPC9kaXY+CgkJCTwhLS17L2lmfS0tPgoJCQk8IS0te2lmICRfR1sndWlkJ119LS0+CgkJCQk8dWwgaWQ9Im15aXRlbV9tZW51IiBjbGFzcz0icF9wb3AiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJCQkJPCEtLXtpZiAkX0dbJ3NldHRpbmcnXVsnZm9ydW1zdGF0dXMnXX0tLT48bGk+PGEgaHJlZj0iaG9tZS5waHA/bW9kPXNwYWNlJmRvPXRocmVhZCZ2aWV3PW1lIj57bGFuZyBteXBvc3R9PC9hPjwvbGk+PCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXtpZiAkX0dbJ3NldHRpbmcnXVsnZmF2b3JpdGVzdGF0dXMnXX0tLT48bGk+PGEgaHJlZj0iaG9tZS5waHA/bW9kPXNwYWNlJmRvPWZhdm9yaXRlJnZpZXc9bWUiPntsYW5nIGZhdm9yaXRlfTwvYT48L2xpPjwhLS17L2lmfS0tPgoJCQkJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ2ZyaWVuZHN0YXR1cyddfS0tPjxsaT48YSBocmVmPSJob21lLnBocD9tb2Q9c3BhY2UmZG89ZnJpZW5kIj57bGFuZyBmcmllbmRzfTwvYT48L2xpPjwhLS17L2lmfS0tPgoJCQkJCTwhLS17aG9vay9nbG9iYWxfbXlpdGVtX2V4dHJhfS0tPgoJCQkJPC91bD4KCQkJPCEtLXsvaWZ9LS0+CgkJCTwhLS17c3VidGVtcGxhdGUgY29tbW9uL2hlYWRlcl9xbWVudX0tLT4KCQk8IS0tey9pZn0tLT4KCgkJPCEtLXthZC9oZWFkZXJiYW5uZXIvd3AgYV9ofS0tPgoJCTxkaXYgaWQ9ImhkIj4KCQkJPGRpdiBjbGFzcz0id3AiPgoJCQkJPGRpdiBjbGFzcz0iaGRjIGNsIj4KCQkJCQk8IS0te2V2YWwgJG1uaWQgPSBnZXRjdXJyZW50bmF2KCk7fS0tPgoJCQkJCTxoMj48IS0te2lmICFpc3NldCgkX0dbJ3NldHRpbmcnXVsnbmF2bG9nb3MnXVskbW5pZF0pfS0tPjxhIGhyZWY9IntpZiAkX0dbJ3NldHRpbmcnXVsnZG9tYWluJ11bJ2FwcCddWydkZWZhdWx0J119eyRfR1snc2NoZW1lJ119Oi8veyRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2RlZmF1bHQnXX0ve2Vsc2V9Li97L2lmfSIgdGl0bGU9IiRfR1snc2V0dGluZyddWydiYm5hbWUnXSI+eyRfR1snc3R5bGUnXVsnYm9hcmRsb2dvJ119PC9hPjwhLS17ZWxzZX0tLT4kX0dbJ3NldHRpbmcnXVsnbmF2bG9nb3MnXVskbW5pZF08IS0tey9pZn0tLT48L2gyPgoJCQkJCTwhLS17dGVtcGxhdGUgY29tbW9uL2hlYWRlcl91c2Vyc3RhdHVzfS0tPgoJCQkJPC9kaXY+CgoJCQkJPGRpdiBpZD0ibnYiPgoJCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgaWQ9InFtZW51IiBvbm1vdXNlb3Zlcj0iZGVsYXlTaG93KHRoaXMsIGZ1bmN0aW9uICgpIHtzaG93TWVudSh7J2N0cmxpZCc6J3FtZW51JywncG9zJzonMzQhJywnY3RybGNsYXNzJzonYScsJ2R1cmF0aW9uJzoyfSk7c2hvd0ZvcnVtbWVudSgkX0dbZmlkXSk7fSkiPntsYW5nIG15X25hdn08L2E+CgkJCQkJPHVsPgoJCQkJCQk8IS0te2xvb3AgJF9HWydzZXR0aW5nJ11bJ25hdnMnXSAkbmF2fS0tPgoJCQkJCQkJPCEtLXtpZiBpc19hcnJheSgkbmF2KSAmJiAkbmF2WydhdmFpbGFibGUnXSAmJiAoISRuYXZbJ2xldmVsJ10gfHwgKCRuYXZbJ2xldmVsJ10gPT0gMSAmJiAkX0dbJ3VpZCddKSB8fCAoJG5hdlsnbGV2ZWwnXSA9PSAyICYmICRfR1snYWRtaW5pZCddID4gMCkgfHwgKCRuYXZbJ2xldmVsJ10gPT0gMyAmJiAkX0dbJ2FkbWluaWQnXSA9PSAxKSl9LS0+PGxpIHtpZiAkbW5pZCA9PSAkbmF2W25hdmlkXSB8fCBzdWJzdHIoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10sIDEpID09IHN0cl9yZXBsYWNlKCcuLycsICcnLCAkbmF2W2ZpbGVuYW1lXSl9Y2xhc3M9ImEiIHsvaWZ9JG5hdltuYXZdPjwvbGk+PCEtLXsvaWZ9LS0+CgkJCQkJCTwhLS17L2xvb3B9LS0+CgkJCQkJPC91bD4KCQkJCQk8IS0te2hvb2svZ2xvYmFsX25hdl9leHRyYX0tLT4KCQkJCTwvZGl2PgoJCQkJPCEtLXtpZiAhZW1wdHkoJF9HWydzZXR0aW5nJ11bJ3BsdWdpbnMnXVsnanNtZW51J10pfS0tPgoJCQkJCTx1bCBjbGFzcz0icF9wb3AgaF9wb3AiIGlkPSJwbHVnaW5fbWVudSIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgoJCQkJCTwhLS17bG9vcCAkX0dbJ3NldHRpbmcnXVsncGx1Z2lucyddWydqc21lbnUnXSAkbW9kdWxlfS0tPgoJCQkJCQkgPCEtLXtpZiBpbl9hcnJheSgkbW9kdWxlWydhZG1pbmlkJ10sIGFycmF5KDAsIC0xKSkgfHwgKCRtb2R1bGVbJ2FkbWluaWQnXSAmJiAkX0dbJ2FkbWluaWQnXSA+IDAgJiYgJG1vZHVsZVsnYWRtaW5pZCddID49ICRfR1snYWRtaW5pZCddKX0tLT4KCQkJCQkJIDxsaT4kbW9kdWxlW3VybF08L2xpPgoJCQkJCQkgPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXsvbG9vcH0tLT4KCQkJCQk8L3VsPgoJCQkJPCEtLXsvaWZ9LS0+CgkJCQkkX0dbc2V0dGluZ11bbWVudW5hdnNdCgkJCQk8ZGl2IGlkPSJtdSIgY2xhc3M9ImNsIj4KCQkJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ3N1Ym5hdnMnXX0tLT4KCQkJCQk8IS0te2xvb3AgJF9HW3NldHRpbmddW3N1Ym5hdnNdICRuYXZpZCAkc3VibmF2fS0tPgoJCQkJCQk8IS0te2lmICRfR1snc2V0dGluZyddWyduYXZzdWJob3ZlciddIHx8ICRtbmlkID09ICRuYXZpZH0tLT4KCQkJCQkJPHVsIGNsYXNzPSJjbCB7aWYgJG1uaWQgPT0gJG5hdmlkfWN1cnJlbnR7L2lmfSIgaWQ9InNuYXZfJG5hdmlkIntpZiAkbW5pZCAhPSAkbmF2aWR9IHN0eWxlPSJkaXNwbGF5Om5vbmUiey9pZn0+CgkJCQkJCSRzdWJuYXYKCQkJCQkJPC91bD4KCQkJCQkJPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXsvbG9vcH0tLT4KCQkJCTwhLS17L2lmfS0tPgoJCQkJPC9kaXY+CgkJCQk8IS0te2FkL3N1Ym5hdmJhbm5lci9hX211fS0tPgoJCQkJPCEtLXtzdWJ0ZW1wbGF0ZSBjb21tb24vcHVic2VhcmNoZm9ybX0tLT4KCQkJPC9kaXY+CgkJPC9kaXY+CgoJCTwhLS17aG9vay9nbG9iYWxfaGVhZGVyfS0tPgoJPCEtLXsvaWZ9LS0+CgoJPGRpdiBpZD0id3AiIGNsYXNzPSJ3cCI+Cg==
qidao123.com ToB IT社区-企服评测·应用市场»论坛 › 区块链 › 区块链 › 在TON链(The Open Network)上摆设智能合约的全过程 ...
返回列表 发新帖

在TON链(The Open Network)上摆设智能合约的全过程

[复制链接]
发表于 2025-9-28 14:30:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×


1.编写智能合约:

1.1界说变量:

在TON NETWORK(The Open Network)上摆设智能合约时,界说变量是合约编写的告急步调之一。这些变量用于存储合约中的数据和状态,并在合约实行过程中举行读取和修改。以下是一些关于在TON NETWORK上界说智能合约变量的根本概念和示例:
变量范例

TON NETWORK的智能合约通常利用Solidity或TON Virtual Machine (TVM) 特定的编程语言来编写。以下是一些常见的变量范例:

  • uint256:无符号的256位整数,用于存储数字。
  • address:所在范例,用于存储TON NETWORK上的账户所在。
  • bool:布尔范例,可以存储true或false。
  • string:字符串范例,用于存储文本数据。
  • bytes 和 bytes32:字节数组范例,用于存储恣意长度的字节数据或固定长度的32字节数据。
  • 自界说范例:比方布局体(struct)和摆列(enum)等。
变量界说

在合约中界说变量时,你须要指定变量的名称和范例。以下是一个简朴的示例:
  1. // SPDX-License-Identifier: MIT  
  2. pragma ton-solidity >= 0.43.0;  
  3.   
  4. contract MyContract {  
  5.     // 定义一个无符号整数变量  
  6.     uint256 public myNumber;  
  7.   
  8.     // 定义一个地址变量  
  9.     address public myAddress;  
  10.   
  11.     // 定义一个字符串变量  
  12.     string public myString;  
  13.   
  14.     // 构造函数,用于初始化变量  
  15.     constructor() public {  
  16.         myNumber = 42;  
  17.         myAddress = address.makeAddrStd(0, 0, 0); // 示例地址,实际应使用有效地址  
  18.         myString = "Hello, TON!";  
  19.     }  
  20.   
  21.     // 其他函数...  
  22. }
复制代码
在上面的示例中,我们界说了三个公共变量:myNumber、myAddress和myString,并在构造函数中初始化了它们的值。这些变量是公开的(public),因此它们可以在合约外部被访问。
状态变量

在智能合约中界说的变量通常被称为状态变量,由于它们存储在合约的状态中,并随着合约的实行而更新。状态变量在合约的整个生命周期内都存在,并可以在合约的差别函数调用之间保持其值。
注意事项


  • 变量名应该是形貌性的,以便其他开发者可以或许明白其用途。
  • 公共变量(public)将主动天生getter函数,用于在合约外部读取其值。
  • 只管克制在合约中界说过多的状态变量,以镌汰合约的存储需求和复杂性。
  • 在处置处罚敏感数据时,请确保利用得当的安全步调,如加密和访问控制。
1.2.实现合约的逻辑代码:

在TON NETWORK(The Open Network)上摆设智能合约并实现合约的逻辑代码,通常涉及利用TON假造机(TVM)支持的编程语言,如Solidity的TON扩展版本或其他与TVM兼容的编程语言。由于TON NETWORK是基于TON假造机(TVM)的,智能合约的编写和摆设过程与以太坊或其他基于EVM(以太坊假造机)的区块链平台有一些相似之处,但也有一些特定的差别。
以下是一个简化的步调和示例,阐明怎样在TON NETWORK上实现智能合约的逻辑代码:
选择开发工具和情况


  • 安装TON Development Kit(TDK)或其他TON NETWORK开发工具。
  • 设置TON节点的本地或长途访问。
编写智能合约

利用Solidity的TON扩展版本或其他TVM支持的编程语言编写智能合约。以下是一个简朴的Solidity示例,展示了怎样在TON NETWORK上界说一个带有简朴功能的智能合约:
  1. // SPDX-License-Identifier: MIT  
  2. pragma ton-solidity >= 0.43.0;  
  3.   
  4. contract MySimpleContract {  
  5.     // 定义状态变量  
  6.     uint256 public counter;  
  7.   
  8.     // 构造函数,用于初始化合约状态  
  9.     constructor() public {  
  10.         tvm.accept(); // 接受构造函数调用  
  11.         counter = 0; // 初始化计数器为0  
  12.     }  
  13.   
  14.     // 定义一个函数来增加计数器  
  15.     function incrementCounter() public {  
  16.         tvm.accept(); // 接受函数调用  
  17.         counter += 1; // 增加计数器的值  
  18.     }  
  19.   
  20.     // 定义一个函数来查询计数器的值  
  21.     function getCounter() public view returns (uint256) {  
  22.         return counter; // 返回计数器的值  
  23.     }  
  24.   
  25.     // ... 其他函数和逻辑 ...  
  26. }
复制代码
编译智能合约

利用TDK中的编译器或其他TON NETWORK支持的工具将智能合约源代码编译为可在TON NETWORK上摆设的二进制格式。
摆设智能合约


  • 利用TON NETWORK的客户端或SDK创建一个摆设生意业务,并将编译后的智能合约二进制文件作为生意业务的数据部门。
  • 署名并发送摆设生意业务到TON NETWORK。
  • 等待生意业务被网络确认,并获取智能合约的所在。
调用智能合约


  • 利用TON NETWORK的客户端或SDK创建函数调用生意业务,并指定要调用的智能合约所在和函数参数。
  • 署名并发送函数调用生意业务到TON NETWORK。
  • 等待生意业务被网络确认,并处置处罚返回的效果。
注意事项


  • 确保你的智能合约代码符合TON NETWORK的安全最佳实践。
  • 在摆设之前,对智能合约举行充实的测试和验证。
  • 相识TON NETWORK的Gas机制和费用模子,以便精确估计和付出摆设和调用智能合约的费用。
  • 注意TON NETWORK的更新和厘革,由于网络规则和功能大概会随着时间的推移而发生厘革。
1.3.界说合约的入口函数:

在TON NETWORK(The Open Network)上摆设智能合约时,入口函数通常指的是合约的构造函数(constructor)和外部可调用函数(external functions)。构造函数用于初始化合约的状态,而外部可调用函数则是合约与其他账户或合约举行交互的接口。
构造函数(Constructor)

构造函数是智能合约的入口点之一,用于在合约被摆设到TON NETWORK时初始化其状态。构造函数通常被标志为public和constructor,而且不担当任何参数(只管在Solidity的TON扩展版本中大概有所差别)。在TON NETWORK中,构造函数通常通过tvm.accept()来担当摆设生意业务。
示例:
  1. // SPDX-License-Identifier: MIT  
  2. pragma ton-solidity >= 0.43.0;  
  3.   
  4. contract MyContract {  
  5.     // 状态变量  
  6.     uint256 public counter;  
  7.   
  8.     // 构造函数  
  9.     constructor() public {  
  10.         tvm.accept(); // 接受部署交易  
  11.         counter = 0; // 初始化计数器  
  12.     }  
  13.   
  14.     // ... 其他函数 ...  
  15. }
复制代码
外部可调用函数(External Functions)

外部可调用函数是智能合约中界说的,可以被其他账户或合约调用的函数。这些函数通常被标志为public或external,并界说了函数参数和返回值(如果有的话)。在TON NETWORK中,外部函数通常也通过tvm.accept()来担当函数调用生意业务。
示例:
  1. // SPDX-License-Identifier: MIT  
  2. pragma ton-solidity >= 0.43.0;  
  3.   
  4. contract MyContract {  
  5.     // 状态变量  
  6.     uint256 public counter;  
  7.   
  8.     // 构造函数  
  9.     constructor() public {  
  10.         tvm.accept();  
  11.         counter = 0;  
  12.     }  
  13.   
  14.     // 外部可调用函数:增加计数器  
  15.     function incrementCounter() public {  
  16.         tvm.accept(); // 接受函数调用  
  17.         counter += 1;  
  18.     }  
  19.   
  20.     // 外部可调用函数:获取计数器的值  
  21.     function getCounter() public view returns (uint256) {  
  22.         return counter; // 返回计数器的值  
  23.     }  
  24.   
  25.     // ... 其他函数 ...  
  26. }
复制代码
在上面的示例中,incrementCounter是一个外部可调用函数,用于增长counter的值。getCounter也是一个外部可调用函数,但它被标志为view,表现它不会修改合约的状态,而且可以被其他合约或外部账户查询而无需付出任何费用。
调用智能合约的入口函数

要调用智能合约的入口函数(即构造函数或外部可调用函数),你须要利用TON NETWORK的客户端或SDK来创建一个函数调用生意业务,并指定要调用的合约所在、函数名以及任何须要的参数。然后,你须要署名并发送这个生意业务到TON NETWORK。一旦生意业务被网络确认,合约的函数将被实行,而且任何返回值或状态更新将被应用到合约上。
调用智能合约的入口函数

要调用智能合约的入口函数(即构造函数或外部可调用函数),你须要利用TON NETWORK的客户端或SDK来创建一个函数调用生意业务,并指定要调用的合约所在、函数名以及任何须要的参数。然后,你须要署名并发送这个生意业务到TON NETWORK。一旦生意业务被网络确认,合约的函数将被实行,而且任何返回值或状态更新将被应用到合约上。
请注意,详细的调用方法和步调大概会根据你利用的TON NETWORK客户端或SDK的API和文档而有所差别。因此,在摆设和调用智能合约之前,请确保你已经细致阅读并明白了相干文档和最佳实践。
2.创建合约摆设事件:

在TON NETWORK(The Open Network)上摆设智能合约时,你须要创建一个合约摆设事件(transaction)来将智能合约的字节码发布到网络上。这通常涉及以下几个步调:
2.1. 编写和编译智能合约

起首,你须要利用Solidity(或TON支持的其他编程语言)编写智能合约,并利用TON编译器(如solc-js的TON扩展或TON SDK提供的工具)将源代码编译成可在TON网络上摆设的字节码。
2.2.预备摆设参数

在创建摆设事件之前,你须要预备一些摆设参数,包罗:

  • 合约字节码:编译后的智能合约字节码。
  • 初始数据(如果有):如果你的合约构造函数须要初始数据,你须要在摆设事件中提供这些数据。
  • 发送者所在:用于发送摆设事件的账户所在。
  • 发送者私钥:用于署名摆设事件的账户私钥。
  • Gas限定和Gas代价:界说事件可以利用的最大Gas量以及每个Gas单元的代价。
  • 其他参数:根据利用的TON SDK或API的详细要求,大概还须要其他参数。
2.3. 创建和发送摆设事件

利用TON SDK或API创建摆设事件,并设置上述参数。然后,利用发送者私钥对事件举行署名,并通过TON网络发送该事件。
以下是一个利用TON SDK(假设存在)创建和发送摆设事件的伪代码示例:
  1. # 伪代码示例,实际代码取决于TON SDK的API  
  2.   
  3. # 加载TON SDK或相关库  
  4. from ton_sdk import TonClient, ABIContract, DeploySet  
  5.   
  6. # 初始化TON客户端(连接到TON网络)  
  7. client = TonClient(...)  
  8.   
  9. # 加载合约字节码和ABI(如果有)  
  10. contract_code = ... # 从文件或字符串加载编译后的合约字节码  
  11. abi = ... # 如果可用,加载合约的ABI(Application Binary Interface)  
  12.   
  13. # 准备部署参数  
  14. deploy_params = {  
  15.     'workchain_id': 0,       # 工作链ID  
  16.     'address': None,         # 通常为None,由网络自动分配地址  
  17.     'code': contract_code,   # 合约字节码  
  18.     'data': b'',             # 初始数据(如果有)  
  19.     'pubkey': ...,           # 发送者公钥(可选,如果已设置账户)  
  20.     'grams': 1_000_000,      # 支付给合约的TON Crystal(取决于你的需求和Gas价格)  
  21.     # ... 其他可能的参数 ...  
  22. }  
  23.   
  24. # 创建部署事务  
  25. deploy_set = DeploySet.from_tvm(abi, deploy_params)  
  26.   
  27. # 发送部署事务(假设你有发送者私钥和密钥库)  
  28. response = client.processing.process_message(  
  29.     message_encode_params={  
  30.         'abi': abi,  
  31.         'address': '',        # 空字符串表示部署新合约  
  32.         'call_set': deploy_set,  
  33.         'signer': {  
  34.             'type': 'Keys',  
  35.             'keys': {  
  36.                 'public': '...',  # 发送者公钥  
  37.                 'secret': '...',  # 发送者私钥  
  38.             },  
  39.         },  
  40.         # ... 其他可能的参数 ...  
  41.     }  
  42. )  
  43.   
  44. # 处理响应并获取新合约的地址(通常在response的'out_messages'中)  
  45. # ...
复制代码
注意:上述代码是伪代码,用于阐明流程。实际的TON SDK API大概与此差别,因此你须要查阅TON SDK的官方文档或相干资源以获取精确的函数和参数名称。
2.4. 等待事件确认并获取合约所在

一旦你发送了摆设事件,你须要等待事件被TON网络确认。这通常涉及监听事件的哈希值,直到它出如今某个区块中并被确认。一旦事件被确认,你就可以从相应中获取新合约的所在,并利用该所在与其他账户或合约举行交互。
3.署名和提交事件:

在TON NETWORK(The Open Network)上摆设智能合约涉及到编写智能合约代码、编译它、构建摆设事件、署名该事件,并终极将事件提交到网络上。以下是步调的概述和大概的实现细节:
3.1. 编写和编译智能合约

起首,你须要利用TON的Solidity(或其他支持的语言)编写智能合约,并利用TON编译器(如solc-js的TON扩展或TON SDK提供的工具)将源代码编译成可在TON网络上摆设的字节码。
3.2. 预备摆设事件

在摆设之前,你须要预备摆设事件的数据,这通常包罗:

  • 工作链ID:指定在哪个工作链上摆设合约。
  • 初始数据(如果有):如果你的合约构造函数须要初始数据,你须要在这里提供。
  • 合约字节码:编译后的智能合约字节码。
  • Gas限定和Gas代价:界说事件可以利用的最大Gas量以及每个Gas单元的代价。
  • 其他参数:如公钥、所在等,取决于TON SDK或API的详细要求。
3.3. 署名摆设事件

在将摆设事件发送到TON网络之前,你须要利用你的私钥对事件举行署名。这通常是通过TON SDK或API的某个函数完成的,该函数会担当事件数据、私钥和其他相干参数,并返回署名后的事件。
3.4. 提交署名后的事件

一旦事件被署名,你就可以通过TON SDK或API的某个函数将其提交到网络上。这个函数会担当署名后的事件数据,并将其发送到TON网络的节点举行验证和实行。
以下是一个利用TON SDK(假设存在)署名和提交摆设事件的伪代码示例:
  1. # 伪代码示例,实际代码取决于TON SDK的API  
  2.   
  3. # 初始化TON客户端  
  4. client = TonClient(...)  
  5.   
  6. # 加载合约字节码(假设你已经有了一个编译后的字节码)  
  7. contract_code = ...  
  8.   
  9. # 准备部署参数(这取决于你的智能合约和TON SDK的具体要求)  
  10. deploy_params = {  
  11.     'workchain_id': 0,       # 工作链ID  
  12.     'code': contract_code,   # 合约字节码  
  13.     # 可能还需要其他参数,如初始数据、Gas限制等  
  14. }  
  15.   
  16. # 假设你有一个函数可以构建部署事务(这取决于TON SDK的具体实现)  
  17. deploy_message = build_deploy_message(deploy_params)  
  18.   
  19. # 使用你的私钥对事务进行签名(这取决于你的密钥管理方式和TON SDK的实现)  
  20. signed_deploy_message = sign_message(deploy_message, private_key)  
  21.   
  22. # 提交签名后的事务到TON网络  
  23. response = client.processing.process_message(signed_deploy_message)  
  24.   
  25. # 处理响应并获取新合约的地址(通常在response的某个部分中)  
  26. # ...
复制代码
注意:上述代码是伪代码,用于阐明流程。实际的TON SDK API大概与此差别,因此你须要查阅TON SDK的官方文档或相干资源以获取精确的函数和参数名称。别的,密钥管理和署名过程也大概因你的应用步伐的架构和安全性要求而有所差别。
3.5. 等待事件确认并获取合约所在

一旦你提交了事件,你须要等待事件被TON网络确认。这通常涉及监听事件的哈希值,直到它出如今某个区块中并被确认。一旦事件被确认,你就可以从相应中获取新合约的所在,并利用该所在与其他账户或合约举行交互。
4.确认合约摆设:

在TON NETWORK(The Open Network)上确认合约摆设通常涉及以下几个步调:
4.1. 监听事件哈希

当你通过TON SDK或API发送摆设事件后,你会收到一个事件哈希(transaction hash),这个哈希是事件的唯一标识符。你须要监听这个哈希以获取事件的状态和效果。
4.2. 等待事件被写入区块

一旦事件被发送到网络,它将被节点吸收并实验包罗在一个新的区块中。这个过程大概须要一些时间,详细时间取决于网络状态和节点负载。你可以利用TON SDK或API提供的函数来轮询事件的状态,直到它被写入一个区块并被确认。
4.3. 查抄事件状态

当事件被写入区块并被确认后,你可以查询该事件的状态以确认合约是否乐成摆设。事件状态通常包罗乐成(committed)或失败(rejected)等选项。如果事件乐成,你通常还可以获取新合约的所在和其他相干信息。
4.4. 获取合约所在

如果事件乐成,你将可以或许从相应中获取新合约的所在。这个所在是你在TON网络上与合约举行交互的唯一标识符。确保妥善生存这个所在,以便未来利用。
伪代码示例,以下是一个利用TON SDK(假设存在)确认合约摆设的伪代码示例:
  1. # 伪代码示例,实际代码取决于TON SDK的API  
  2.   
  3. # 假设你已经有了一个事务哈希(transaction_hash)  
  4. transaction_hash = ...  
  5.   
  6. # 初始化TON客户端  
  7. client = TonClient(...)  
  8.   
  9. # 轮询事务状态直到它被确认  
  10. while True:  
  11.     # 使用TON SDK或API查询事务状态  
  12.     transaction_status = client.net.query_collection(  
  13.         collection='transactions',  
  14.         filter={  
  15.             'id': {'eq': transaction_hash},  
  16.             'status': {'neq': 'unfinalized'}  # 假设'unfinalized'表示事务尚未被确认  
  17.         },  
  18.         result='id, status, addr'  # 请求返回事务ID、状态和地址  
  19.     )  
  20.   
  21.     # 检查事务状态  
  22.     if transaction_status and transaction_status[0]['status'] == 'committed':  
  23.         # 事务已成功被写入区块  
  24.         contract_address = transaction_status[0]['addr']  # 假设'addr'字段包含合约地址  
  25.         print(f"合约已成功部署,地址为:{contract_address}")  
  26.         break  
  27.     else:  
  28.         # 事务尚未被确认,稍后再试  
  29.         time.sleep(5)  # 等待一段时间后再查询  
  30.   
  31. # 现在你可以使用contract_address与合约进行交互了
复制代码
注意:上述代码是伪代码,用于阐明流程。实际的TON SDK API大概与此差别,因此你须要查阅TON SDK的官方文档或相干资源以获取精确的函数和参数名称。别的,查询事件状态的方式和返回的数据布局也大概因TON SDK的版本和设置而有所差别。
实际摆设时的注意事项

  • 确保网络情况:在摆设之前,确保你毗连到了精确的TON网络情况(主网、测试网等)。
  • 查抄Gas费用和限定:设置公道的Gas费用和限定以确保事件可以或许被及时确认和实行。
  • 处置处罚错误和非常:在编写代码时,确保可以或许妥善处置处罚大概出现的错误和非常,如网络故障、事件失败等。
  • 验证合约功能:一旦合约被摆设,你应该通过调用合约的函数来验证其功能是否符合预期。
5.测试与验证:

在TON NETWORK(The Open Network)上测试与验证已摆设的合约是确保合约功能正常且符合预期的告急步调。以下是在TON NETWORK上测试与验证已摆设合约的保举步调:
5.1. 毗连到TON网络

起首,你须要一个TON网络的客户端或SDK,并毗连到测试网络(通常发起先在测试网络上验证合约,然后再迁徙到主网)。
5.2. 获取合约所在

确保你已经有了要测试的合约的所在。这通常是在合约摆设过程中由TON网络返回的。
5.3. 编写测试用例

根据你的合约功能,编写一系列测试用例。这些用例应该覆盖合约的全部关键功能和界限条件。
5.4. 调用合约函数

利用TON SDK或客户端,构造消息(包罗函数参数、Gas限定和Gas代价等),并署名该消息以调用合约的函数。
5.5. 验证返回值

查抄合约函数的返回值是否与预期符合。你大概须要剖析从网络返回的原始数据以获取有效的信息。
5.6. 查抄状态更改

如果合约更改了任何状态(比方,更新了某个变量的值或创建了一个新的合约),请确保这些更改已按预期发生。
5.7. 错误处置处罚和非常捕捉

在测试过程中,确保可以或许妥善处置处罚大概出现的错误和非常。这大概包罗网络错误、合约实行错误等。
5.8. 性能分析

如果大概的话,分析合约的实行时间和Gas斲丧。这有助于你相识合约的性能瓶颈,并大概须要举行优化。
5.9. 迭代和重复测试

根据测试效果和反馈,对合约举行须要的修改,并重复测试过程以确保全部题目都已办理。
5.10. 迁徙到主网

一旦在测试网络上验证了合约的功能和性能,你可以思量将其迁徙到主网。但请注意,主网上的利用大概会产生实际费用,而且大概具有更高的风险。
5.11.示例(伪代码)

以下是一个利用TON SDK(假设存在)测试已摆设合约的伪代码示例:
  1. # 伪代码示例,实际代码取决于TON SDK的API  
  2.   
  3. # 初始化TON客户端并连接到测试网络  
  4. client = TonClient(...)  
  5.   
  6. # 假设你已经有了合约地址和要调用的函数名以及参数  
  7. contract_address = '...'  
  8. function_name = '...'  
  9. function_params = {...}  
  10.   
  11. # 构造并签名调用合约函数的消息  
  12. call_message = build_call_message(contract_address, function_name, function_params, ...)  
  13. signed_call_message = sign_message(call_message, private_key)  
  14.   
  15. # 发送并等待消息处理结果  
  16. result = client.processing.process_message(signed_call_message)  
  17.   
  18. # 解析并验证结果  
  19. # 注意:这里的解析和验证逻辑取决于你的合约功能和返回的数据结构  
  20. # 示例:  
  21. if 'out_messages' in result and 'body' in result['out_messages'][0]:  
  22.     # 解析并检查返回值  
  23.     return_value = parse_return_value(result['out_messages'][0]['body'])  
  24.     assert return_value == expected_value, "Returned value does not match expected value"  
  25. else:  
  26.     print("Failed to receive expected output from the contract")
复制代码
注意事项

  • 安全性:在测试过程中,请确保你的私钥和敏感信息不会被走漏。
  • 日记记录:记录全部的测试步调、输入和输出,以便在出现题目时可以或许轻松地回溯和调试。
  • 连续集成/连续摆设(CI/CD):如果大概的话,将测试过程集成到你的CI/CD管道中,以确保每次代码更改都会主动举行测试。

请注意,上述步调大概会根据你的详细需求和TON NETWORK的版本而略有差别。在实际利用过程中,发起参考TON NETWORK的官方文档或教程以获取更详细和精确的信息。
6.声明与分享

技能分享:本文所提供的技能内容旨在分享与互换,旨在促进技能学习与进步。
非投资发起:本文所述技能内容并不构成任何投资发起,读者在利用相干技能时,应基于自身判定与风险评估,独立决议。
责任声明:若读者在未经授权或违背法律法规的情况下利用本文提供的代码或技能,其产生的统统效果将由读者自行负担,与本文作者无关。
接待指正:若您在阅读过程中发现任何错误或不敷之处,接待通过留言的方式提出宝贵意见与发起,我们将不胜感激。
接洽方式:WX: LALAKO_2,如有任何疑问或须要进一步互换,接待随时接洽。

回复

使用道具 举报

返回列表 发新帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录

QQ|手机版|qidao123.com IT社区;IT企服评测▪应用市场 ( 浙ICP备20004199|浙ICP备20004199号 )|网站地图

GMT+8, 2026-10-18 06:23 , Processed in 0.023743 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表