계약 공장
-
-
그것은 'CREATE_CONTRACT {storage'g;매개 변수 'p;code ...}`는 작동하지만 계약의 크기가 약간 부풀어지고 Solidity의 Java 스타일 클래스 인스턴스화 에서처럼 우아하게 처리 할 수있는 방법이 있어야한다고 생각합니다.It appears like `CREATE_CONTRACT { storage 'g ; parameter 'p ; code ... }` would work, but this will bloat the size of a contract a bit, and it feels like there should be a way to handle this gracefully like in Solidity's Java style class instantiation.
- 0
- 2019-03-11
- Rob
-
그렇지 않다면 Michelson의 깨끗한 예가 좋을 것입니다.If not, a clean example in Michelson would be nice.
- 0
- 2019-03-11
- Rob
-
좋아요,아마 그 때 탈출구 일 겁니다.ok cool, probably a ways out then.
- 0
- 2019-03-12
- Rob
-
삭제 한 댓글을 달아 답변으로 변환합니다.나중에 추가 된 귀하의 의견을 놓쳤습니다.이것에 대해 사과드립니다.I put a comment that I deleted to convert it into an answer. I missed your comment that was added afterwards. My apologies for this.
- 1
- 2019-03-12
- FFF
-
2 대답
- 투표
-
- 2019-03-12
SmartPy https://medium.com/@SmartPy_io/introducing-smartpy-and-smartpy-io-d4013bee7d4e#15ee
아이디어는big_map을 보유하고big_map의 각 요소가 계약을 나타내는 계약을 갖는 것입니다.
이것은 SmartPy에만 국한되지 않으며 Michelson,Liquidity 또는 Fi에서 직접 수행 할 수 있습니다.
이 주제는 여기에도 나타났습니다. BigMap 컨테이너 란 무엇이며 중요한 이유?
There is a very succinct discussion in the announcement for SmartPy https://medium.com/@SmartPy_io/introducing-smartpy-and-smartpy-io-d4013bee7d4e#15ee.
The idea is to have a contract that holds a big_map and each element of the big_map represents a contract.
This is absolutely not restricted to SmartPy and it is directly doable in Michelson, Liquidity or Fi.
This subject also appeared here: What is the BigMap container and why does it matter?
-
귀하의 답변에 감사 드리며 이것이 부정적으로 나오지 않기를 바라지 만,DAPP 개발을 생산적으로 만들기 위해서는 가까운 시일 내에이 문제에 대한보다 포괄적 인 해결책을 찾아야한다고 생각합니다.I appreciate your response and don't want this to come across negative, but I feel we need to come up with a more comprehensive solution to this problem in the near term to make DAPP development productive.
- 0
- 2019-03-12
- Rob
-
이것이 최종적이고 유일한 해결책이 아니라는 데 쉽게 동의 할 수 있습니다.I can easily agree that this is not the final and only solution.
- 0
- 2019-03-12
- FFF
-
내가 생각하고 있던 예를 보려면 아래를 참조하십시오.reference below to see an example of what I was thinking
- 0
- 2019-03-14
- Rob
-
- 2019-03-14
다음은 유동성에서이를 처리하는 계약의 예입니다. 실행이 끝날 때만 원격 프로 시저 호출을 활용할 수있는 함수를 작성하는 고유 한 과제가 있습니다.
type plus_storage = { count: nat, plus_owner: address, }; contract PlusOne = { type storage = plus_storage; let%init storage = (y: nat) => { count: y, plus_owner: Current.sender(), }; let%entry main = (p: nat, storage) => { if (Current.sender() != storage.plus_owner) { failwith("invalid caller"); }; ([], storage); } }; type storage = { owner: key, pl: address, }; let%init storage = (contract_owner: key) => { owner: contract_owner, pl: KT1111111111111111111111111111111111, } let%entry other = (param: nat, storage) => { let t: option(PlusOne.instance) = Contract.at(storage.pl); let t = switch(t) { | None => Current.failwith() | Some(inst) => inst }; let op = Contract.call( ~dest=t, ~amount=0tz, ~entry=main, ~parameter=param); ([op], storage); }; let%entry main = ((), storage) => { let manager = Crypto.hash_key(storage.owner); let delegate = Some(manager); let spendable = false; let amount = Current.amount(); let init_value: nat = 0; let (c_op, c_addr) = Contract.create( ~manager, ~delegate, ~spendable, ~delegatable=false, ~amount, ~storage={count: init_value, plus_owner: Contract.address(Contract.self())}, (contract PlusOne), ); let storage = storage.pl = c_addr; ([c_op], storage); };
이것이 "주문"및 "픽업"과 같은 종점,즉 레스토랑으로 이어질지 궁금합니다.
Here's an example of a contract handling this in liquidity. There's the unique challenge of writing functions that can only utilize remote procedure calls at the end of their execution:
type plus_storage = { count: nat, plus_owner: address, }; contract PlusOne = { type storage = plus_storage; let%init storage = (y: nat) => { count: y, plus_owner: Current.sender(), }; let%entry main = (p: nat, storage) => { if (Current.sender() != storage.plus_owner) { failwith("invalid caller"); }; ([], storage); } }; type storage = { owner: key, pl: address, }; let%init storage = (contract_owner: key) => { owner: contract_owner, pl: KT1111111111111111111111111111111111, } let%entry other = (param: nat, storage) => { let t: option(PlusOne.instance) = Contract.at(storage.pl); let t = switch(t) { | None => Current.failwith() | Some(inst) => inst }; let op = Contract.call( ~dest=t, ~amount=0tz, ~entry=main, ~parameter=param); ([op], storage); }; let%entry main = ((), storage) => { let manager = Crypto.hash_key(storage.owner); let delegate = Some(manager); let spendable = false; let amount = Current.amount(); let init_value: nat = 0; let (c_op, c_addr) = Contract.create( ~manager, ~delegate, ~spendable, ~delegatable=false, ~amount, ~storage={count: init_value, plus_owner: Contract.address(Contract.self())}, (contract PlusOne), ); let storage = storage.pl = c_addr; ([c_op], storage); };
It makes me wonder if this will lead to endpoints that are like "order" and "pickup", ie a restaurant.
Michelson/Liquidity에서 계약 공장을 만드는 방법에 대한 연구가 있습니까?
정교하게 말하자면 Solidity에서 계약 공장은 다음과 같습니다.
프라 그마 견고성 ^ 0.4.8; 계약 빵집 { //생성 된 계약의 색인 주소 [] 공공 계약; //계약 색인의 행 수를 아는 데 유용합니다. getContractCount () 함수 공공의 일정한 returns (uint contractCount) { return contracts.length; } //새 계약 배포 newCookie () 함수 공공의 반품 (주소newContract) { 쿠키 c=new Cookie (); contracts.push (c); 반환 c; } } 계약 쿠키 { //배포 된 계약에 목적이 있다고 가정합니다. getFlavor () 함수 공공의 일정한 반환 (문자열 맛) { return "mmm ... 초콜릿 칩"; } }( https://ethereum.stackexchange.com/questions/에서 참조) 13415/deploy-contract-from-contract-in-solidity )
요청이 새로운 계약을 생성 할 수있는 DAPP 용 객체 지향 구조를 구축 할 수 있기 때문에 DAPP 개발의 강력한 기능입니다. 잘 정립 된 디자인 패턴입니다. 그렇다면 Tezos 생태계에서 동등한 패턴은 무엇일까요?