{"id":52506,"date":"2019-11-10T00:00:00","date_gmt":"2019-11-09T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/kak-napisat-smart-kontrakt-na-python-v-seti-ontology-chast-1-blockchain-block-api"},"modified":"2020-02-18T14:00:15","modified_gmt":"2020-02-18T11:00:15","slug":"kak-napisat-smart-kontrakt-na-python-v-seti-ontology-chast-1-blockchain-block-api","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/kak-napisat-smart-kontrakt-na-python-v-seti-ontology-chast-1-blockchain-block-api","title":{"rendered":"How to Write a Smart Contract in Python on the Ontology Network. Part 1: Blockchain &amp; Block API","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"How to write a smart contract in Python on the Ontology network. Part 1: Blockchain &amp; Block API\" src=\"\/wp-content\/uploads\/2019\/11\/4748f7bfd5e6c0b7a17ec511d22313df.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThis is the first part of a series of tutorial articles on creating smart contracts in Python on the Ontology blockchain network using the smart contract development tool. <noindex><a rel=\"nofollow\" href=\"https:\/\/smartx.ont.io\/\">SmartX<\/a><\/noindex>. <\/p>\n<p>In this article, we will begin exploring the Ontology smart contract API. The Ontology smart contract API is divided into 7 modules: <\/p>\n<ol>\n<li>Blockchain &amp; Block API, <\/li>\n<li>Runtime API, <\/li>\n<li>Storage API, <\/li>\n<li>Native API, <\/li>\n<li>Upgrade API, <\/li>\n<li>Execution Engine API, and <\/li>\n<li>Static &amp; Dynamic Call API.<\/li>\n<\/ol>\n<p>\nThe Blockchain &amp; Block API is the core component of the Ontology smart contract system. The Blockchain API supports fundamental blockchain query operations, such as obtaining the current block height, while the Block API supports basic block query operations, such as requesting the number of transactions for a given block.<\/p>\n<p><b>Let's get started!<\/b><\/p>\n<p>First, create a new contract in <noindex><a rel=\"nofollow\" href=\"https:\/\/smartx.ont.io\/#\">SmartX<\/a><\/noindex>, and then follow the instructions below.<br \/>\n <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>1. How to Use the Blockchain API<\/h3>\n<p>\nSmart contract function references are identical to Python function references. You can call the relevant functions as needed. For instance, the instruction below calls GetHeight\u2014the function for obtaining the current block height, and GetHeader\u2014the function for retrieving the block header.<\/p>\n<pre><code class=\"python\">from ontology.interop.System.Blockchain import GetHeight, GetHeader<\/code><\/pre>\n<p><\/p>\n<h4>GetHeight<\/h4>\n<p>\nGetHeight is used to obtain the latest block sequential number in the blockchain, as shown in the below example. In this example for convenience, we will skip the Main function, but you can add it if necessary.<\/p>\n<pre><code class=\"python\">from ontology.interop.System.Runtime import Notify\nfrom ontology.interop.System.Blockchain import GetHeight\ndef Main(operation):\n    if operation == 'demo':\n        return demo()\n    return False\n\ndef demo():\n    height=GetHeight()\n    Notify(height) # print height\n    return height #return height after running the function<\/code><\/pre>\n<p><\/p>\n<h4>GetHeader<\/h4>\n<p>\nGetHeader is used to obtain the block header, with the parameter being the block sequential number in the blockchain. For example:<\/p>\n<pre><code class=\"python\">from ontology.interop.System.Runtime import Notify\nfrom ontology.interop.System.Blockchain import GetHeader\ndef demo():\n    block_height=10\n    header=GetHeader(block_height) \n    Notify(header)\nreturn header<\/code><\/pre>\n<p><\/p>\n<h4>GetTransactionByHash<\/h4>\n<p>\nGetTransactionByHash is used to retrieve a transaction by its hash. The transaction hash is sent to <i>GetTransactionByHash <\/i>as parameters in bytearray format. The key to this function is converting the transaction hash from hex format to bytearray format. This is an important step; otherwise, you would receive an error indicating that there is no block with such a block hash. Let's take a transaction hash in hex format as an example to convert it to bytearray format. The example looks like this:<\/p>\n<pre><code class=\"python\">9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1<\/code><\/pre>\n<p>\nFirst, reverse the transaction hash:<\/p>\n<pre><code class=\"python\">c1890c4d730626dfaa9449419d662505eab3bda2e1f01f89463cc1a4a30a279<\/code><\/pre>\n<p>\nDevelopers can perform this step using the Hex Number (little endian) conversion tool provided by SmartX.<\/p>\n<p>Then convert the resulting output to bytearray format:<\/p>\n<pre><code class=\"python\">{0xc1,0x89,0x0c,0x4d,0x73,0x06,0x26,0xdf,0xaa,0x94,0x49,0x41,0x9d,0x66,0x25,0x05,0xea,0xb3,0xbd,0xa2,0xe1,0xf0,0x1f,0x89,0x46,0x3c,0xc1,0xa4,0xa3,0x0a,0x27,0x9f}<\/code><\/pre>\n<p>\nThis can be done using the String Byte Array conversion tool provided by SmartX. Finally, convert the resulting bytearray to a string like this:<\/p>\n<pre><code class=\"python\">xc1x89x0cx4dx73x06x26xdfxaax94x49x41x9dx66x25x05xeaxb3xbdxa2xe1xf0x1fx89x46x3cxc1xa4xa3x0ax27x9f<\/code><\/pre>\n<p>\nBelow is an example of the GetTransactionByHash function that retrieves a transaction via its hash:<\/p>\n<pre><code class=\"python\">from ontology.interop.System.Blockchain import GetTransactionByHash\ndef demo():\n    # tx_hash=\"9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1\"    \n    tx_hash=bytearray(b\"xc1x89x0cx4dx73x06x26xdfxaax94x49x41x9dx66x25x05xeaxb3xbdxa2xe1xf0x1fx89x46x3cxc1xa4xa3x0ax27x9f\")\n    tx=GetTransactionByHash(tx_hash)\n    return tx<\/code><\/pre>\n<h4>GetTransactionHeight<\/h4>\n<p>\nGetTransactionHeight is used to retrieve the transaction height via the transaction hash. Let\u2019s take the hash from the example above:<\/p>\n<pre><code class=\"python\">from ontology.interop.System.Blockchain import GetTransactionHeight\ndef demo():\n    #   tx_hash=\"9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1\"    \n    tx_hash=bytearray(b\"xc1x89x0cx4dx73x06x26xdfxaax94x49x41x9dx66x25x05xeaxb3xbdxa2xe1xf0x1fx89x46x3cxc1xa4xa3x0ax27x9f\")\n    height=GetTransactionHeight(tx_hash)\n    return height<\/code><\/pre>\n<p><\/p>\n<h4>GetContract<\/h4>\n<p>\nDevelopers can use the GetContract function to retrieve a contract via its hash. The process of converting the contract hash is similar to that of converting the transaction hash mentioned above.<\/p>\n<pre><code class=\"python\">from ontology.interop.System.Blockchain import GetContract\ndef demo():\n    # contract_hash=\"d81a75a5ff9b95effa91239ff0bb3232219698fa\"    \n    contract_hash=bytearray(b\"xfax98x96x21x32x32xbbxf0x9fx23x91xfaxefx95x9bxffxa5x75x1axd8\")\n    contract=GetContract(contract_hash)\n    return contract<\/code><\/pre>\n<p><\/p>\n<h4>GetBlock<\/h4>\n<p>\nGetBlock is used to retrieve a block. There are two ways to obtain a specific block.<\/p>\n<p><b>1. Get a block by its height:<\/b><\/p>\n<pre><code class=\"python\">from ontology.interop.System.Blockchain import GetBlock\ndef demo():\n    block=GetBlock(1408)\n    return block<\/code><\/pre>\n<p>\n<b>2. Get a block by its hash:<\/b><\/p>\n<pre><code class=\"python\">from ontology.interop.System.Blockchain import GetBlock\ndef demo():    \n    block_hash=bytearray(b'x16xe0xc5x40x82x79x77x30x44xeax66xc8xc4x5dx17xf7x17x73x92x33x6dx54xe3x48x46x0bxc3x2fxe2x15x03xe4')\n    block=GetBlock(block_hash)<\/code><\/pre>\n<p><\/p>\n<h3>2. How to use the Block API<\/h3>\n<p>\nThere are three available functions in the Block API: <i>GetTransactions<\/i>, <i>GetTransactionCount<\/i>, and <i>GetTransactionByIndex<\/i>. We will discuss them one by one.<\/p>\n<h4>GetTransactionCount<\/h4>\n<p>\nGetTransactionCount is used to retrieve the number of transactions for the given block.<\/p>\n<pre><code class=\"python\">from ontology.interop.System.Blockchain import GetBlock\nfrom ontology.interop.System.Block import GetTransactionCount\ndef demo():\n    block=GetBlock(1408)\n    count=GetTransactionCount(block)\n    return count<\/code><\/pre>\n<p><\/p>\n<h3>GetTransactions<\/h3>\n<p>\nDevelopers can use the GetTransactions function to retrieve all transactions in the specified block.<\/p>\n<pre><code class=\"python\">from ontology.interop.System.Blockchain import GetBlock\nfrom ontology.interop.System.Block import GetTransactions \ndef demo():\n    block=GetBlock(1408)\n    txs=GetTransactions(block)\n    return txs<\/code><\/pre>\n<p><\/p>\n<h4>GetTransactionByIndex<\/h4>\n<p>\nGetTransactionByIndex is used to retrieve a specific transaction in the specified block.<\/p>\n<pre><code class=\"python\">from ontology.interop.System.Blockchain import GetBlock\nfrom ontology.interop.System.Block import GetTransactionByIndex\ndef demo():\n    block=GetBlock(1408)\n    tx=GetTransactionByIndex(block,0) # index starts from 0.\n    return tx<\/code><\/pre>\n<p>\nThe complete guide can be found on our <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/punicasuite\/tutorials\/blob\/master\/smart-contracts-docs-cn\/course04_use_blockchain_api_in_smart_contract.md\">GitHub<\/a><\/noindex>.<\/p>\n<h3>Afterword<\/h3>\n<p>\nBlockchain &amp; Block API is an essential part of smart contracts, as you can use it to request blockchain data and block data within smart contracts. In the following articles, we will discuss how to use the remaining APIs and understand their interaction with the Ontology blockchain.<\/p>\n<blockquote><p>This article was translated by the Hashrate&amp;Shares editorial team specifically for OntologyRussia. <noindex><a rel=\"nofollow\" href=\"https:\/\/hashrate-and-shares.ru\/kak-razrabotat-smart-kontrakt-s-pomoshchyu-python-v-seti-ontology-chast-pervaya\">click<\/a><\/noindex> <\/p><\/blockquote>\n<p> Are you a developer? Join our technical community on <noindex><a rel=\"nofollow\" href=\"https:\/\/discord.gg\/4TQujHj\">Discord<\/a><\/noindex>. Also, check out the <noindex><a rel=\"nofollow\" href=\"https:\/\/developer.ont.io\/\">Developer Center<\/a><\/noindex> on our website, where you can find developer tools, documentation, and much more.<\/p>\n<h4>Ontology<\/h4>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ont.io\/\">Ontology website<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ontio\/\">GitHub<\/a><\/noindex> \/ <noindex><a rel=\"nofollow\" href=\"https:\/\/discord.gg\/pQRHtbD\">Discord<\/a><\/noindex><\/li>\n<li>Telegram <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/OntologyNetwork\">English<\/a><\/noindex> \/ <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/OntologyAnnouncementsRu\">Russian<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/OntologyNetwork\">Twitter <\/a><\/noindex> \/ <noindex><a rel=\"nofollow\" href=\"https:\/\/www.reddit.com\/r\/OntologyNetwork\/\">Reddit <\/a><\/noindex><\/li>\n<\/ul>\n<p>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/474966\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042d\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u043c\u0430\u0440\u0442-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u0432 \u043d\u0430 Python \u0432 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d \u0441\u0435\u0442\u0438 Ontology \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043c\u0430\u0440\u0442-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u0432 SmartX. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0430\u0447\u043d\u0451\u043c \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 API \u0441\u043c\u0430\u0440\u0442-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 Ontology. API \u0441\u043c\u0430\u0440\u0442-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 Ontology \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d \u043d\u0430 7 \u043c\u043e\u0434\u0443\u043b\u0435\u0439: Blockchain &amp; Block API, Runtime API, Storage API, Native API, Upgrade API, Execution Engine API \u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":52507,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-52506","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/kak-napisat-smart-kontrakt-na-python-v-seti-ontology-chast-1-blockchain-block-api\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043c\u0430\u0440\u0442-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043d\u0430 Python \u0432 \u0441\u0435\u0442\u0438 Ontology. \u0427\u0430\u0441\u0442\u044c 1: Blockchain &amp; Block API | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/kak-napisat-smart-kontrakt-na-python-v-seti-ontology-chast-1-blockchain-block-api\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-11-09T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:00:15+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47How to write a smart contract in Python on the Ontology network. Part 1: Blockchain &amp; Block API | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/kak-napisat-smart-kontrakt-na-python-v-seti-ontology-chast-1-blockchain-block-api","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043c\u0430\u0440\u0442-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043d\u0430 Python \u0432 \u0441\u0435\u0442\u0438 Ontology. \u0427\u0430\u0441\u0442\u044c 1: Blockchain &amp; Block API | ProHoster","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/kak-napisat-smart-kontrakt-na-python-v-seti-ontology-chast-1-blockchain-block-api","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-11-09T21:00:00+00:00","article:modified_time":"2020-02-18T11:00:15+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52506","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 03:50:21","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:42:42","updated":"2026-01-24 03:50:21","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/52506","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=52506"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/52506\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/52507"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=52506"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=52506"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=52506"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}