【城規「新秩序」?】林鄭要精簡城規程序 是要精簡什麼? #肢解城市規劃 #8月專研
近日林鄭一反過往「香港缺地論」,指「香港有足夠的土地,但(發展)速度要加快」,以「程序繁複」的理由,開始將土地問題的矛頭轉戰「壓縮城規發展程序」。有大量近年已開始/即將落實就建築物高度限制、園景及綠化上蓋面積、樓宇間距及樓宇後移等精簡審批的措施,亦有各種地產界、建制政黨及智庫提出更激進建議,包括修改城規條例、《收回土地條例》、《道路工程條例》,甚至揚言「簡化」公眾參與程序、「改革」補地價制度等,近日發展局局長黃偉綸更提議大規模放寬濕地緩衝區周邊的高度限制,向既有城規制度進行大手術,以期加快土地發展。
以上精簡流程的討論,流於實際的技術操作討論,艱澀難明,所以目前民間缺乏面向公眾的說明,使大家無法掌握相關技術改動,究竟正將香港城市規劃帶往何方。是次 #肢解城市規劃 專題特意邀請了幾位富有參與規劃程序的前線專業人士,透過深入小組探討各項精簡措施的關鍵課題,深入淺出解讀以上精簡城規措施對土地發展的成效、含義與潛在影響。
▌現行城規流程簡明透視
要掌握精簡措施的關鍵,需要先知道現時一個土地發展項目,由白紙一張到取得新地契,直至完成樓宇興建整個發展流程,究竟需要經過多少部門、法規及程序。
簡單來說,一般住宅發展申請主要涉及三個審批部門:規劃署、屋宇署及地政總署。
一、由規劃署支援的城規會根據《城市規劃條例》審議發展申請的各種內容,當中會有公眾表述及聽證會表達意見。
二、地政總署會負責就該發展項目,製訂/修訂一份用以發展管制的地契條款合約,有需要修訂地契條款就要計算出補地價的金額,樓盤發售前,須獲得地政署同意地契條款已經完成的「滿意紙」(Certificate of Compliance)。
過程中亦會因應不同情況牽涉不同部門 (例如運輸署、環保署等) 的參與,包括在城規會審議及批出許可條件或者在製訂地契條款時徵詢部門與局方的(技術)意見。
三、建築圖則的審批就會由屋宇署作部門協調,主要檢視圖則是否符合規劃申請時的訂下的要求,與及有否符合《建築物條例》標準,及後會獲批建築圖則 (或叫「開工紙」),工程便可以正式動工,最後工程完成滿足《建築物條例》要求,項目取得「入伙紙」屋宇署的角色就大致完成。
現在不少審批程序,例如高度限制、園景設計等,規劃署、屋宇署和地政總署之間被認為「疊床架屋」,且準則不一,故此政府先透過「簡化」尤其地政總署參與在內的「重覆審批」,從而加快土地供應。
可是,即將出爐的精簡修訂建議,卻不止是關乎城規流程的重覆審批,亦透過修例或放寬發展限制,聲稱能達到加快土地供應的效果,但這個聲稱的目的真的能夠達到嗎?
▌精簡程序 是否重疊 有否加快?
一個發展項目主要涉及三個審批部門,過往被批評部門審批角色重疊。現時精簡規劃程序有意刪走地政總署參與在內的審批角色,為求加快審批效率。
以建築物高度限制為例,以往一直以法定規劃圖則和地契兩方面規管,精簡安排後除了特別情況,建築物高限制不會出現在新訂立或修訂的地契內。
有建築業界覺得是項精簡某程度上合理,因為有時地契上的高度限制,有時來自舊的規劃圖則,規劃方面而言,分區規劃大綱圖不斷修改,不必又再重新找地政修改地契,只要規劃署把關就可以了。有規劃師甚至會提出地契中「建築物高度限制」本身多餘,因本身已有總樓面面積和地積比等規劃工具控制建築物的體積。可見,以上業界人士普遍認為目前的精簡程序措施是嘗試應對處理規劃申請時職能重疊的「官僚化」問題。
問題是,透過精簡審批這個少少的程序,是否能加快整個房屋發展的過程?
有業界人士質疑,現時地政審批地契條款的程序,會多大程度影響房屋工程的進度。因為地契其實只是政府與發展商之間的一紙合約,不會令工程不乎合法規要求,似乎不太會影響工程進度。發展商只要在最後階段賣樓前滿足地契的要求就足夠,簡單刪去幾個條款,會有多大程序影響整個工程時間表?結論是,到目前一刻的精簡城規流程措施,對加快建屋過程有多大幫助,仍然是個大問號。
過往亦有就地政層面的「加快」嘗試,效果亦是一個大問號。以發展商極為關注的補地價問題為例,政府早於2014年推出的「補地價仲裁先導計劃」,嘗試加快處理農地改劃為住宅用地的地契修訂申請,但直到2021年的6月,地政總署回應立法會質詢時,卻沒有備存實際處理申請個案時間的整體統計數據,並解釋指「每宗申請的時間取決於該個案的複雜程度及所牽涉的問題」。就此,似乎政府都無法評估「加速」措施前後的成效。
▌審批程序以外的建屋能力限制
現時精簡規劃程序的措施,似乎就不能簡單地加快整體房屋供應,因為建屋步伐其實更多是受制於其他大環境因素,而非地契上的幾條條款。根據業界人士的觀察所得,舉例說現時公營房屋供應的速度更多跟工程部門的負荷能力有關。
過往公屋工程進度緩慢,其實不是全然是覓地問題,更多是覓地後卻無人可跟進工程。據業內人士稱,由於很多「靚地皮」已被政府賣地予私人發展商起豪宅或商廈等,剩下可供建公屋的地皮若不是「盲搶地」得來,就是先天條件不佳,需要平整土地。而負責平整土地的土木工程拓展署,內部有今年工程量的清單,若超出今年工程量的話,就會排後一年再處理,結果房屋署不是沒有土地建屋,而是有了土地,卻等了一整年才得以開展工程。
業界人士推測工程部門長期欠缺人手,其中一個原因可能是政府大型基建過多,當然這亦包括公眾所理解的「大白象工程」。如果將政府工程部門的人手吸引到明日大嶼等大型基建,似乎亦會令到整個工程界別的人手短缺,倒過頭來拖慢房屋供應,猶如搵石頭砸自己隻腳。
以上的例子顯示,現在政府「發展速度太慢」的定調似乎忽略了規劃程序之外的其他決定性因素,單單強調精簡加快城規程序,或者無助改善現時房屋供應不足的問題。
▌犧牲質素的「精簡」趨勢?
政府除了推行現時一系列的精簡措施外,不斷加快審批整個發展流程亦成為各個部門內部的首要任務。此時需要思考,這個「谷催加速」趨勢會對政府部門對於城市發展的把關及引導角色帶來什麼的負面影響?會否削弱本身監管下應有的質素?我們的城市景觀及生活質素,會否因而下降?
以園境規劃程序為例,過往一個發展項目的「園景設計總圖」(Landscape Master Plan)分別交由規劃署及地政署審批。2019年發展局發佈聯合作業備考第3號(Joint Practice Note No. 3),提出精簡園境的規劃申請程序,將規劃申請中園境設計一般交由規劃署作為主要審批,並交由屋宇署審批綠化覆蓋率(Site Coverage of Greenery)。
有園境建築業界觀察所得,過往規劃署及地政署的審批準則不一情況時有出現,亦有批評政府部門審批發展項目的園境設計十分主觀。上至發展項目的通風、園藝移樹、園境美化以及開放空間的佈置,下至會追問項目中種植一顆樹的品種類型,當中不時涉及主觀的判斷。相應地,這亦反映出部門會仔細監管園境的具體設計。若將審批準則統一,精簡成「點心紙式」的硬性要求,會不會使發展商出現「湊數交貨」的情況?
對於現時政府「總加速」的綱領下,除了精簡規劃程序,有部門因審批不透明屢次被官媒狙擊拖慢土地供應,而政府部門內部亦被要求加快工作效率,否則將輕易「中槍」,成為現時「鬥官僚」的目標。有業界亦表示公營房屋項目的園境設計也需要配合加快,我們必須小心,會否因而犧牲園境設計時應有的全面質量。
有園境業界人士有聽聞,政府部門為求加快公營房屋供應(或需要彌補因土木工程署工程吸納量不足而導致的延誤),現時在制定某些公營房屋的園境圖則時,往往鼓勵採用「直線型」的模組化(modular)設計,嫌其他風格(包括曲線型)的設計興建速度慢,而這些曲線型設計對於整體景觀很多時有助益作用,甚或乎是個別地盤的實際需要。
透過犧牲因地制宜的園境規劃考量,而所換來的「精簡」成效,卻只是加快數天的制定工作,省時很少。這樣只會製造出更多倒模型公屋屋邨,而屋苑社區亦欠缺特色及變化,在地住戶的生活質素相信隨之而會被「精簡」。
▌公開補地價計算的雙面刃
發展商開發項目時,必須經歷修訂地契上的限制條款/改變土地用途等申請,因而須向政府就修訂前後的土地價值進行補地價,有發展商指這太浪費時間了。
現在開始有媒體吹風,政府正考慮列明「補地價」不同細項的計算方法,作為精簡城規流程的一個辦法。然而,「補地價」牽涉公帑收入,公眾利益影響極大,所以政府需要謹慎的補地價計算程序,避免公帑損失或招致官商勾結嫌疑,花這些時間站在公眾利益立場看似是必須的。
但現時,發展商正積極撼動這個多年來的安排。有不少發展商指很難預計政府會提出的補地價水平(業界一般理解是扣除所有成本後,政府會預留發展預期收益的20%給發展商以訂出補地價的金額,大型項目補地價金額可動輒上百億),所以以當發展商察覺到某些時期有條件接近的地皮的補地價金額便宜時,就會出現一窩蜂為數個不同項目申請補地價的情況。
因此有業界認為,對發展商而言,補地價計算準則更透明,發展商理論上有機會更主動向政府申請補地價。但同時,正如前面所述,「補地價」牽涉公帑收入,公眾利益影響極大,如果被地產商得知補地價的計算準則,亦可以預期發展商會針對每個細項數字向政府「拗數」,若然發生,這將必然拖慢發展程序,有發展商甚至會有理據,就政府開出的補地價及其安排司法覆核(相對於補地價的天價金額,司法覆核的律師費用可說是九牛一毛,若然覆核成功一次半次,發展商已經「賺到有突」,增加了發展商挑起法律挑戰的誘因),引起更長時間的爭拗,所謂「精簡」程序能夠加快發展的期望落空,欲速不達。
而無論是對政府還是地產商,補地價問題也是兵家必爭之地,前者是關乎龐大的土地收益,後者是巨大的土地利潤,若然挑起補地價的紛爭,這爭拗將沒完沒了,除了公帑有機會蒙上損失,更要命的是,發展商看似很關心的發展速度,很可能會被拋諸腦後。
▌最壞的還未到臨
最後,精簡發展管制督導小組現在正考慮推出最具爭議亦係土地利益核心﹕涉及總樓面面積以及補地價方法的精簡措施。連同一系列政府官員以及建制團體,針對濕地緩衝區大幅度放寬的發展管制,以及城規程序的民主參與部分。精簡發展管制小組的動態,即將成為新界北及明日大嶼等大型發展計劃以外,直接改變本地土地發展玩法,具相當技術性,同時亦最具爭議性的城市議程之一。
--
8月專研系列 #肢解城市規劃 全集:https://liber-research.com/steamlining_planning/
💪 研究自主 月捐撐起最新專研系列:https://liber-research.com/support-us/
FPS ID:5390547
HSBC PayMe 捐款支持:https://bit.ly/32aoOMn
Podcast:https://liber-research.com/podcast/
義工招募:https://bit.ly/2SbbyT3
模組化舉例 在 Y道理 Facebook 的最讚貼文
以前 Google 做的時候,其中一個原因就是這個邏輯「很環保」。我記得我有讀過相關的報導,他還舉例說明了「很大比例人換手機是為了要換相機。」(以及某些特定部位。) 所以如果可以模組化手機,商機巨大、又環保。
.
後來這個夢醒了。困難的原因包括技術規格、軟體維護,商業模式。
.
我覺得商業模式最好思考了。如果以後「一支手機」變成賣特定部位,那單價低了、通路怎麼辦?以及現在銷售手機的模式也可能全都變了?又或者根本都沒有「新機」的商機了。
.
與其環保但賺不到錢的活著,不如賺錢卻浪費地球資源的活著?畢竟,好的環保模式還是要因應人性的找到合理的商用模式 ...
模組化舉例 在 Taipei Ethereum Meetup Facebook 的最讚貼文
📜 [專欄新文章] 可升級合約介紹 - 鑽石合約(EIP-2535 Diamond standard)
✍️ Kimi Wu
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
Photo by Evie S. on Unsplash
前言
可升級合約簡單來說是透過 proxy contract(代理合約)來達成,藉由代理合約去呼叫欲執行的合約,若要升級,則把代理合約中的指向的地址換為新的合約地址即可。而執行的方式則是透過 delegateCall,但 delegateCall 不會更動目標合約的狀態。所以要怎麼處理變數,就是一門學問了。
舉例來說,contract B 有個變數 uint256 x,初始值為 0, 而 function setX(uint256),可以改變 x 的值。proxy contract A 使用 delegatecall 呼叫 contract B 的 setX(10),交易結束後,contract B中的 x 依然還是 0。
OpenZeppelin 提出了三種實作方式,可以做到可升級合約,細節可參考 Proxy Patterns,而最終的實作選用了 Unstructured Storage的這個方式,這種方式對於開發較友善,開發時不需特別處理 state variables(不過升級時就需要特別注意了)。而這篇主要是介紹 Diamond standard,OpenZeppelin 的可升級合約就不多做介紹。
USDC V2 : Upgrading a multi-billion dollar ERC-20 token 詳細地介紹代理合約跟變數儲存之間的關係,不了解升級合約的原理,建議先看看。
鑽石合約
名詞介紹
diamond:合約本體,是一個代理合約,無商業邏輯
facet:延伸的合約(實際商業邏輯實作的合約)
loupe:也是一個 facet,負責查詢的功能。可查詢此 diamond所提供的 facet與facet所提供的函式
diamondCut:一組函式,用來管理(增加/取代/減少)此 diamond合約所支援的功能
Loupe
直接來看 loupe的介面,從宣告就能很清楚暸解 diamond合約的實作方式,loupe宣告了一個結構 Facet,Facet結構包含一個地址及 function selector 陣列,所以我們只需要記錄一個 Facet陣列就可以得知這個 diamond 合約有多少個延伸合約及所支援的功能(loupe只定義結構,而實際變數是存在diamon合約中的)。也就是 diamond合約中只記錄延伸合約的地址及其支援的 function selectors,及少數 diamond合約的管理邏輯,並無商業邏輯,因此可以外掛非常非常多的合約上去(就像一個Hub),也就可以突破一個合約只有24K的限制。
// A loupe is a small magnifying glass used to look at diamonds.interface IDiamondLoupe { struct Facet { address facetAddress; bytes4[] functionSelectors; } function facets() external view returns (Facet[] memory facets_); function facetFunctionSelectors(address _facet) external view returns (bytes4[] memory facetFunctionSelectors_); function facetAddresses() external view returns (address[] memory facetAddresses_); function facetAddress(bytes4 _functionSelector) external view returns (address facetAddress_);}
DiamondCut
至於 facet在 diamond合約上的註冊或是修改,就由 diamondCut負責,從以下程式碼可以清楚瞭解其功能(EIP中有規範,每次改變都需要發送DiamondCut事件)
interface IDiamondCut { enum FacetCutAction {Add, Replace, Remove} // Add=0, Replace=1, Remove=2 struct FacetCut { address facetAddress; FacetCutAction action; bytes4[] functionSelectors; } function diamondCut( FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata ) external; event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);}
Diamond合約
接下來就是最核心的部分 — diamond本體合約。以下是官方的範例,方法上跟 OpenZeppelin 一樣使用 fallback 函式跟 delegateCall 。
呼叫合約所不支援的函式,就會去執行 fallback 函式,fallback 函式中再透過 delegateCall 呼叫 facet 合約相對應的函式
fallback() external payable { address facet = selectorTofacet[msg.sig]; require(facet != address(0)); // Execute external function from facet using delegatecall and return any value. assembly { calldatacopy(0, 0, calldatasize()) let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0) returndatacopy(0, 0, returndatasize()) switch result case 0 {revert(0, returndatasize())} default {return (0, returndatasize())} }}
主要的差異在於變數的處理,OpenZepplin 是針對單一合約設計的代理合約(也就是每個合約都有自己的代理合約),所以無法處理單一代理合約儲存多個合約的變數(state variables)的狀況(後有圖例)。先由官方的範例程式來了解是怎麼處理變數的
在官方的範例中,都是以更改合約 owner 為例子
首先看到 DimaondStorage這個結構,結構中的前面三個變數都是在維持 diamond合約的運作(同上面loupe的範例),最後一個變數 contractOwner就是我們商業邏輯中所需的變數。
接著看到 function diamondStorage(),取變數的方式就跟OpenZeppelin 儲存特定變數方式一樣(EIP-1967),是把變數存到一個遠方不會跟其他變數碰撞到的位置,在這裡就是從 DIMOND_STORAGE_POSITION 這個 storage slot 讀取。
在實作上就可以有 LibDiamond1 ,宣告DIMOND_STORAGE_POSITION1=keccak256("diamond.standard.diamond.storage1") ,負責處理另一組的變數。藉由這種方式讓每個 facet合約有屬於自己合約的變數, facet合約間就不會互相影響。而最下方的 setContractOwner 是實際使用的範例。
library LibDiamond {
bytes32 constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage");
struct FacetAddressAndSelectorPosition { address facetAddress; uint16 selectorPosition; }
struct DiamondStorage { mapping(bytes4 => FacetAddressAndSelectorPosition) facetAddressAndSelectorPosition; bytes4[] selectors; mapping(bytes4 => bool) supportedInterfaces; // owner of the contract address contractOwner; }
function diamondStorage() internal pure returns (DiamondStorage storage ds) { bytes32 position = DIAMOND_STORAGE_POSITION; assembly { ds.slot := position } }
function setContractOwner(address _newOwner) internal { DiamondStorage storage ds = diamondStorage(); address previousOwner = ds.contractOwner; ds.contractOwner = _newOwner; emit OwnershipTransferred(previousOwner, _newOwner); }
每個 library 處理了一組或多組變數的存取, facet 合約透過 library 對變數做操作。也就是把變數存在diamond主體合約,延伸的 facet合約只處理邏輯,是透過 library 去操作變數。
下面圖中清楚地解釋了 facet合約,function selectors 與變數之間的關係,從最左上這邊有個 facets 的 map,紀錄了哪個 selector 在哪個合約中,例如func1, func2是 FacetA的函式。左下角宣告了變數,每組變數的存取如同上述 library 的方式處理。
https://eips.ethereum.org/EIPS/eip-2535#diagrams
在 diamond的設計中,每個 facet合約都是獨立的,因此可以重複使用(跟library 的概念一樣)
https://eips.ethereum.org/EIPS/eip-2535#diagrams
小結
diamond合約使用不同的設計來達成合約的可升級性,藉由這種Hub方式可隨時擴充/移除功能,讓合約不再受限於24KB的限制,此外充分的模組化,讓每次升級的範圍可以很小。最後,因為跟library一樣只處理邏輯,並無狀態儲存,所以可以重複被不同的diamond合約所使用。
雖然又不少好處,也是有些缺點。首先,術語名詞太多,facet, diamondCut, loupe等等(其實還有好幾個,不過沒有介紹到那些部分,所以沒有寫出來)。開發上不直覺,把變數跟邏輯拆開,若要再加上合約之間的繼承關係,容易搞混,不易維護。最後,gas的花費,在函式的讀取、呼叫,變數的存取、傳遞都會有不少的額外支出。Trail of Bits 專欄中有點出更多的缺陷 Good idea, bad design: How the Diamond standard falls short,不過作者也有反擊 Addressing Josselin Feist’s Concern’s of EIP-2535 Diamond Standard,有興趣的讀者可以自行看看、比較。
為了模組化及彈性,diamond合約在設計上有點太複雜(over engineering),會造成可讀性越差(這點也是Vyper誕生的原因之一),而可讀性越差就越容易產生bug、也越不容易抓到bug,而在defi專案中,一個小小的bug通常代表著大筆金額的損失 😱😱😱。
雖然如此,筆者還是覺得很酷,有些設計的思維仍然可以使用在自己的專案
ref:
EIP 2535
Diamond 實作
Addressing Josselin Feist’s Concern’s of EIP-2535 Diamond Standard
OpenZeppelin upgradeable contract
可升級合約介紹 - 鑽石合約(EIP-2535 Diamond standard) was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
模組化舉例 在 模組化意義在PTT/Dcard完整相關資訊 的推薦與評價
Day02 - 什麼是模組和模組化設計- iT 邦幫忙::一起幫忙解決難題...2019年9月9日· 這是系列文的第一篇,首先讓我們釐清相關的專有名詞開始。 模組(module) 從維基百科 ... ... <看更多>
模組化舉例 在 [譯] 解析Javascript 模組機制與建置函式庫觀念 的推薦與評價
當我們說一個應用程式具備模組化的特性,我們一般是說這個程式是由一系列高度解耦,各自負責 ... 舉例來說:我們要包含 lib 和 dist 目錄則設定會是 ... ... <看更多>
模組化舉例 在 模組化意義在PTT/Dcard完整相關資訊 的推薦與評價
Day02 - 什麼是模組和模組化設計- iT 邦幫忙::一起幫忙解決難題...2019年9月9日· 這是系列文的第一篇,首先讓我們釐清相關的專有名詞開始。 模組(module) 從維基百科 ... ... <看更多>