Web3 Voice🎙
https://t.me/pokertonbot?start=t_36030074_2500_TON_23ddaec7-b424-482c-8aef-81edd88abba9если перейти то, поведение не предсказуемо, а если просто посмотреть список турниров, то видим обычный турнир и вчетм тут специальность?
Makefile от разработчиков платформы World Chess вот он: https://gitlab.com/w-chess/chess-match-making/-/blob/0a61264c488b6090fc813ec58bf8f52a2421fd01/Makefile и анонс: Платформа World Chess опубликовала альфа-версию бэкенда на смарт-контрактах Free TON
Makefile мне самому очень нравится и я часто его использую и часто они получаются такими что потом сам начинаешь теряться, но всегда можно разобрать т.к. это просто комбинация простых примитивов и в данном случае тоже можно разобрать, но понимаю что можно и проще, а если можно надо стремится к простотеMakefile напомнил контракты в Cardano (https://github.com/input-output-hk/plutus/blob/master/plutus-use-cases/src/Plutus/Contracts/Stablecoin.hs)
https://devex.gov.freeton.org/proposal?proposalAddress=0%3A30e215b218c98085ab7d68edd7c6c65b9724568a4c21c270bfe62fe8c1a9fc23
@ducktalesblock один шум
KYC (https://en.wikipedia.org/wiki/Know_your_customer), обычно это классическая централизованная организация которой мы вынуждены доверять и это не любят пользователи т.к. это могут быть сложные процессы в которых надо будет передать личные данные.rror: No visibility specified. Did you intend to add "public"?
--> ZombieFactory.sol:15:5:
|
15 | function createZombie(string name, uint dna) {
| ^ (Relevant source part starts here and spans across multiple lines).
Error
pragma ton-solidity >= 0.50.0;
pragma AbiHeader expire;
contract ZombieFactory {
uint _dnaDigits = 16;
uint _dnaModulus = 10 ** _dnaDigits;
struct Zombie {
string name;
uint dna;
}
Zombie[] public _zombies;
function _createZombie(string name, uint dna) private
{
_zombies.push(Zombie(name, dna));
}
function _generateDna(string name) private view returns (uint)
{
uint hash = tvm.hash(name);
return hash % _dnaModulus;
}
function createZombie(string name) public returns (uint)
{
tvm.accept();
uint randDna = _generateDna(name);
_createZombie(name, randDna);
return _zombies.length - 1;
}
function getZombieDna(uint id) public view returns (uint)
{
return _zombies[id].dna;
}
function getZombieName(uint id) public view returns (string)
{
return _zombies[id].name;
}
function zombieCount() public view returns (uint)
{
return _zombies.length;
}
}
stringbytelinuxtondev sol compile helloWorld.solError: line 16: invalid param "loc": .loc stdlib.sol, 19
3. Как считает контрольная сумма контракта? это cat helloWorld.tvc | base64 -w0 | sha256sum неверно, результат не совпадает с tondev contract info helloWorld
uint rand = uint(keccak256(_str)); return rand % dnaModulus;
"header": ["time", "expire"]
и можно предположить, что при отправки транзакции можно будет эти поля использовать и передавать значенияpragma AbiHeader time;
pragma AbiHeader pubkey;
pragma AbiHeader expire;
pragma msgValue <value>;
https://github.com/tonlabs/TON-Solidity-Compiler/blob/master/API.md#pragma-abiheader
tondev sol versionили
tondev sol set --compiler 0.50.0 --linker 0.13.66 --stdlib 0.50.0
tondev sol update
tondev sol set --compiler latest --linker latest --stdlib latest
tondev sol update после этого ABI создается корректно и на tondev contract run ZombieFactory все работает предсказуемо.uint hash = tvm.hash(name); return hash % _dnaModulus;
обновил контракт ZombieFactory.sol по итогу чтобы применить на практике урок https://cryptozombies.io/ru/lesson/1 надо его пройти.npm install -g tondev
tondev sol update
tondev network default se
tondev signer add giver_keys 172af540e43a524763dd53b26a066d472a97c4de37d5498170564510608250c3
tondev network giver se 0:b5e9240fc2d2f1ff8cbb1d1dee7fb7cae155e5f6320e585fcc685698994a19a5 --signer giver_keys
tondev signer generate owner_keys
tondev signer default owner_keys
tondev sol compile ZombieFactory.sol
tondev se start
tondev contract deploy ZombieFactory --value 1000000000
tondev contract run ZombieFactory
createZombie
чтение контракта:tondev contract run-local ZombieFactory zombieCount
tondev contract run-local ZombieFactory getZombieDna
tondev contract run-local ZombieFactory getZombieName
SVG идеально если будут отдельные компоненты итогового перса
tondev js wrap ZombieFactory.abi.json делается обертка для js но до этого пока не добрались
interface ITONTokenWallet is AllowanceInfoStructure {
struct ITONTokenWalletDetails {
address root_address;
uint256 wallet_public_key;
address owner_address;
uint128 balance;
address receive_callback;
address bounced_callback;
bool allow_non_notifiable;
}
function getDetails() external view responsible returns (ITONTokenWalletDetails);
}
function onGetTonTokenWalletAddress(address ton_token_wallet) external {
ITONTokenWallet(ton_token_wallet).getDetails{
callback: MultitokenManager.onGetTonTokenWalletDetails,
value: 70_000_000, flag: 1, bounce: true
}();
}
function onGetTonTokenWalletDetails(ITONTokenWallet.ITONTokenWalletDetails details) external {
(
address root_address, uint256 wallet_public_key, address owner_address, ,
address receive_callback, address bounced_callback, bool allow_non_notifiable
) = details.unpack();
RootTokenWalletInfo root_token_wallet_info = getTonTokenWallet();
(
address ton_token_wallet,
bool need_receive_callback,
bool saved_allow_non_notifiable,
bool need_bounce_callback,
bool trust
) = root_token_wallet_info.unpack();
require(!trust);
require(ton_token_wallet == msg.sender);
require(saved_allow_non_notifiable == allow_non_notifiable);
require((need_bounce_callback && (bounced_callback == address(this)))
|| (!need_bounce_callback && (bounced_callback.value == 0)));
require((need_receive_callback && (receive_callback == address(this)))
|| (!need_receive_callback && (receive_callback.value == 0)));
require(owner_address == address(this));
require(wallet_public_key == 0);
tvm.accept();
root_token_wallet_info.trust = true;
ton_token_wallet_info = root_token_wallet_info;
onTonTokenWalletConfirm();
}
boc в cells и уже на основе repr_hash вычисляется хэш, после tondev sol compile Code.sol мы получаем не boc, а tvc это можно понять если сделать:tonos-cli decode tvc --tvc Code.tvc
это еще один способ посчитать хэшtvc преобразовать в cells и сделать то что делает repr_hash (еще не понял) #21w42
0:...хотя наверное это обозначение мастерчейчана, а контраты между ними не общаются и получается что не важно какой адрес0:4c396 или -1:4c396 в контракте он будет my_address = address(0x4c396)
это гипотиза
pub fn get_tuple() -> (u32, u32, u32) {
(111, 222, 333)
}
Go (не tuple просто три значения)func get_tuple() (one int, two int, three int) {
one = 111
two = 222
three = 333
return
}
Почему функция «возвращает» значение?
tondev так https://github.com/tonlabs/tondev#use-in-js-applications и так:{
"name": "ft-lab",
"version": "1.0.0-beta.0",
"main": "index.js",
"license": "UNLICENSED",
"scripts": {
"compile": "npm run compile-concurrency",
"compile-concurrency": "cd concurrency && node compile.js && tondev js wrap Concurrency",
"info-concurrency": "cd concurrency && tondev contract info Concurrency",
"se-start": "tondev se reset && tondev se start",
"se-stop": "tondev se stop",
"deploy-concurrency": "npm run compile-concurrency && cd concurrency && tondev contract deploy Concurrency",
"run-concurrency": "cd concurrency && tondev contract run Concurrency",
"run-concurrency-touch": "cd concurrency && tondev contract run Concurrency touch",
"run-concurrency-speed": "cd concurrency && tondev contract run-local Concurrency speed | grep value0 | cut -d'\"' -f4",
"run-concurrency-count": "cd concurrency && tondev contract run-local Concurrency count | grep count | cut -d'\"' -f4",
"run-concurrency-recently": "cd concurrency && tondev contract run-local Concurrency recently"
},
"dependencies": {
"@tonclient/appkit": "^0.2.0",
"@tonclient/core": "^1.23.0",
"@tonclient/lib-node": "^1.23.0",
"bignumber.js": "^9.0.1"
},
"devDependencies": {
"@supercharge/promise-pool": "^1.8.0",
"dotenv": "^10.0.0",
"tondev": "^0.10.4"
}
}
и тут видно что я не понял как через js запустить tondev js wrap
nearup_bot посмотри пояснение: Полноценный блокчейн-dApp внутри мессенджера на примере NEAR Tip Bot кроме прочего это позволит лучше понять пункт 2.
tondev sol set --compiler 0.39.0
но есть тег и на 0.25.0 но для него видимо бинали не поставлены
tonos-cli body --abi ZombieFeeding.abi.json setKittyContractAddress '{"addr":"2ec8b3f9374bed0af43c3d6f6fb6aaaee676fa550195082f36b22657d5ad4111"}'
decode — tonos-cli decode body --abi ZombieFeeding.abi.json te6ccgEBAQEAKAAAS0/nO8aABdkWfybpfaFeh4et7fbVVdzO30qgMqEF5tZEyvq1qCIw
TrueNFT?
contract Some {
uint foo;
function bar(uint foo) {
foo + foo;
}
}
тут определенно конфликт имен и потому что Some.foo может быть публичной в эфире сложился стиль:contract Some {
uint foo;
function bar(uint _foo) {
foo + _foo;
}
}
т.е. принеси в жертву лаконичность интерфейс публичных методов, но учитывая что это всего лишь соглашение об именование на практики можно встретить разные интерпретации и велосипеды
interface IFungible {
function transfer(address dest, uint256 tokens, uint128 grams) public void;
function internalTransfer(uint256 senderKey, uint256 tokens) public void;
function accept(uint256 tokens) public void;
function approve(address spender, uint256 remainingTokens, uint256 tokens) public;
}
на практике это означает что нам надо как-то отделить атрибуты класса т.к. в Solidity нет понятия this (это вот особенно интересно почему), поэтому нижние подчеркивания переходят в атрибуты класса:contract Some {
uint private _foo;
function bar(uint foo) {
_foo + foo;
}
}
этот стиль можно заметить у балансера https://github.com/balancer-labs/balancer-core/blob/e232d03eea1c66529f22d3157c7f560bf0782370/contracts/BToken.sol#L75-L93
contract Some {
uint public quz;
uint private _foo;
function bar(uint foo) {
_foo + quz+ foo;
}
}
onlyOwner https://github.com/baerelektro/CryptoZombie/blob/master/ZombieFeeding.sol#L26