#HannahEdApplyTips 07 LỖI LOGIC KHI XIN HỌC BỔNG THẠC SỸ/TIẾN SỸ: TẠI SAO TƯ DUY LOGIC LÀ CHÌA KHÓA THÀNH CÔNG?
“Tư duy logic (logical thinking) được hiểu là ‘là một cách sắp xếp và sử dụng thông tin. Các vấn đề hoặc tình huống liên quan đến tư duy logic đòi hỏi tư duy cấu trúc (structure), nắm rõ các mối quan hệ giữa các sự kiện (facts), và khả năng tạo ra các liên kết (chains) trong lập luận để tạo ra ý nghĩa’ (Karl Albrecht 1984: 3). … Tư duy logic có vai trò nền tảng đối với tất cả các bước và các nhiệm vụ trong việc ứng tuyển học bổng, bắt đầu từ việc tập hợp hồ sơ, xây dựng các thành phần của hồ sơ như viết SOP (statement of purpose), chuẩn bị LOR (letter of recommendation), làm các bài luận (essays), viết đề cương nghiên cứu (research proposal), cho tới việc nộp hồ sơ, và chuẩn bị phỏng vấn. Có nghĩa là, bạn không chỉ cần thể hiện tư duy logic ở việc viết, mà còn trong phỏng vấn, và ở cả việc thực hiện các tác vụ mang tính văn phòng (sắp xếp, tập hợp file, hay format văn bản).”
Đây cũng chính là phần mở đầu mà Anh Kiên Nguyễn, PhD Student ở ĐH Monash mới chia sẻ, chị thấy bài viết rất hữu ích đối với các bạn Schofans chuẩn bị khi làm hồ sơ du học. Mời mọi người cùng đón đọc nhé ❤
“Bài viết này tương đối cơ bản, dành cho các bạn ứng tuyển học bổng cả bậc thạc sỹ và tiến sĩ. Dĩ nhiên, các bạn ứng tuyển các học bổng ngắn hạn khác cũng có thể tìm thấy đôi điều có ích. Sau đây, mình tổng kết thành 7 lỗi logic cơ bản khiến hồ sơ của bạn dễ thất bại.
1. Không tuân theo trật tự đã cho
Cứ tưởng tượng, bạn vào nhà hàng và gọi điểm tâm và món chính, nhà hàng mang ra món chính rồi sau đó mới điểm tâm. Đó là một lỗi logic sơ đẳng. Công việc ứng tuyển học bổng cũng vậy. Luôn đầy những nhiệm vụ cần phải sắp xếp tác vụ và mọi thứ theo một trật tự logic đã cho – tức theo yêu cầu của học bổng. Lấy ví dụ một công việc nhẹ nhàng nhất là tập hợp các bản mềm cho một bộ hồ sơ. Với việc hiện nay các hồ sơ chủ yếu nộp online, các thành phần của hồ sơ đều có thể nộp dưới dạng bản mềm (file điện tử). Nếu yêu cầu của học bổng là gửi hồ sơ của bạn tới địa chỉ email của hội đồng học bổng thì việc bạn sắp xếp các files này trong thư gửi lại là rất quan trọng. Không cẩn thận, bạn có thể bị loại ngay từ vòng ngày.
Ví dụ: Một học bổng PhD yêu cầu bạn phải nộp một hồ sơ gồm các thành phần sau: certificates and academic transcripts, certified proof of citizenship status, proof of residency status, evidence of English language proficiency, contact details for two Academic Referees, research case, research proposal, and list of research output.
Khi nộp lại bạn được yêu cầu gửi một tập (folder) tài liệu gồm các thành phần trên. Nhiều bạn không chú ý đến việc đơn giản này và gửi lại một folder để các file lẫn lộn. Máy tính sẽ tự động sắp xếp các file theo bảng chữ cái. Và như thế người nhận sẽ không nhìn thấy được một trật tự các file như họ yêu cầu. Điều này khiến họ rất mất thời gian để check xem liệu bạn có bị thiếu file nào không. Và nếu họ bỏ qua gửi lên hội đồng cao hơn, bạn có thể bị chấm thất bại.
Do đó, trong một folder, bạn cần biết sắp xếp nó thành thứ tự như học bổng đưa ra. Chẳng hạn, cách đánh số đơn giản giúp bạn duy trì trật tự file theo đúng yêu cầu học bổng:
1_Certificates and academic transcripts
2_Proof of citizenship status
3_Proof of residency status
4_Evidence of English language proficiency
5_Referees contact details_Mr A & Ms B
6_Research Case
7_Research Proposal
8_Research Output
Với cách sắp xếp có đánh số, các bạn có thể zip toàn bộ files trong hồ sơ và gửi đi. Khi gửi đi, người nhận sẽ nhận được bộ hồ sơ mà các files được sắp xếp theo đúng trật tự họ yêu cầu.
Bên cạnh việc rất đơn giản như sắp xếp file điện tử, lỗi không tuân theo trật tự định sẵn còn diễn ra ở nhiều hạng mục khác của học bổng chẳng hạn như việc làm bài luận. Đề bài cho sẵn những ý nào, theo trật tự gì là tương đối rõ, thì việc bạn viết bài luận để làm rõ những điểm đó cần theo trật tự đưa ra. Vấn đề này mình sẽ bàn sâu thêm ở một bài khác.
2. Sắp xếp không theo trình tự thời gian
Trình tự thời gian nói về việc sắp xếp sao cho cái nào sinh ra trước thì bỏ trước, cái nào sinh ra sau thì bỏ sau, hoặc ngược lại.
Chẳng hạn, chúng ta xem xét ví dụ sau. Một bạn ứng tuyển bậc PhD viết các nhiệm vụ đã thực hiện cho một vị trí gọi là ‘Facilities Assistant’ trong CV. Lúc đầu bạn ấy viết thế này:
(01) Supervision of the CPA Centre including room set-up and event coordination.
(02) Maintaining Audio-Visual equipment during events and meetings and acting as a trouble-shooter.
(03) Meeting and greeting attendees during events.
(04) Acting as a First-Aid and Fire Warden to ensure all OH&S and emergency procedures are followed.
Để thấy vấn đề về logic ở đây, bạn cần phải tìm ra cơ sở chung của các nhiệm vụ trên. Nếu các bạn chú ý, có thể thấy xuyên suốt các nhiệm vụ của bạn ý việc liên quan đến tổ chức sự kiện – events (ngoại trừ ý số 04). Một event thường có 3 giai đoạn chính – chuẩn bị, quản lý lúc event diễn ra, và quản lý sau event. Vậy 4 ý này có vấn đề gì?
- Ý 01 liên quan đến giai đoạn chuẩn bị (phòng ốc) cho event (1.1), nhưng lại bao gồm cả điều phối event (1.2)
- Ý 02 liên quan đến các vấn đề điều phối event gồm các vấn đề bảo quản và xử lý sự cố về equipment.
- Ý 03 liên quan đến khởi đầu event – đón tiếp khách mời.
- Ý 04 liên quan đến một nhiệm vụ khác không phải event.
Như vậy, bạn ấy đang vi phạm logic thời gian. Ý một về giai đoạn chuẩn bị ở đầu là đúng. Ý hai nói về điều phối event – tức giai đoạn giữa. Còn ý ba là thuộc giai đoạn khi event mới bắt đầu diễn ra, đáng lẽ cần được đặt trước ý hai thì lại để sau. Vậy, theo đúng trình tự thời gian ta có:
(01=I) Prepared for events including room set-up
(03=II) Coordinated events including greeting and meeting attendees.
(02=III) Maintained Audio-Visual equipment during events and meetings.
(04=IV) Acted as a First-Aid and Fire Warden to ensure all WHS and emergency procedures are followed.
Có một vài thành phần học bổng, chẳng hạn như khi bạn liệt kê các bằng cấp hoặc dự án đã làm trong CV, thì thông thường người ta liệt kê các bằng cấp hoặc các dự án mới đạt được trước, rồi đi lùi về các mốc thời gian cũ hơn.
3. Không đồng chất
Khi chúng ta trình bày các dữ kiện, nhóm vấn đề, chúng ta cần chú ý đến việc làm sao tạo ra sự đồng nhất giữa các thành phần ngang hàng. Một trong những lỗi logic phổ biến là cách sử dụng ngôn ngữ không thống nhất (inconsistent).
Trong ví dụ ở mục 2, có thể thấy, item 01 khác biệt với các items còn lại vì bạn ấy sử dụng danh từ (supervision) để mô tả nhiệm vụ, trong khi các items còn lại bắt đầu bằng danh động từ (V-ing). Vấn đề không phải cách dùng nào là sai, mà là dùng không thống nhất. Lỗi này tuy nhỏ, nhưng lại khá phổ biến và có thể đập ngay vào mắt người đọc.
Các lỗi tương tự như sử dụng lẫn lộn giữa Anh Mỹ và Anh Anh, hay lúc thì bôi đậm lúc thì in nghiêng, lúc đặt heading lúc không, v.v., nếu không phải phục vụ mục đích ‘highlight’ nào đó, thì hầu như đều tạo ra ấn tượng của không thống nhất và có thể ảnh hưởng đến chất lượng của hồ sơ của bạn. Để sửa lỗi này thì các bạn cần chọn quá trình chỉnh sửa nhiều lần và nhờ người khác đọc hộ (proofread) để phát hiện lỗi.
4. Sắp xếp không ngang hàng
Khá gần với đến việc không đồng chất là việc sắp xếp không ngang hàng do xác định sai quan hệ tập hợp. Chẳng hạn, một bạn ứng tuyển thạc sĩ liệt kê các kỹ năng của bạn ấy như sau:
Leadership
Interpersonal
Teamwork
Critical thinking
Intemediate use of Epidata
Proficient use of MS Office (Word, PowerPoint, Visio, Excel)
Ngoài vấn đề về tính thống nhất (lúc thì có đánh giá về trình độ sử dụng – intermediate use, proficient use, lúc thì không), thì bạn này còn gặp phải vấn đề xác định sai quan hệ logic. Đáng lẽ A là tập con của B thì lại đặt A ngang hàng với B. Interpersonal skills (các kỹ năng liên cá nhân) là một tập hợp gồm nhiều các kỹ năng mềm gồm cả lãnh đạo và làm việc nhóm. Như vậy, chúng ta không thể đặt ngang hàng một tập hợp mẹ (interpersonal skill) với tập con (leadership and teamwork) được.
Bên cạnh đó, chúng ta cũng thấy được hai ý cuối nói về dạng kỹ năng khác, không nằm trong interpersonal skills. Đó là các kỹ năng kỹ thuật/chuyên môn (technical skills). Do đó, điều cần thiết là phải phân biệt được các items thuộc nhóm nào, các nhóm này có quan hệ logic gì với nhau, và sau đó xếp đặt chúng vào một trật tự logic.
5. Tự giả định ngầm rằng A bằng/là B
Lỗi logic này liên quan đến việc bạn tự giả định ngầm rằng cái này bằng cái kia. Lấy ví dụ trong chương trình học bổng Chevening, khi chuẩn bị cho phỏng vấn có câu hỏi thế này: Tại sao bạn lại chọn học bổng Chevening (A)?
Một bạn trả lời:
(i) Vì chính phủ Anh (có hợp tác với chính phủ Việt Nam trong lĩnh vực XYZ nên việc học của tôi sẽ giúp tăng cường hợp tác đó;
(ii) Vì các đại học Anh (C) là những đại học hàng đầu thế giới.
Trong cả hai câu trả lời này, chúng ta thấy đều không hợp logic vì bạn này đã thực hiện một giả định ngầm:
• Học bổng Chevening (A) = Chính phủ Anh quốc (B)
• Học bổng Chevening (A) = Đại học Anh quốc (C)
Mặc dù học bổng Chevening có liên quan mật thiết đến chính phủ Anh quốc và đại học ở Anh quốc, nhưng các thực thể này hoàn toàn độc lập và khác nhau (A#B#C). Học bổng Chevening chỉ là một trong những chương trình/hoạt động của Chính phủ Anh quốc, và học bổng này chỉ là một trong những con đường đến đến đại học Anh quốc. Việc bạn này trả lời lý do chọn học bổng Chevening bằng cách sử dụng hai thực thể B và C là sai về logic.
6. Thiếu logic hệ thống
Nếu xem toàn bộ hồ sơ xin học bổng của bạn là một tổng thể (hệ thống) thì mỗi thành phần từ thư giới thiệu, SOP, bài luận, CV, bảng điểm và bằng cấp, các giấy chứng nhận, kinh nghiệm làm việc, hay xuất bản phẩm là một bộ phận. Các bộ phận cần kết dính với nhau một cách biện chứng, nhịp nhàng, sao cho người đọc không thấy mâu thuẫn, khó hiểu.
Tuy điều này quan trọng như vậy, nhưng nhiều bạn lại xây dựng hồ sơ một cách thiếu nhất quán và khập khiễng. Một số lỗi sau có thể tìm thấy:
- TÊN của cùng một đề tài, dự án, hoạt động để mỗi nơi một kiểu, đặc biệt là khác biệt giữa LOR, CV, cover letter;
- SOP nói bạn có kinh nghiệm liên quan đến nghiên cứu vấn đề A, nhưng trong mục kinh nghiệm nghiên cứu của CV lại không đề cập đến;
- SOP nêu lên CHUYỂN ĐỔI ĐỊNH HƯỚNG NGHIÊN CỨU của bạn, nhưng các tài liệu khác đặc biệt là CV không thể hiện được bước chuyển này qua các sự kiện;
- Kể về cùng một sự kiện để làm ví dụ, bài luận nói một kiểu, phỏng vấn lại nói kiểu khác;
- v.v.
7. Cách tiếp cận logic không phù hợp
Về cơ bản, để biện hộ cho lý lẽ mình đưa ra (claim), bạn có thể sử dụng hai loại logic lập luận. Một là logic diễn dịch (deductive reasoning) và hai là logic quy nạp (inductive reasoning). Logic diễn dịch là logic đi từ các nguyên lý chung tới các trường hợp cụ thể nào đó. Ví dụ:
- (1) Nhìn chung, A là một người tốt bụng. Vì:
- (2) Lúc đi trên đường, A thường giúp người già đi sang đường
- (3) A thường làm từ thiện để giúp đỡ những người có hoàn cảnh khó khăn.
Ở đây, ý 1 là ý chung và nó được minh chứng ra ở ý 2 và ý 3 – là các ví dụ làm sáng rõ cho ý 1.
Logic quy nạp thì ngược lại, đi từ các trường hợp cụ thể tới một kết luận chung về các trường hợp đó.
- (1) A thường làm từ thiện để giúp đỡ những người có hoàn cảnh khó khăn
- (2) Lúc đi trên đường, A thường giúp người già đi sang đường
- (3) Suy ra, A là một người tốt bụng.
Sau này khi các bạn viết luận hay viết văn academic, thì bạn có thể sử dụng logic nào cũng được, miễn là các ý phải mạch lạc và chặt chẽ. Tuy nhiên, trong bối cảnh ứng tuyển học bổng, mình thường khuyên các bạn nên dùng logic diễn dịch. Vì logic này đi thẳng vào vấn đề nhanh hơn, giúp người chấm học bổng nhanh chóng nắm bắt được ý bạn muốn nói là gì (claim). Trong khi đó, logic quy nạp có thể khiến bạn đi mãi đi mãi mà chưa thấy kết luận ở đâu. Điều này càng trở nên bức thiết khi bạn trả lời phỏng vấn. Nếu bạn nói không rõ các ý và không rõ các trạng từ chỉ báo ý và từ nối chỉ báo chuyển ý thì càng làm người nghe khó nhận biết bạn đang ở đâu và vì sao bạn lại đến được kết luận như vậy.
CHỐT LẠI, mặc dù mỗi người chúng ta, với nền tảng văn hóa xã hội khác nhau, có lối tư duy logic riêng, nhưng nhìn chung, chúng ta đều chia sẻ những mẫu số chung trong việc suy nghĩ và nắm bắt tri thức. Có nghĩa là các thành viên trong hội đồng xét duyệt học bổng có những điểm chung trong việc nắm bắt thông tin với chúng ta. Do đó, sử dụng tư duy logic mạch lạc để trình bày và truyền đạt ý tưởng tới họ là cách an toàn, chắc chắn nhất để họ hiểu đúng ý mình và đánh giá đúng (chưa nói đến việc đánh giá cao) phẩm chất của mình.
Và CÁI HAY CỦA TƯ DUY LOGIC LÀ BẠN KHÔNG CẦN PHẢI CÓ THIÊN PHÚ, MÀ HOÀN TOÀN CÓ THỂ ĐẠT ĐƯỢC THÔNG QUA KIÊN TRÌ LUYỆN TẬP. Nếu chú tâm đến logic và thực hành logic kể cả trong các tình huống hàng ngày chẳng hạn như đi phơi quần áo thì phơi quần với quần, áo với áo, thì bạn dần dần sẽ có một thói quen phản xạ logic đối với các vấn đề/tình huống phát sinh. Điều này sẽ giúp bạn trở thành một ứng cử viên sáng giá hơn cho học bổng mà bạn lựa chọn. Hy vọng rằng bài viết này đã giúp bạn một phần nào đó trên con đường chinh phục ước mơ của mình. Nếu các bạn đi qua có thể góp ý dưới đây để cải thiện bài viết thì càng đáng quý.
📚 ☘️Các bạn muốn chuẩn bị xin học bổng có cả Thạc sỹ và Tiến sỹ cần hướng dẫn, mentor đừng quên các lớp học bổng HannahEd, chương trình Mentor 1-1, review hồ sơ, tập phỏng vấn HannahEd luôn sẵn sàng để hỗ trợ các bạn tối đa với các nội dung từ a=> z về tìm học bổng, làm hồ sơ trong đó có cả viết CV, LOR, essay, tập phỏng vấn nhé:
Lịch học mới nhất của các lớp: http://tiny.cc/HannahEdClass.
Link thông tin về lớp:
https://hannahed.co/lop-tim-va-nop-hoc-bong/
http://tiny.cc/HannahEdClassInfo
Các bạn email thoải mái câu hỏi, CV về [email protected] hoặc nhắn tin cho page nhé.
❤ Like page, tag và share bạn bè nhé ❤
#HannahEd #sanhocbong #scholarshipforVietnamesestudents #HannahEdSuccessfulstories #HannahEdOnlineClass #HannahEdMentorshipprogram
「proposal format」的推薦目錄:
- 關於proposal format 在 Scholarship for Vietnamese students Facebook 的精選貼文
- 關於proposal format 在 經濟部中小企業處 Facebook 的最讚貼文
- 關於proposal format 在 Taipei Ethereum Meetup Facebook 的最讚貼文
- 關於proposal format 在 Art Project Proposal Example Pdf Beautiful 6 formal Business ... 的評價
- 關於proposal format 在 Writing a proposal | Google Summer of Code Guides 的評價
proposal format 在 經濟部中小企業處 Facebook 的最讚貼文
【創業大冒險】🔊徵求政府機關來出題
經濟部中小企業處「政府出題.新創解題」機制,鼓勵各政府機關提出可透過科技手段解決的施政需求,開放給業者來挑戰❗️
對於審查通過的業者,中小企業處將補助業者與出題機關進行服務驗證,促成雙方合作共同形塑創新解決方案!每案補助最高100萬新台幣(補助比例最多50%)‼
🎯只要有具體明確規劃想法、科技化執法或為民服務需求,欲徵求新創提出解決方案的政府機關,皆歡迎申請提案✍✍
🖊提案期間:即日起至4月10日(星期五)止
📞洽詢專線:02-6607-2206
📨聯絡信箱:service@spp.org.tw
▶️提案計畫書下載 https://reurl.cc/R4do89
[Needs by Governments v.s. Solutions by Startups] Ask for proposal from government agencies📢📢
Borrowing the model of “innovative collaboration between governments and startups” from the Startup in Residence (STIR) of San Francisco, the government proposes their needs and the SMEA assists in calling for potential startups to discuss solutions. This is not only an opportunity for the government to solve its problems but also a chance for startups to demonstrate and test their solutions. The startups can also list their products and service on the inter-entity supply contract through the government’s procurement mechanism.
🖊The proposal delivering deadline:on Apr. 10th
📞Contact Us:+886-2-6607-2206
📨Email:service@spp.org.tw
▶ ️ Download proposal format https://reurl.cc/R4do89
proposal format 在 Taipei Ethereum Meetup Facebook 的最讚貼文
📜 [專欄新文章] Reason Why You Should Use EIP1167 Proxy Contract. (With Tutorial)
✍️ Ping Chen
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
EIP1167 minimal proxy contract is a standardized, gas-efficient way to deploy a bunch of contract clones from a factory.
1. Who may consider using EIP1167
For some DApp that are creating clones of a contract for its users, a “factory pattern” is usually introduced. Users simply interact with the factory to get a copy. For example, Gnosis Multisig Wallet has a factory. So, instead of copy-and-paste the source code to Remix, compile, key in some parameters, and deploy it by yourself, you can just ask the factory to create a wallet for you since the contract code has already been on-chain.
The problem is: we need standalone contract instances for each user, but then we’ll have many copies of the same bytecode on the blockchain, which seems redundant. Take multisig wallet as an example, different multisig wallet instances have separate addresses to receive assets and store the wallet’s owners’ addresses, but they can share the same program logic by referring to the same library. We call them ‘proxy contracts’.
One of the most famous proxy contract users is Uniswap. It also has a factory pattern to create exchanges for each ERC20 tokens. Different from Gnosis Multisig, Uniswap only has one exchange instance that contains full bytecode as the program logic, and the remainders are all proxies. So, when you go to Etherscan to check out the code, you’ll see a short bytecode, which is unlikely an implementation of an exchange.
0x3660006000376110006000366000732157a7894439191e520825fe9399ab8655e0f7085af41558576110006000f3
What it does is blindly relay every incoming transaction to the reference contract 0x2157a7894439191e520825fe9399ab8655e0f708by delegatecall.
Every proxy is a 100% replica of that contract but serving for different tokens.
The length of the creation code of Uniswap exchange implementation is 12468 bytes. A proxy contract, however, has only 46 bytes, which is much more gas efficient. So, if your DApp is in a scenario of creating copies of a contract, no matter for each user, each token, or what else, you may consider using proxy contracts to save gas.
2. Why use EIP1167
According to the proposal, EIP is a “minimal proxy contract”. It is currently the known shortest(in bytecode) and lowest gas consumption overhead implementation of proxy contract. Though most ERCs are protocols or interfaces, EIP1167 is the “best practice” of a proxy contract. It uses some EVM black magic to optimize performance.
EIP1167 not only minimizes length, but it is also literally a “minimal” proxy that does nothing but proxying. It minimizes trust. Unlike other upgradable proxy contracts that rely on the honesty of their administrator (who can change the implementation), address in EIP1167 is hardcoded in bytecode and remain unchangeable.
That brings convenience to the community.
Etherscan automatically displays code for EIP1167 proxies.
When you see an EIP1167 proxy, you can definitely regard it as the contract that it points to. For instance, if Etherscan finds a contract meets the format of EIP1167, and the reference implementation’s code has been published, it will automatically use that code for the proxy contract. Unfortunately, non-standard EIP1167 proxies like Uniswap will not benefit from this kind of network effect.
3. How to upgrade a contract to EIP1167 compatible
*Please read all the steps before use, otherwise there might have problems.
A. Build a clone factory
For Vyper, there’s a function create_with_code_of(address)that creates a proxy and returns its address. For Solidity, you may find a reference implementation here.
function createClone(address target) internal returns (address result){ bytes20 targetBytes = bytes20(target); assembly { let clone := mload(0x40) mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(clone, 0x14), targetBytes) mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) result := create(0, clone, 0x37) }}
You can either deploy the implementation contract first or deploy it with the factory’s constructor. I’ll suggest the former, so you can optimize it with higher runs.
contract WalletFactory is CloneFactory { address Template = "0xc0ffee"; function createWallet() external returns (address newWallet) { newWallet = createClone(Template); }}
B. Replace constructor with initializer
When it comes to a contract, there are two kinds of code: creation code and runtime code. Runtime code is the actual business logic stored in the contract’s code slot. Creation code, on the other hand, is runtime code plus an initialization process. When you compile a solidity source code, the output bytecode you get is creation code. And the permanent bytecode you can find on the blockchain is runtime code.
For EIP1167 proxies, we say it ‘clones’ a contract. It actually clones a contract’s runtime code. But if the contract that it is cloning has a constructor, the clone is not 100% precise. So, we need to slightly modify our implementation contract. Replace the constructor with an ‘initializer’, which is part of the permanent code but can only be called once.
// constructorconstructor(address _owner) external { owner = _owner;}// initializerfunction set(address _owner) external { require(owner == address(0)); owner = _owner;}
Mind that initializer is not a constructor, so theoretically it can be called multiple times. You need to maintain the edge case by yourself. Take the code above as an example, when the contract is initialized, the owner must never be set to 0, or anyone can modify it.
C. Don’t assign value outside a function
As mentioned, a creation code contains runtime code and initialization process. A so-called “initialization process” is not only a constructor but also all the variable assignments outside a function. If an EIP1167 proxy points to a contract that assigns value outside a function, it will again have different behavior. We need to remove them.
There are two approaches to solve this problem. The first one is to turn all the variables that need to be assigned to constant. By doing so, they are no longer a variable written in the contract’s storage, but a constant value that hardcoded everywhere it is used.
bytes32 public constant symbol = "4441490000000000000000000000000000000000000000000000000000000000";uint256 public constant decimals = 18;
Second, if you really want to assign a non-constant variable while initializing, then just add it to the initializer.
mapping(address => bool) public isOwner;uint public dailyWithdrawLimit;uint public signaturesRequired;
function set(address[] _owner, uint limit, uint required) external { require(dailyWithdrawLimit == 0 && signaturesRequired == 0); dailyWithdrawLimit = limit; signaturesRequired = required; //DO SOMETHING ELSE}
Our ultimate goal is to eliminate the difference between runtime code and creation code, so EIP1167 proxy can 100% imitate its implementation.
D. Put them all together
A proxy contract pattern splits the deployment process into two. But the factory can combine two steps into one, so users won’t feel different.
contract multisigWallet { //wallet interfaces function set(address[] owners, uint required, uint limit) external;}contract walletFactory is cloneFactory { address constant template = "0xdeadbeef"; function create(address[] owners, uint required, uint limit) external returns (address) { address wallet = createClone(template); multisigWallet(wallet).set(owners, required, limit); return wallet; }}
Since both the factory and the clone/proxy has exactly the same interface, no modification is required for all the existing DApp, webpage, and tools, just enjoy the benefit of proxy contracts!
4. Drawbacks
Though proxy contract can lower the storage fee of deploying multiple clones, it will slightly increase the gas cost of each operation in the future due to the usage of delegatecall. So, if the contract is not so long(in bytes), and you expect it’ll be called millions of times, it’ll eventually be more efficient to not use EIP1167 proxies.
In addition, proxy pattern also introduces a different attack vector to the system. For EIP1167 proxies, trust is minimized since the address they point to is hardcoded in bytecode. But, if the reference contract is not permanent, some problems may happen.
You might ever hear of parity multisig wallet hack. There are multiple proxies(not EIP1167) that refer to the same implementation. However, the wallet has a self-destruct function, which empties both the storage and the code of a contract. Unfortunately, there was a bug in Parity wallet’s access control and someone accidentally gained the ownership of the original implementation. That did not directly steal assets from other parity wallets, but then the hacker deleted the original implementation, making all the remaining wallets a shell without functionality, and lock assets in it forever.
https://cointelegraph.com/news/parity-multisig-wallet-hacked-or-how-come
Conclusion
In brief, the proxy factory pattern helps you to deploy a bunch of contract clones with a considerably lower gas cost. EIP1167 defines a bytecode format standard for minimal proxy and it is supported by Etherscan.
To upgrade a contract to EIP1167 compatible, you have to remove both constructor and variable assignment outside a function. So that runtime code will contain all business logic that proxies may need.
Here’s a use case of EIP1167 proxy contract: create adapters for ERC1155 tokens to support ERC20 interface.
pelith/erc-1155-adapter
References
https://eips.ethereum.org/EIPS/eip-1167
https://blog.openzeppelin.com/on-the-parity-wallet-multisig-hack-405a8c12e8f7/
Donation:
pingchen.eth
0xc1F9BB72216E5ecDc97e248F65E14df1fE46600a
Reason Why You Should Use EIP1167 Proxy Contract. (With Tutorial) was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
proposal format 在 Writing a proposal | Google Summer of Code Guides 的推薦與評價
Writing a proposal. The Basics; Elements of a Quality Proposal; Submit a Proposal early; Outside the Project List; General Notes. ... <看更多>
proposal format 在 Art Project Proposal Example Pdf Beautiful 6 formal Business ... 的推薦與評價
A proposal letter template is a cover letter which is sent along with the business proposals to introduce the proposal to the recipient. State clearly and ... ... <看更多>