)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"8538ecb1_64d2676b","updated":"2021-07-27 16:32:04.000000000","message":"First pass: the logic generally seems fine, but there\u0027s a bunch of Go style issues.\n\nThis also needs much better internal documentation: there should be enough comments to teach a reader the basics of how dm-verity works, or at the very least point them to the right documentation. Godoc-style comments generally function well for literate-programming-lite: if you start off with a commented package, then relevant commented structs, and then relevant commented methods the resulting file tends to read as cohesive prose.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"86663be3941160d6e42b32afe373d29c6f4bcd0c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"5c758449_05d242ec","updated":"2021-08-02 09:13:28.000000000","message":"As per standup call, waiting for next patchset to address all style comments.","commit_id":"c7cc79116df19e2618be5f0751099e0642bf5c12"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"a1df77fb8548e37f324552b310f840df433ecdc7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"44db1b1f_508bb77e","updated":"2021-08-02 09:23:44.000000000","message":"I\u0027ll be sending out another patchset in 1-2 hours, hold it please.","commit_id":"c7cc79116df19e2618be5f0751099e0642bf5c12"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"176d3863_ca7156d3","updated":"2021-08-03 10:09:42.000000000","message":"Alright, another slightly large round.\n\nSummary:\n 1. Comment style/grammar/enhancements and general small nits.\n 2. There\u0027s a lot of code that can be made simpler if you use bytes.Buffer. It lets you get rid of a lot of offset calculation when you\u0027re just writing/reading things sequentially. Take a look at it! I\u0027ve left some examples.\n 3. A discussion about veritySuperblock, split serialization/logic types. I really don\u0027t think we should spend too much time on this to refactor this, but I\u0027ve left some comments on how these things are usually done.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"6db4e1f2_83f87205","updated":"2021-08-05 16:06:43.000000000","message":"I\u0027ll be pushing the next revision in a moment.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f9b2e660cff85eea80ab294f374c86f357165748","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"53d0abdf_9d4c096b","updated":"2021-08-05 16:08:11.000000000","message":"+ reformat","commit_id":"a2a51a5c4ca2e05be9b280a5c663fe03c97b4d53"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aed7be90687eafa36c4b7d1be1b9bb709fc4f45f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"138ebaaf_fcfea3fd","updated":"2021-08-06 15:05:54.000000000","message":"LGTM after addressing last nits.\n\nAlso needs some tests, but I\u0027m fine with them being in a followup CR.","commit_id":"89bb6015e13b9c28ee308621e7894228343ff120"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"d9fe8ce162b39a63cce2f7ecda95ace4cf3bf93a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"ca3e2ae0_56b8e6d0","updated":"2021-08-10 11:02:23.000000000","message":"Don\u0027t thnk there\u0027s much for me to review here, I\u0027ll let Serge finish this with you. Send me the review for the ktests once they are there.","commit_id":"9bc44cdf2fc8b80386044ff8c4369ac5b190a52f"}],"metropolis/node/build/mkverity/main.go":[{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":17,"context_line":"// This piece of code implements a subset of veritysetup functionality (see:"},{"line_number":18,"context_line":"// dm-verity). It was written in an attempt to minimize projected higher"},{"line_number":19,"context_line":"// maintenance cost of packaging cryptsetup for metropolis in the long term."},{"line_number":20,"context_line":"package main"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import ("},{"line_number":23,"context_line":"\t\"bytes\""}],"source_content_type":"text/x-go","patch_set":6,"id":"1894d9dc_0124c1ca","line":20,"updated":"2021-08-03 10:09:42.000000000","message":"Add a short overview of how dm-verity works from the point of view of the reader of this code. Something like this:\n\n```\n// This package implements a subset of the veritysetup tool from cryptsetup, \n// which is a userland tool to interact with dm-verity devices/images. It was \n// rewritten to provide the minimum of functionality needed for Metropolis \n// without having to package, link against and maintain the original C \n// veritysetup tool.\n//\n// dm-verity is a Linux device mapper target that allows integrity verification of\n// a read-only block device. The block device whose integrity should be checked\n// (the \u0027data device\u0027) must be first processed by a tool like veritysetup (or this\n// tool, mkverity) to generate a hash device and root hash.\n// The original data device, hash device and root hash are then set up as a device \n// mapper target, and any read performed from the data device through the verity \n// target will be verified for integrity by Linux using the hash device and root \n// hash.\n//\n// Internally, the hash device is a Merkle tree of all the bytes in the data \n// device, layed out as layers of \u0027hash blocks\u0027. Starting with data bytes, layers \n// are built recursively, with each layer\u0027s output hash blocks becoming the next \n// layer\u0027s data input, ending with the single root hash.\n\n// For more information about the internals, see the Linux and cryptsetup \n// upstream code:\n//\n// https://gitlab.com/cryptsetup/cryptsetup/wikis/DMVerity#verity-superblock-format\n// https://example.com/...\n```\n\nNot a lot, but enough to give context to someone reading this. :) Sorry for writing this out fully, you don\u0027t have to use that, I\u0027m just trying to show what sort of comment would have been useful for me as a reviewer (and probably me as a reader in half a year once I forget all of this).","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":17,"context_line":"// This piece of code implements a subset of veritysetup functionality (see:"},{"line_number":18,"context_line":"// dm-verity). It was written in an attempt to minimize projected higher"},{"line_number":19,"context_line":"// maintenance cost of packaging cryptsetup for metropolis in the long term."},{"line_number":20,"context_line":"package main"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import ("},{"line_number":23,"context_line":"\t\"bytes\""}],"source_content_type":"text/x-go","patch_set":6,"id":"e73022ca_b62e31f8","line":20,"in_reply_to":"1894d9dc_0124c1ca","updated":"2021-08-05 16:06:43.000000000","message":"I\u0027m happy to use it. I didn\u0027t want to overdo this - I see this utility as something totally subordinate to dm-verity project, which has its own functional documentation that I believe should be used as a reference.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":31,"context_line":")"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"// veritySuperblock represents data layout inside of a dm-verity hash block"},{"line_number":34,"context_line":"// device superblock. It\u0027s inspired by preexisting verity implementation,"},{"line_number":35,"context_line":"// linked below."},{"line_number":36,"context_line":"//"},{"line_number":37,"context_line":"// https://gitlab.com/cryptsetup/cryptsetup/wikis/DMVerity#verity-superblock-format"}],"source_content_type":"text/x-go","patch_set":6,"id":"62845e5f_1bf9ba8a","line":34,"range":{"start_line":34,"start_character":39,"end_line":34,"end_character":50},"updated":"2021-08-03 10:09:42.000000000","message":"Grammar: `the pre-existing`","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":31,"context_line":")"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"// veritySuperblock represents data layout inside of a dm-verity hash block"},{"line_number":34,"context_line":"// device superblock. It\u0027s inspired by preexisting verity implementation,"},{"line_number":35,"context_line":"// linked below."},{"line_number":36,"context_line":"//"},{"line_number":37,"context_line":"// https://gitlab.com/cryptsetup/cryptsetup/wikis/DMVerity#verity-superblock-format"}],"source_content_type":"text/x-go","patch_set":6,"id":"68fbb256_398bfe88","line":34,"range":{"start_line":34,"start_character":27,"end_line":34,"end_character":35},"updated":"2021-08-03 10:09:42.000000000","message":"Inspired, or just follows an existing implementation? Maybe clarify what was carried over and what wasn\u0027t.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aed7be90687eafa36c4b7d1be1b9bb709fc4f45f","unresolved":false,"context_lines":[{"line_number":31,"context_line":")"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"// veritySuperblock represents data layout inside of a dm-verity hash block"},{"line_number":34,"context_line":"// device superblock. It\u0027s inspired by preexisting verity implementation,"},{"line_number":35,"context_line":"// linked below."},{"line_number":36,"context_line":"//"},{"line_number":37,"context_line":"// https://gitlab.com/cryptsetup/cryptsetup/wikis/DMVerity#verity-superblock-format"}],"source_content_type":"text/x-go","patch_set":6,"id":"4293ffa9_b0c016a5","line":34,"range":{"start_line":34,"start_character":39,"end_line":34,"end_character":50},"in_reply_to":"42812f88_c694fc43","updated":"2021-08-06 15:05:54.000000000","message":"I meant the missing \u0027the\u0027 article :). Seems fine now.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":true,"context_lines":[{"line_number":31,"context_line":")"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"// veritySuperblock represents data layout inside of a dm-verity hash block"},{"line_number":34,"context_line":"// device superblock. It\u0027s inspired by preexisting verity implementation,"},{"line_number":35,"context_line":"// linked below."},{"line_number":36,"context_line":"//"},{"line_number":37,"context_line":"// https://gitlab.com/cryptsetup/cryptsetup/wikis/DMVerity#verity-superblock-format"}],"source_content_type":"text/x-go","patch_set":6,"id":"42812f88_c694fc43","line":34,"range":{"start_line":34,"start_character":39,"end_line":34,"end_character":50},"in_reply_to":"62845e5f_1bf9ba8a","updated":"2021-08-05 16:06:43.000000000","message":"https://www.merriam-webster.com/dictionary/preexisting","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":31,"context_line":")"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"// veritySuperblock represents data layout inside of a dm-verity hash block"},{"line_number":34,"context_line":"// device superblock. It\u0027s inspired by preexisting verity implementation,"},{"line_number":35,"context_line":"// linked below."},{"line_number":36,"context_line":"//"},{"line_number":37,"context_line":"// https://gitlab.com/cryptsetup/cryptsetup/wikis/DMVerity#verity-superblock-format"}],"source_content_type":"text/x-go","patch_set":6,"id":"a203cc87_62310189","line":34,"range":{"start_line":34,"start_character":27,"end_line":34,"end_character":35},"in_reply_to":"68fbb256_398bfe88","updated":"2021-08-05 16:06:43.000000000","message":"I used that word since C doesn\u0027t fully translate do Go. \"Follows\" might be better, indeed.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":31,"context_line":")"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"// veritySuperblock represents data layout inside of a dm-verity hash block"},{"line_number":34,"context_line":"// device superblock. It\u0027s inspired by preexisting verity implementation,"},{"line_number":35,"context_line":"// linked below."},{"line_number":36,"context_line":"//"},{"line_number":37,"context_line":"// https://gitlab.com/cryptsetup/cryptsetup/wikis/DMVerity#verity-superblock-format"},{"line_number":38,"context_line":"type veritySuperblock struct {"}],"source_content_type":"text/x-go","patch_set":6,"id":"5dabf091_1296a24c","line":35,"range":{"start_line":34,"start_character":72,"end_line":35,"end_character":16},"updated":"2021-08-03 10:09:42.000000000","message":"style nit:\n\n```\n\n// ... pre-existing verity implementation:\n// https://gitlab.com/cryptsetup/cryptsetup/wikis/DMVerity#verity-superblock-format\n\n```\n\nThis renders it in-line within the godoc.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":31,"context_line":")"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"// veritySuperblock represents data layout inside of a dm-verity hash block"},{"line_number":34,"context_line":"// device superblock. It\u0027s inspired by preexisting verity implementation,"},{"line_number":35,"context_line":"// linked below."},{"line_number":36,"context_line":"//"},{"line_number":37,"context_line":"// https://gitlab.com/cryptsetup/cryptsetup/wikis/DMVerity#verity-superblock-format"},{"line_number":38,"context_line":"type veritySuperblock struct {"}],"source_content_type":"text/x-go","patch_set":6,"id":"b26c0066_b9a211a6","line":35,"range":{"start_line":34,"start_character":72,"end_line":35,"end_character":16},"in_reply_to":"5dabf091_1296a24c","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":100,"context_line":"\t\thashBlockSize: 4096,"},{"line_number":101,"context_line":"\t}"},{"line_number":102,"context_line":"\tif sb.hashBlockSize%sha256.Size !\u003d 0 {"},{"line_number":103,"context_line":"\t\treturn nil, fmt.Errorf(\"checksum size not aligned to hash block\")"},{"line_number":104,"context_line":"\t}"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"\t// Get the data image size and compute the data block count."}],"source_content_type":"text/x-go","patch_set":6,"id":"74b58688_6d8eb43a","line":103,"range":{"start_line":103,"start_character":44,"end_line":103,"end_character":65},"updated":"2021-08-03 10:09:42.000000000","message":"`...not a multiple of hash block size`?\n\nHow much checks do we want to do here? If we\u0027re doing full defensive programming, we should probably also at least check that {data,hash}BlockSize !\u003d 0.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":100,"context_line":"\t\thashBlockSize: 4096,"},{"line_number":101,"context_line":"\t}"},{"line_number":102,"context_line":"\tif sb.hashBlockSize%sha256.Size !\u003d 0 {"},{"line_number":103,"context_line":"\t\treturn nil, fmt.Errorf(\"checksum size not aligned to hash block\")"},{"line_number":104,"context_line":"\t}"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"\t// Get the data image size and compute the data block count."}],"source_content_type":"text/x-go","patch_set":6,"id":"3d5e609d_d9205ab9","line":103,"range":{"start_line":103,"start_character":44,"end_line":103,"end_character":65},"in_reply_to":"74b58688_6d8eb43a","updated":"2021-08-05 16:06:43.000000000","message":"I removed it, since we\u0027re going with hardcoded details for now.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":109,"context_line":"\t\treturn nil, fmt.Errorf(\"while stat-ing data device: %w\", err)"},{"line_number":110,"context_line":"\t}"},{"line_number":111,"context_line":"\tif !ds.Mode().IsRegular() {"},{"line_number":112,"context_line":"\t\treturn nil, fmt.Errorf(\"this program only accepts image files\")"},{"line_number":113,"context_line":"\t}"},{"line_number":114,"context_line":"\tsb.dataBlocks \u003d divideAndRoundup(uint64(ds.Size()), uint64(sb.dataBlockSize))"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-go","patch_set":6,"id":"fdc5e45e_09ce1e3d","line":112,"range":{"start_line":112,"start_character":52,"end_line":112,"end_character":57},"updated":"2021-08-03 10:09:42.000000000","message":"`... disk images / regular files`?","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":109,"context_line":"\t\treturn nil, fmt.Errorf(\"while stat-ing data device: %w\", err)"},{"line_number":110,"context_line":"\t}"},{"line_number":111,"context_line":"\tif !ds.Mode().IsRegular() {"},{"line_number":112,"context_line":"\t\treturn nil, fmt.Errorf(\"this program only accepts image files\")"},{"line_number":113,"context_line":"\t}"},{"line_number":114,"context_line":"\tsb.dataBlocks \u003d divideAndRoundup(uint64(ds.Size()), uint64(sb.dataBlockSize))"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-go","patch_set":6,"id":"d9a6cf99_cbf8ae43","line":112,"range":{"start_line":112,"start_character":52,"end_line":112,"end_character":57},"in_reply_to":"fdc5e45e_09ce1e3d","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":125,"context_line":"}"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"// saltedDigest computes a digest of a block prepended with"},{"line_number":128,"context_line":"// superblock-defined salt."},{"line_number":129,"context_line":"// It returns a SHA256 cryptographic hash."},{"line_number":130,"context_line":"func (sb veritySuperblock) saltedDigest(data []byte) (digest [sha256.Size]byte) {"},{"line_number":131,"context_line":"\th :\u003d sha256.New()"}],"source_content_type":"text/x-go","patch_set":6,"id":"0e38acfd_4585513b","line":128,"range":{"start_line":128,"start_character":3,"end_line":128,"end_character":13},"updated":"2021-08-03 10:09:42.000000000","message":"Grammar: `prepended with the superblock defined salt`.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":true,"context_lines":[{"line_number":125,"context_line":"}"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"// saltedDigest computes a digest of a block prepended with"},{"line_number":128,"context_line":"// superblock-defined salt."},{"line_number":129,"context_line":"// It returns a SHA256 cryptographic hash."},{"line_number":130,"context_line":"func (sb veritySuperblock) saltedDigest(data []byte) (digest [sha256.Size]byte) {"},{"line_number":131,"context_line":"\th :\u003d sha256.New()"}],"source_content_type":"text/x-go","patch_set":6,"id":"eca373dc_3d540dc2","line":128,"range":{"start_line":128,"start_character":3,"end_line":128,"end_character":13},"in_reply_to":"0e38acfd_4585513b","updated":"2021-08-05 16:06:43.000000000","message":"https://www.lexico.com/grammar/hyphen#hyphens_in_compound_words\nhttps://www.grammarly.com/blog/open-and-closed-compound-words/\nI\u0027m weird but I\u0027m okay.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"06e67ad0c387117ae871d1d2951b4aa073f7e92f","unresolved":false,"context_lines":[{"line_number":125,"context_line":"}"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"// saltedDigest computes a digest of a block prepended with"},{"line_number":128,"context_line":"// superblock-defined salt."},{"line_number":129,"context_line":"// It returns a SHA256 cryptographic hash."},{"line_number":130,"context_line":"func (sb veritySuperblock) saltedDigest(data []byte) (digest [sha256.Size]byte) {"},{"line_number":131,"context_line":"\th :\u003d sha256.New()"}],"source_content_type":"text/x-go","patch_set":6,"id":"acde2ce0_7ef33ad8","line":128,"range":{"start_line":128,"start_character":3,"end_line":128,"end_character":13},"in_reply_to":"4ace124f_b194eba0","updated":"2021-08-09 14:53:02.000000000","message":"Done","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aed7be90687eafa36c4b7d1be1b9bb709fc4f45f","unresolved":true,"context_lines":[{"line_number":125,"context_line":"}"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"// saltedDigest computes a digest of a block prepended with"},{"line_number":128,"context_line":"// superblock-defined salt."},{"line_number":129,"context_line":"// It returns a SHA256 cryptographic hash."},{"line_number":130,"context_line":"func (sb veritySuperblock) saltedDigest(data []byte) (digest [sha256.Size]byte) {"},{"line_number":131,"context_line":"\th :\u003d sha256.New()"}],"source_content_type":"text/x-go","patch_set":6,"id":"4ace124f_b194eba0","line":128,"range":{"start_line":128,"start_character":3,"end_line":128,"end_character":13},"in_reply_to":"eca373dc_3d540dc2","updated":"2021-08-06 15:05:54.000000000","message":"I mean the missing \u0027the\u0027 article. Should have been clearer, sorry. Ie., currently is:\n\n// saltedDigest computes and returns a SHA256 sum of a block prepended with superblock-defined salt.\n\nShould be:\n\n// saltedDigest computes and returns a SHA256 sum of a block prepended with the superblock-defined salt.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"// saltedDigest computes a digest of a block prepended with"},{"line_number":128,"context_line":"// superblock-defined salt."},{"line_number":129,"context_line":"// It returns a SHA256 cryptographic hash."},{"line_number":130,"context_line":"func (sb veritySuperblock) saltedDigest(data []byte) (digest [sha256.Size]byte) {"},{"line_number":131,"context_line":"\th :\u003d sha256.New()"},{"line_number":132,"context_line":"\th.Write(sb.salt[:int(sb.saltSize)])"}],"source_content_type":"text/x-go","patch_set":6,"id":"900a2711_31de3174","line":129,"updated":"2021-08-03 10:09:42.000000000","message":"nit: We already know it computesa hash/digest, no need to restate that here? Maybe just say `saltedDigest computes and returns a SHA256 sum of a block prepended...`.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"// saltedDigest computes a digest of a block prepended with"},{"line_number":128,"context_line":"// superblock-defined salt."},{"line_number":129,"context_line":"// It returns a SHA256 cryptographic hash."},{"line_number":130,"context_line":"func (sb veritySuperblock) saltedDigest(data []byte) (digest [sha256.Size]byte) {"},{"line_number":131,"context_line":"\th :\u003d sha256.New()"},{"line_number":132,"context_line":"\th.Write(sb.salt[:int(sb.saltSize)])"}],"source_content_type":"text/x-go","patch_set":6,"id":"915273af_43c0afb8","line":129,"in_reply_to":"900a2711_31de3174","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":135,"context_line":"\treturn"},{"line_number":136,"context_line":"}"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"// dataBlocksPerHashBlock returns the count of data block hashes that fit"},{"line_number":139,"context_line":"// inside a hash block."},{"line_number":140,"context_line":"func (sb veritySuperblock) dataBlocksPerHashBlock() uint64 {"},{"line_number":141,"context_line":"\treturn uint64(sb.hashBlockSize) / sha256.Size"}],"source_content_type":"text/x-go","patch_set":6,"id":"69da8d77_49dc50c2","line":138,"range":{"start_line":138,"start_character":3,"end_line":138,"end_character":25},"updated":"2021-08-03 10:09:42.000000000","message":"This confused me a bit at first and I had to write things out. As far as I understand the logic is as follows:\n\n 1. A \u0027data device block\u0027 corresponds to a single SHA256 operation, returning 32 bytes. We call this a \u0027data block hash\u0027 sometimes.\n 2. Multiple \u0027data block hashes\u0027 go into a \u0027hash device block\u0027, in our case 4096/32 \u003d\u003d 128.\n 3. This function returns the count of \u0027data block hashes\u0027 that go into a \u0027hash device block\u0027, in our case 128.\n 4. However, this value can also be interpreted as the amount of \u0027data device blocks\u0027 that are needed to create a \u0027hash device block\u0027.\n\nIf the above is correct, then I think the comment could be a bit clearer. Something like:\n\n```\n// dataBlocksPerHashBlock returns the count of hash operation outputs that fit in a \n// hash device block. This is also the amount of data device blocks it takes to\n// populate a hash device block.\n```\n\nThat would\u0027ve probably been enough to prevent me from getting confused.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":135,"context_line":"\treturn"},{"line_number":136,"context_line":"}"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"// dataBlocksPerHashBlock returns the count of data block hashes that fit"},{"line_number":139,"context_line":"// inside a hash block."},{"line_number":140,"context_line":"func (sb veritySuperblock) dataBlocksPerHashBlock() uint64 {"},{"line_number":141,"context_line":"\treturn uint64(sb.hashBlockSize) / sha256.Size"}],"source_content_type":"text/x-go","patch_set":6,"id":"0e824e89_e0c1503d","line":138,"range":{"start_line":138,"start_character":3,"end_line":138,"end_character":25},"in_reply_to":"69da8d77_49dc50c2","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":141,"context_line":"\treturn uint64(sb.hashBlockSize) / sha256.Size"},{"line_number":142,"context_line":"}"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"// dataPerHashBlock returns the number of bytes needed to produce a"},{"line_number":145,"context_line":"// completely filled hash block."},{"line_number":146,"context_line":"func (sb veritySuperblock) bytesPerHashBlock() uint64 {"},{"line_number":147,"context_line":"\treturn sb.dataBlocksPerHashBlock() * uint64(sb.dataBlockSize)"}],"source_content_type":"text/x-go","patch_set":6,"id":"daa55e5f_359571ed","line":144,"range":{"start_line":144,"start_character":42,"end_line":144,"end_character":47},"updated":"2021-08-03 10:09:42.000000000","message":"... dataBytesPerHashBlock maybe?","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":141,"context_line":"\treturn uint64(sb.hashBlockSize) / sha256.Size"},{"line_number":142,"context_line":"}"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"// dataPerHashBlock returns the number of bytes needed to produce a"},{"line_number":145,"context_line":"// completely filled hash block."},{"line_number":146,"context_line":"func (sb veritySuperblock) bytesPerHashBlock() uint64 {"},{"line_number":147,"context_line":"\treturn sb.dataBlocksPerHashBlock() * uint64(sb.dataBlockSize)"}],"source_content_type":"text/x-go","patch_set":6,"id":"1f6a8e2a_cd622db5","line":144,"range":{"start_line":144,"start_character":42,"end_line":144,"end_character":47},"in_reply_to":"daa55e5f_359571ed","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":152,"context_line":"// returned by dataBlocksPerHashBlock."},{"line_number":153,"context_line":"// It returns a hash block of length defined by sb.hashBlockSize, and an"},{"line_number":154,"context_line":"// error, if encountered."},{"line_number":155,"context_line":"func (sb veritySuperblock) computeHashBlock(dataBlocks []byte) ([]byte, error) {"},{"line_number":156,"context_line":"\tif uint64(len(dataBlocks)) \u003e sb.bytesPerHashBlock() {"},{"line_number":157,"context_line":"\t\treturn nil, fmt.Errorf(\"input exceeds hash block size\")"},{"line_number":158,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":6,"id":"815bad92_d076b248","line":155,"range":{"start_line":155,"start_character":55,"end_line":155,"end_character":61},"updated":"2021-08-03 10:09:42.000000000","message":"This could be made simpler by passing an io.Reader and size here, or immediately turning dataBlocks into a bytes.Buffer.\n\nThen, in the loop instead of carving things out with dbo and other index math, you can do:\n\n```\nfor ... {\n    data, _ :\u003d buf.Read(sb.dataBlockSize)\n    out :\u003d bytes.NewBuffer(make([]byte, 0, sh.hashBlockSize)\n    if len(data) \u003d\u003d 0 {\n        // Not enough data to fully populate this hash block, bail early.\n        break\n    }\n    // Pad each incomplete data block to block size. This will happen if buf.Read \n    // returns an EOF but still some leftover bytes.\n    if len(data) \u003c\u003d db.DataBlockSize {\n        npad :\u003d db.DataBlockSize - len(data)\n        data \u003d append(data, bytes.Repeat([]byte{0}, npad)...)\n    }\n    out.Write(sb.saltedDigest(data))\n    // ...\n}\n\n// Pad the hash block with zeroes if not enough data bytes were available.\nif out.Size() \u003c sb.hashBlockSize {\n    npad :\u003d sb.hashBlockSize - out.Size()\n    out.Write(bytes.Repeat([]byte{0}, npad))\n}\nreturn out.Bytes(), nil\n```\n\nThis also allows you to get rid of the pdb buffer (the copy still happens, but inside the input bytes.Buffer when doing data, _ \u003d buf.Read), the hcnt math, the dbo math and the ho math.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":152,"context_line":"// returned by dataBlocksPerHashBlock."},{"line_number":153,"context_line":"// It returns a hash block of length defined by sb.hashBlockSize, and an"},{"line_number":154,"context_line":"// error, if encountered."},{"line_number":155,"context_line":"func (sb veritySuperblock) computeHashBlock(dataBlocks []byte) ([]byte, error) {"},{"line_number":156,"context_line":"\tif uint64(len(dataBlocks)) \u003e sb.bytesPerHashBlock() {"},{"line_number":157,"context_line":"\t\treturn nil, fmt.Errorf(\"input exceeds hash block size\")"},{"line_number":158,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":6,"id":"f14c3e45_1d3523d7","line":155,"range":{"start_line":155,"start_character":55,"end_line":155,"end_character":61},"in_reply_to":"815bad92_d076b248","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":220,"context_line":"\t\t\te \u003d len(data)"},{"line_number":221,"context_line":"\t\t}"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"\t\tn, err :\u003d writeBlock(hashImage, blockSize, data[s:e])"},{"line_number":224,"context_line":"\t\tif err !\u003d nil {"},{"line_number":225,"context_line":"\t\t\treturn wcnt, err"},{"line_number":226,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":6,"id":"2cd2bd68_c42cb4d7","line":223,"range":{"start_line":223,"start_character":12,"end_line":223,"end_character":22},"updated":"2021-08-03 10:09:42.000000000","message":"We only call writeBlock from here, so I think we should just join the two functions into one? Seems like writeBlock is written to be more generic than it needs to be, and the two functions could be joined into something as simple as:\n\n```\nfunc writePadded(w io.Writer, blockSize int, data[]byte) error {\n    for s :\u003d 0; s \u003c len(data); s +\u003d blockSize {\n        e :\u003d s + blockSize\n        if e \u003e len(data) {\n            e \u003d len(data)\n        }\n        _, err :\u003d w.Write(data[s:e])\n        // if err ...\n        // Zero-pad last block if needed.\n        if len(data[s:e]) \u003c blockSize {\n            npad :\u003d blockSize - len(data[s:e])\n            _, err :\u003d w.Write(bytes.Repeat([]byte{0}, npad))\n            // if err ...\n        }\n    }\n}\n```","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":220,"context_line":"\t\t\te \u003d len(data)"},{"line_number":221,"context_line":"\t\t}"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"\t\tn, err :\u003d writeBlock(hashImage, blockSize, data[s:e])"},{"line_number":224,"context_line":"\t\tif err !\u003d nil {"},{"line_number":225,"context_line":"\t\t\treturn wcnt, err"},{"line_number":226,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":6,"id":"d51e1d84_f749fcce","line":223,"range":{"start_line":223,"start_character":12,"end_line":223,"end_character":22},"in_reply_to":"2cd2bd68_c42cb4d7","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":247,"context_line":""},{"line_number":248,"context_line":"\t// Write the padding bytes at the end of the block."},{"line_number":249,"context_line":"\tif _, err :\u003d hashImage.Write(bytes.Repeat([]byte{0}, pbc)); err !\u003d nil {"},{"line_number":250,"context_line":"\t\treturn fmt.Errorf(\"while writing dm-verity superblock: %w\", err)"},{"line_number":251,"context_line":"\t}"},{"line_number":252,"context_line":"\treturn nil"},{"line_number":253,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":6,"id":"e203ce14_73e19322","line":250,"range":{"start_line":250,"start_character":20,"end_line":250,"end_character":60},"updated":"2021-08-03 10:09:42.000000000","message":"nit: The function is writeSuperblock, so the caller already knows this happened while writing a superblock. Instead, if wrapping, just mention that this happened when writing the padding (`fmt.Errorf(\"while writing padding: %w\", err)`).","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":247,"context_line":""},{"line_number":248,"context_line":"\t// Write the padding bytes at the end of the block."},{"line_number":249,"context_line":"\tif _, err :\u003d hashImage.Write(bytes.Repeat([]byte{0}, pbc)); err !\u003d nil {"},{"line_number":250,"context_line":"\t\treturn fmt.Errorf(\"while writing dm-verity superblock: %w\", err)"},{"line_number":251,"context_line":"\t}"},{"line_number":252,"context_line":"\treturn nil"},{"line_number":253,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":6,"id":"c0f534bb_c6a95db6","line":250,"range":{"start_line":250,"start_character":20,"end_line":250,"end_character":60},"in_reply_to":"e203ce14_73e19322","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":266,"context_line":"\t// perfectly."},{"line_number":267,"context_line":"\thbcnt :\u003d divideAndRoundup(uint64(sb.dataBlocks), uint64(sb.dataBlocksPerHashBlock()))"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"\t// Allocate a buffer to store all the computed hash blocks."},{"line_number":270,"context_line":"\thbuf :\u003d make([]byte, hbcnt*uint64(sb.hashBlockSize))"},{"line_number":271,"context_line":"\t// Allocate an input buffer for data image blocks to be hashed."},{"line_number":272,"context_line":"\tdbuf :\u003d make([]byte, sb.dataBlocksPerHashBlock()*uint64(sb.dataBlockSize))"}],"source_content_type":"text/x-go","patch_set":6,"id":"3ea2d063_c5a6f152","line":269,"updated":"2021-08-03 10:09:42.000000000","message":"This is equal, in our case, to 1/128th [1] of the input image size. I _think_ we\u0027re okay with keeping all of this in memory for now (considering our images are likely not going to be more than 10GB worst case), but we might want to add a note somewhere at the top of the file that this is a known issue.\n\n[1] - Which I shall from now on call the \u0027layer scronch factor\u0027.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":true,"context_lines":[{"line_number":266,"context_line":"\t// perfectly."},{"line_number":267,"context_line":"\thbcnt :\u003d divideAndRoundup(uint64(sb.dataBlocks), uint64(sb.dataBlocksPerHashBlock()))"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"\t// Allocate a buffer to store all the computed hash blocks."},{"line_number":270,"context_line":"\thbuf :\u003d make([]byte, hbcnt*uint64(sb.hashBlockSize))"},{"line_number":271,"context_line":"\t// Allocate an input buffer for data image blocks to be hashed."},{"line_number":272,"context_line":"\tdbuf :\u003d make([]byte, sb.dataBlocksPerHashBlock()*uint64(sb.dataBlockSize))"}],"source_content_type":"text/x-go","patch_set":6,"id":"4b1d594d_09bf5844","line":269,"in_reply_to":"3ea2d063_c5a6f152","updated":"2021-08-05 16:06:43.000000000","message":"IMHO putting it as a BUG() in a comment at the top of the function will help us stay aware of that.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aed7be90687eafa36c4b7d1be1b9bb709fc4f45f","unresolved":false,"context_lines":[{"line_number":266,"context_line":"\t// perfectly."},{"line_number":267,"context_line":"\thbcnt :\u003d divideAndRoundup(uint64(sb.dataBlocks), uint64(sb.dataBlocksPerHashBlock()))"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"\t// Allocate a buffer to store all the computed hash blocks."},{"line_number":270,"context_line":"\thbuf :\u003d make([]byte, hbcnt*uint64(sb.hashBlockSize))"},{"line_number":271,"context_line":"\t// Allocate an input buffer for data image blocks to be hashed."},{"line_number":272,"context_line":"\tdbuf :\u003d make([]byte, sb.dataBlocksPerHashBlock()*uint64(sb.dataBlockSize))"}],"source_content_type":"text/x-go","patch_set":6,"id":"b3d08e2f_a03f0616","line":269,"in_reply_to":"4b1d594d_09bf5844","updated":"2021-08-06 15:05:54.000000000","message":"Yep, perfect.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":267,"context_line":"\thbcnt :\u003d divideAndRoundup(uint64(sb.dataBlocks), uint64(sb.dataBlocksPerHashBlock()))"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"\t// Allocate a buffer to store all the computed hash blocks."},{"line_number":270,"context_line":"\thbuf :\u003d make([]byte, hbcnt*uint64(sb.hashBlockSize))"},{"line_number":271,"context_line":"\t// Allocate an input buffer for data image blocks to be hashed."},{"line_number":272,"context_line":"\tdbuf :\u003d make([]byte, sb.dataBlocksPerHashBlock()*uint64(sb.dataBlockSize))"},{"line_number":273,"context_line":""}],"source_content_type":"text/x-go","patch_set":6,"id":"fd693db6_fda7b4ca","line":270,"range":{"start_line":270,"start_character":1,"end_line":270,"end_character":5},"updated":"2021-08-03 10:09:42.000000000","message":"You can use a bytes.Buffer here to simplify the index-and-copy logic within the loop:\n\n```\noutSize :\u003d hbcnt * uint64(sb.hashBlockSize)\nout :\u003d bytes.NewBuffer(make([]byte, 0, outSize))\n// ...\nfor hb :\u003d ... {\n    // ...\n    hash, err :\u003d sb.computeHashBlock(dbuf)\n    // ...\n    out.Write(hash)\n}\nif out.Size() \u003c outSize {\n    npad :\u003d outSize - out.Size()\n    out.Write(bytes.Repeat([]byte{0}, npad))\n}\nreturn out.Bytes(), nil\n```","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":267,"context_line":"\thbcnt :\u003d divideAndRoundup(uint64(sb.dataBlocks), uint64(sb.dataBlocksPerHashBlock()))"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"\t// Allocate a buffer to store all the computed hash blocks."},{"line_number":270,"context_line":"\thbuf :\u003d make([]byte, hbcnt*uint64(sb.hashBlockSize))"},{"line_number":271,"context_line":"\t// Allocate an input buffer for data image blocks to be hashed."},{"line_number":272,"context_line":"\tdbuf :\u003d make([]byte, sb.dataBlocksPerHashBlock()*uint64(sb.dataBlockSize))"},{"line_number":273,"context_line":""}],"source_content_type":"text/x-go","patch_set":6,"id":"f70dcdab_8f256e26","line":270,"range":{"start_line":270,"start_character":1,"end_line":270,"end_character":5},"in_reply_to":"fd693db6_fda7b4ca","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":269,"context_line":"\t// Allocate a buffer to store all the computed hash blocks."},{"line_number":270,"context_line":"\thbuf :\u003d make([]byte, hbcnt*uint64(sb.hashBlockSize))"},{"line_number":271,"context_line":"\t// Allocate an input buffer for data image blocks to be hashed."},{"line_number":272,"context_line":"\tdbuf :\u003d make([]byte, sb.dataBlocksPerHashBlock()*uint64(sb.dataBlockSize))"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"\t// Fill in hbuf by generating every hash block."},{"line_number":275,"context_line":"\tfor hb :\u003d uint64(0); hb \u003c hbcnt; hb++ {"}],"source_content_type":"text/x-go","patch_set":6,"id":"f042bdfa_1b9a9b3a","line":272,"updated":"2021-08-03 10:09:42.000000000","message":"`make([]byte, sb.dataBytesPerHashBlock())`","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":269,"context_line":"\t// Allocate a buffer to store all the computed hash blocks."},{"line_number":270,"context_line":"\thbuf :\u003d make([]byte, hbcnt*uint64(sb.hashBlockSize))"},{"line_number":271,"context_line":"\t// Allocate an input buffer for data image blocks to be hashed."},{"line_number":272,"context_line":"\tdbuf :\u003d make([]byte, sb.dataBlocksPerHashBlock()*uint64(sb.dataBlockSize))"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"\t// Fill in hbuf by generating every hash block."},{"line_number":275,"context_line":"\tfor hb :\u003d uint64(0); hb \u003c hbcnt; hb++ {"}],"source_content_type":"text/x-go","patch_set":6,"id":"5a26d635_53efb896","line":272,"in_reply_to":"f042bdfa_1b9a9b3a","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":292,"context_line":"\t\t\te :\u003d s + uint64(sb.hashBlockSize)"},{"line_number":293,"context_line":"\t\t\tcopy(hbuf[s:e], hash)"},{"line_number":294,"context_line":"\t\t}"},{"line_number":295,"context_line":"\t\t// Partial reads, an EOF, as well as other errors, will end processing."},{"line_number":296,"context_line":"\t\tif err !\u003d nil {"},{"line_number":297,"context_line":"\t\t\tbreak"},{"line_number":298,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":6,"id":"30f3624a_99d612d9","line":295,"updated":"2021-08-03 10:09:42.000000000","message":"nit: https://github.com/golang/go/wiki/CodeReviewComments#indent-error-flow\n\nie.:\n\n```\nif err !\u003d nil \u0026\u0026 err !\u003d io.ErrUnexpectedEOF {\n    return nil, err\n}\n\nhash, err :\u003d sb.computeHashBlock(dbuf)\n// ...\n```","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":292,"context_line":"\t\t\te :\u003d s + uint64(sb.hashBlockSize)"},{"line_number":293,"context_line":"\t\t\tcopy(hbuf[s:e], hash)"},{"line_number":294,"context_line":"\t\t}"},{"line_number":295,"context_line":"\t\t// Partial reads, an EOF, as well as other errors, will end processing."},{"line_number":296,"context_line":"\t\tif err !\u003d nil {"},{"line_number":297,"context_line":"\t\t\tbreak"},{"line_number":298,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":6,"id":"635d704e_8828eb2f","line":295,"in_reply_to":"30f3624a_99d612d9","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":293,"context_line":"\t\t\tcopy(hbuf[s:e], hash)"},{"line_number":294,"context_line":"\t\t}"},{"line_number":295,"context_line":"\t\t// Partial reads, an EOF, as well as other errors, will end processing."},{"line_number":296,"context_line":"\t\tif err !\u003d nil {"},{"line_number":297,"context_line":"\t\t\tbreak"},{"line_number":298,"context_line":"\t\t}"},{"line_number":299,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":6,"id":"79671008_8cd38b5b","line":296,"range":{"start_line":296,"start_character":5,"end_line":296,"end_character":8},"updated":"2021-08-03 10:09:42.000000000","message":"You\u0027re silently dropping this error here because the assignment to err at 278 is scoped locally inside the loop body, so you end up returning hbuf, nil at the return of the function. The restructuring above with an explicit return-on-err will fix this.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":293,"context_line":"\t\t\tcopy(hbuf[s:e], hash)"},{"line_number":294,"context_line":"\t\t}"},{"line_number":295,"context_line":"\t\t// Partial reads, an EOF, as well as other errors, will end processing."},{"line_number":296,"context_line":"\t\tif err !\u003d nil {"},{"line_number":297,"context_line":"\t\t\tbreak"},{"line_number":298,"context_line":"\t\t}"},{"line_number":299,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":6,"id":"bc7502ea_45305582","line":296,"range":{"start_line":296,"start_character":5,"end_line":296,"end_character":8},"in_reply_to":"79671008_8cd38b5b","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":308,"context_line":"//"},{"line_number":309,"context_line":"// In case of inputBlocks length not being a multiple of sb.dataBlockSize,"},{"line_number":310,"context_line":"// it will be zero-padded to a superblock-defined data block boundary."},{"line_number":311,"context_line":"func (sb veritySuperblock) computeLevel(inputBlocks []byte) ([]byte, error) {"},{"line_number":312,"context_line":"\t// Calculate the count of data blocks comprising this level. This value"},{"line_number":313,"context_line":"\t// is later used to come up with a count of hash blocks to be generated."},{"line_number":314,"context_line":"\tdbcnt :\u003d divideAndRoundup(uint64(len(inputBlocks)), uint64(sb.dataBlockSize))"}],"source_content_type":"text/x-go","patch_set":6,"id":"8c782094_f4e4b9e6","line":311,"range":{"start_line":311,"start_character":0,"end_line":311,"end_character":77},"updated":"2021-08-03 10:09:42.000000000","message":"You could consolidate computeLevel and computeLevelZero into a single function like this:\n\n```\nfunc (sb veritySuperblock) computeLevel(r io.Reader, size uint64) ([]byte, error) {\n    dbcnt :\u003d divideAndRoundup(size, uint64(sb.dataBlockSize))\n    hbcnt :\u003d divideAndRoundup(dbcnt, uint64(sb.dataBlocksPerHashBlock())\n    hbuf :\u003d make([]byte, hbcnt*uint64(sb.hashBlockSize))\n    dbuf :\u003d make([]byte, sb.bytesPerHashBlock())\n    for hb :\u003d uint64(0); hb \u003c hbcnt; hb++ {\n        br, err :\u003d io.ReadFull(dataImage, dbuf)\n        // ...\n    }\n    // ....\n}\n```\n\nand then call it like computeLevelZero for the bottom level (only passing in the data byte count), and for every subsequent level use a bytes.Buffer to turn the result of the previous level into a io.Reader.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":308,"context_line":"//"},{"line_number":309,"context_line":"// In case of inputBlocks length not being a multiple of sb.dataBlockSize,"},{"line_number":310,"context_line":"// it will be zero-padded to a superblock-defined data block boundary."},{"line_number":311,"context_line":"func (sb veritySuperblock) computeLevel(inputBlocks []byte) ([]byte, error) {"},{"line_number":312,"context_line":"\t// Calculate the count of data blocks comprising this level. This value"},{"line_number":313,"context_line":"\t// is later used to come up with a count of hash blocks to be generated."},{"line_number":314,"context_line":"\tdbcnt :\u003d divideAndRoundup(uint64(len(inputBlocks)), uint64(sb.dataBlockSize))"}],"source_content_type":"text/x-go","patch_set":6,"id":"4a18b0ce_3054cb21","line":311,"range":{"start_line":311,"start_character":0,"end_line":311,"end_character":77},"in_reply_to":"8c782094_f4e4b9e6","updated":"2021-08-05 16:06:43.000000000","message":"I did a similar thing. Thanks for pointing it out.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":342,"context_line":"\treturn hbuf, nil"},{"line_number":343,"context_line":"}"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"// computeHashTree builds a complete hash tree based on block device data."},{"line_number":346,"context_line":"// Levels are appended to resulting hashTree from bottom to top."},{"line_number":347,"context_line":"// It returns a verity hash tree, a verity root hash, and an error, if"},{"line_number":348,"context_line":"// encountered."}],"source_content_type":"text/x-go","patch_set":6,"id":"30778289_649ea44c","line":345,"range":{"start_line":345,"start_character":56,"end_line":345,"end_character":73},"updated":"2021-08-03 10:09:42.000000000","message":"`... on the given reader object`?","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":342,"context_line":"\treturn hbuf, nil"},{"line_number":343,"context_line":"}"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"// computeHashTree builds a complete hash tree based on block device data."},{"line_number":346,"context_line":"// Levels are appended to resulting hashTree from bottom to top."},{"line_number":347,"context_line":"// It returns a verity hash tree, a verity root hash, and an error, if"},{"line_number":348,"context_line":"// encountered."}],"source_content_type":"text/x-go","patch_set":6,"id":"8a27547c_1faaabb3","line":345,"range":{"start_line":345,"start_character":56,"end_line":345,"end_character":73},"in_reply_to":"30778289_649ea44c","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":346,"context_line":"// Levels are appended to resulting hashTree from bottom to top."},{"line_number":347,"context_line":"// It returns a verity hash tree, a verity root hash, and an error, if"},{"line_number":348,"context_line":"// encountered."},{"line_number":349,"context_line":"func (sb veritySuperblock) computeHashTree(dataImage io.Reader) (hashTree [][]byte,"},{"line_number":350,"context_line":"\trootHash []byte, err error) {"},{"line_number":351,"context_line":"\t// First, hash contents of the data image. This will result in a bottom"},{"line_number":352,"context_line":"\t// level of the hash tree."}],"source_content_type":"text/x-go","patch_set":6,"id":"2dfe1ca3_08e60c69","line":349,"range":{"start_line":349,"start_character":43,"end_line":349,"end_character":52},"updated":"2021-08-03 10:09:42.000000000","message":"nit: `r` for reader.\n\nhttps://github.com/golang/go/wiki/CodeReviewComments#variable-names","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":346,"context_line":"// Levels are appended to resulting hashTree from bottom to top."},{"line_number":347,"context_line":"// It returns a verity hash tree, a verity root hash, and an error, if"},{"line_number":348,"context_line":"// encountered."},{"line_number":349,"context_line":"func (sb veritySuperblock) computeHashTree(dataImage io.Reader) (hashTree [][]byte,"},{"line_number":350,"context_line":"\trootHash []byte, err error) {"},{"line_number":351,"context_line":"\t// First, hash contents of the data image. This will result in a bottom"},{"line_number":352,"context_line":"\t// level of the hash tree."}],"source_content_type":"text/x-go","patch_set":6,"id":"2d40760e_621ac7f1","line":349,"range":{"start_line":349,"start_character":43,"end_line":349,"end_character":52},"in_reply_to":"2dfe1ca3_08e60c69","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":347,"context_line":"// It returns a verity hash tree, a verity root hash, and an error, if"},{"line_number":348,"context_line":"// encountered."},{"line_number":349,"context_line":"func (sb veritySuperblock) computeHashTree(dataImage io.Reader) (hashTree [][]byte,"},{"line_number":350,"context_line":"\trootHash []byte, err error) {"},{"line_number":351,"context_line":"\t// First, hash contents of the data image. This will result in a bottom"},{"line_number":352,"context_line":"\t// level of the hash tree."},{"line_number":353,"context_line":"\tlz, err :\u003d sb.computeLevelZero(dataImage)"}],"source_content_type":"text/x-go","patch_set":6,"id":"7d9d7c84_3a55b16c","line":350,"range":{"start_line":350,"start_character":1,"end_line":350,"end_character":30},"updated":"2021-08-03 10:09:42.000000000","message":"nit: We generally don\u0027t wrap code unless it makes things more readable. So don\u0027t be super set on hard wrapping, but if you find this more readable keep it this way.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":347,"context_line":"// It returns a verity hash tree, a verity root hash, and an error, if"},{"line_number":348,"context_line":"// encountered."},{"line_number":349,"context_line":"func (sb veritySuperblock) computeHashTree(dataImage io.Reader) (hashTree [][]byte,"},{"line_number":350,"context_line":"\trootHash []byte, err error) {"},{"line_number":351,"context_line":"\t// First, hash contents of the data image. This will result in a bottom"},{"line_number":352,"context_line":"\t// level of the hash tree."},{"line_number":353,"context_line":"\tlz, err :\u003d sb.computeLevelZero(dataImage)"}],"source_content_type":"text/x-go","patch_set":6,"id":"b574275a_32342392","line":350,"range":{"start_line":350,"start_character":1,"end_line":350,"end_character":30},"in_reply_to":"7d9d7c84_3a55b16c","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":383,"context_line":""},{"line_number":384,"context_line":"// writeHashTree writes a verity-formatted hash tree to hashImage. Compare"},{"line_number":385,"context_line":"// with computeHashTree."},{"line_number":386,"context_line":"// It returns the count of bytes written and a write error, if encountered."},{"line_number":387,"context_line":"func (sb veritySuperblock) writeHashTree(hashImage io.Writer, treeLevels [][]byte) (int, error) {"},{"line_number":388,"context_line":"\twcnt :\u003d 0"},{"line_number":389,"context_line":"\tfor l :\u003d len(treeLevels) - 1; l \u003e\u003d 0; l-- {"}],"source_content_type":"text/x-go","patch_set":6,"id":"9901959d_1e898401","line":386,"range":{"start_line":386,"start_character":18,"end_line":386,"end_character":40},"updated":"2021-08-03 10:09:42.000000000","message":"Why return this? It doesn\u0027t seem to be used anywhere?","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":383,"context_line":""},{"line_number":384,"context_line":"// writeHashTree writes a verity-formatted hash tree to hashImage. Compare"},{"line_number":385,"context_line":"// with computeHashTree."},{"line_number":386,"context_line":"// It returns the count of bytes written and a write error, if encountered."},{"line_number":387,"context_line":"func (sb veritySuperblock) writeHashTree(hashImage io.Writer, treeLevels [][]byte) (int, error) {"},{"line_number":388,"context_line":"\twcnt :\u003d 0"},{"line_number":389,"context_line":"\tfor l :\u003d len(treeLevels) - 1; l \u003e\u003d 0; l-- {"}],"source_content_type":"text/x-go","patch_set":6,"id":"f1b9d3fc_7ac8f5ee","line":386,"range":{"start_line":386,"start_character":18,"end_line":386,"end_character":40},"in_reply_to":"9901959d_1e898401","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":386,"context_line":"// It returns the count of bytes written and a write error, if encountered."},{"line_number":387,"context_line":"func (sb veritySuperblock) writeHashTree(hashImage io.Writer, treeLevels [][]byte) (int, error) {"},{"line_number":388,"context_line":"\twcnt :\u003d 0"},{"line_number":389,"context_line":"\tfor l :\u003d len(treeLevels) - 1; l \u003e\u003d 0; l-- {"},{"line_number":390,"context_line":"\t\tn, err :\u003d writeBlocks(hashImage, int(sb.hashBlockSize),"},{"line_number":391,"context_line":"\t\t\ttreeLevels[l])"},{"line_number":392,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":6,"id":"839338b4_27fc5685","line":389,"updated":"2021-08-03 10:09:42.000000000","message":"`// Write each tree level, from highest to lowest.`","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":386,"context_line":"// It returns the count of bytes written and a write error, if encountered."},{"line_number":387,"context_line":"func (sb veritySuperblock) writeHashTree(hashImage io.Writer, treeLevels [][]byte) (int, error) {"},{"line_number":388,"context_line":"\twcnt :\u003d 0"},{"line_number":389,"context_line":"\tfor l :\u003d len(treeLevels) - 1; l \u003e\u003d 0; l-- {"},{"line_number":390,"context_line":"\t\tn, err :\u003d writeBlocks(hashImage, int(sb.hashBlockSize),"},{"line_number":391,"context_line":"\t\t\ttreeLevels[l])"},{"line_number":392,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":6,"id":"10364576_130d62f3","line":389,"in_reply_to":"839338b4_27fc5685","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":398,"context_line":"}"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"// format writes a complete dm-verity hash device image at hashImagePath."},{"line_number":401,"context_line":"// File at dataImagePath serves as an image that data blocks are read from."},{"line_number":402,"context_line":"// It returns a verity root hash and an error, if encountered."},{"line_number":403,"context_line":"func format(dataImagePath, hashImagePath string) ([]byte, error) {"},{"line_number":404,"context_line":"\t// Inspect the data image and build a verity superblock based on its size."}],"source_content_type":"text/x-go","patch_set":6,"id":"2ec28fe7_31e7c89f","line":401,"range":{"start_line":401,"start_character":3,"end_line":401,"end_character":7},"updated":"2021-08-03 10:09:42.000000000","message":"Grammar: `The file at...`.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":398,"context_line":"}"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"// format writes a complete dm-verity hash device image at hashImagePath."},{"line_number":401,"context_line":"// File at dataImagePath serves as an image that data blocks are read from."},{"line_number":402,"context_line":"// It returns a verity root hash and an error, if encountered."},{"line_number":403,"context_line":"func format(dataImagePath, hashImagePath string) ([]byte, error) {"},{"line_number":404,"context_line":"\t// Inspect the data image and build a verity superblock based on its size."}],"source_content_type":"text/x-go","patch_set":6,"id":"3f04b860_c1a039a1","line":401,"range":{"start_line":401,"start_character":25,"end_line":401,"end_character":74},"updated":"2021-08-03 10:09:42.000000000","message":"I think it\u0027s important to clearly state that this is the image that\u0027s actually being hashed for verity use. format() is a fairly high-level function all things considered.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":398,"context_line":"}"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"// format writes a complete dm-verity hash device image at hashImagePath."},{"line_number":401,"context_line":"// File at dataImagePath serves as an image that data blocks are read from."},{"line_number":402,"context_line":"// It returns a verity root hash and an error, if encountered."},{"line_number":403,"context_line":"func format(dataImagePath, hashImagePath string) ([]byte, error) {"},{"line_number":404,"context_line":"\t// Inspect the data image and build a verity superblock based on its size."}],"source_content_type":"text/x-go","patch_set":6,"id":"863b91e4_3fb16f41","line":401,"range":{"start_line":401,"start_character":3,"end_line":401,"end_character":7},"in_reply_to":"2ec28fe7_31e7c89f","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":398,"context_line":"}"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"// format writes a complete dm-verity hash device image at hashImagePath."},{"line_number":401,"context_line":"// File at dataImagePath serves as an image that data blocks are read from."},{"line_number":402,"context_line":"// It returns a verity root hash and an error, if encountered."},{"line_number":403,"context_line":"func format(dataImagePath, hashImagePath string) ([]byte, error) {"},{"line_number":404,"context_line":"\t// Inspect the data image and build a verity superblock based on its size."}],"source_content_type":"text/x-go","patch_set":6,"id":"9cda5dcd_8c71539f","line":401,"range":{"start_line":401,"start_character":25,"end_line":401,"end_character":74},"in_reply_to":"3f04b860_c1a039a1","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":423,"context_line":""},{"line_number":424,"context_line":"\t// Write the superblock to the hash image."},{"line_number":425,"context_line":"\tif err \u003d sb.writeSuperblock(hashImage); err !\u003d nil {"},{"line_number":426,"context_line":"\t\treturn nil, err"},{"line_number":427,"context_line":"\t}"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"\t// Compute a verity hash tree by hashing contents of the data image. Then,"}],"source_content_type":"text/x-go","patch_set":6,"id":"7c9f8db8_16269349","line":426,"range":{"start_line":426,"start_character":14,"end_line":426,"end_character":17},"updated":"2021-08-03 10:09:42.000000000","message":"Wrap this error for context.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":423,"context_line":""},{"line_number":424,"context_line":"\t// Write the superblock to the hash image."},{"line_number":425,"context_line":"\tif err \u003d sb.writeSuperblock(hashImage); err !\u003d nil {"},{"line_number":426,"context_line":"\t\treturn nil, err"},{"line_number":427,"context_line":"\t}"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"\t// Compute a verity hash tree by hashing contents of the data image. Then,"}],"source_content_type":"text/x-go","patch_set":6,"id":"79dabfe3_ffe431a0","line":426,"range":{"start_line":426,"start_character":14,"end_line":426,"end_character":17},"in_reply_to":"7c9f8db8_16269349","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":430,"context_line":"\t// write it to the hash image."},{"line_number":431,"context_line":"\ttreeLevels, rootHash, err :\u003d sb.computeHashTree(dataImage)"},{"line_number":432,"context_line":"\tif err !\u003d nil {"},{"line_number":433,"context_line":"\t\treturn nil, err"},{"line_number":434,"context_line":"\t}"},{"line_number":435,"context_line":"\tif _, err \u003d sb.writeHashTree(hashImage, treeLevels); err !\u003d nil {"},{"line_number":436,"context_line":"\t\treturn nil, err"}],"source_content_type":"text/x-go","patch_set":6,"id":"6f802f84_cbbe2a2a","line":433,"range":{"start_line":433,"start_character":14,"end_line":433,"end_character":17},"updated":"2021-08-03 10:09:42.000000000","message":"Wrap.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":430,"context_line":"\t// write it to the hash image."},{"line_number":431,"context_line":"\ttreeLevels, rootHash, err :\u003d sb.computeHashTree(dataImage)"},{"line_number":432,"context_line":"\tif err !\u003d nil {"},{"line_number":433,"context_line":"\t\treturn nil, err"},{"line_number":434,"context_line":"\t}"},{"line_number":435,"context_line":"\tif _, err \u003d sb.writeHashTree(hashImage, treeLevels); err !\u003d nil {"},{"line_number":436,"context_line":"\t\treturn nil, err"}],"source_content_type":"text/x-go","patch_set":6,"id":"ee7a1c7f_0bf46c55","line":433,"range":{"start_line":433,"start_character":14,"end_line":433,"end_character":17},"in_reply_to":"6f802f84_cbbe2a2a","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":433,"context_line":"\t\treturn nil, err"},{"line_number":434,"context_line":"\t}"},{"line_number":435,"context_line":"\tif _, err \u003d sb.writeHashTree(hashImage, treeLevels); err !\u003d nil {"},{"line_number":436,"context_line":"\t\treturn nil, err"},{"line_number":437,"context_line":"\t}"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"\t// Return a verity root hash, serving as a root of trust."}],"source_content_type":"text/x-go","patch_set":6,"id":"d01b4fc9_f7069799","line":436,"range":{"start_line":436,"start_character":14,"end_line":436,"end_character":17},"updated":"2021-08-03 10:09:42.000000000","message":"Wrap.","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":433,"context_line":"\t\treturn nil, err"},{"line_number":434,"context_line":"\t}"},{"line_number":435,"context_line":"\tif _, err \u003d sb.writeHashTree(hashImage, treeLevels); err !\u003d nil {"},{"line_number":436,"context_line":"\t\treturn nil, err"},{"line_number":437,"context_line":"\t}"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"\t// Return a verity root hash, serving as a root of trust."}],"source_content_type":"text/x-go","patch_set":6,"id":"3cff62df_ae02c154","line":436,"range":{"start_line":436,"start_character":14,"end_line":436,"end_character":17},"in_reply_to":"d01b4fc9_f7069799","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"4005ae48ce682edbeca465f45c010d2647e1b4f0"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aed7be90687eafa36c4b7d1be1b9bb709fc4f45f","unresolved":false,"context_lines":[{"line_number":189,"context_line":"\t\t\tif hblk.Len() !\u003d 0 {"},{"line_number":190,"context_line":"\t\t\t\t// Return a zero-padded hash block if any hashes were written"},{"line_number":191,"context_line":"\t\t\t\t// to it, and signal that no more blocks can be built."},{"line_number":192,"context_line":"\t\t\t\treturn hblk.Bytes()[:cap(hblk.Bytes())], io.EOF"},{"line_number":193,"context_line":"\t\t\t}"},{"line_number":194,"context_line":"\t\t\t// Return nil if the block doesn\u0027t contain any hashes."},{"line_number":195,"context_line":"\t\t\treturn nil, io.EOF"}],"source_content_type":"text/x-go","patch_set":10,"id":"c4516501_cd71819e","line":192,"range":{"start_line":192,"start_character":11,"end_line":192,"end_character":43},"updated":"2021-08-06 15:05:54.000000000","message":"Oh, didn\u0027t know you could do that.\n\nnit: maybe a temporary variable here? res :\u003d hblk.Bytes(); return res[:cap(res)], io.EOF","commit_id":"89bb6015e13b9c28ee308621e7894228343ff120"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aed7be90687eafa36c4b7d1be1b9bb709fc4f45f","unresolved":true,"context_lines":[{"line_number":274,"context_line":"\t// below."},{"line_number":275,"context_line":"\tfor {"},{"line_number":276,"context_line":"\t\t// Create the next level by hashing the previous one."},{"line_number":277,"context_line":"\t\tvar nl []byte"},{"line_number":278,"context_line":"\t\tpl :\u003d hashTree[len(hashTree)-1]"},{"line_number":279,"context_line":"\t\tnl, err \u003d sb.computeLevel(bytes.NewReader(pl))"},{"line_number":280,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":10,"id":"be98e236_ab58b0b2","line":277,"updated":"2021-08-06 15:05:54.000000000","message":"nit: Why not nl, err :\u003d sb.computeLevel?","commit_id":"89bb6015e13b9c28ee308621e7894228343ff120"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"06e67ad0c387117ae871d1d2951b4aa073f7e92f","unresolved":false,"context_lines":[{"line_number":274,"context_line":"\t// below."},{"line_number":275,"context_line":"\tfor {"},{"line_number":276,"context_line":"\t\t// Create the next level by hashing the previous one."},{"line_number":277,"context_line":"\t\tvar nl []byte"},{"line_number":278,"context_line":"\t\tpl :\u003d hashTree[len(hashTree)-1]"},{"line_number":279,"context_line":"\t\tnl, err \u003d sb.computeLevel(bytes.NewReader(pl))"},{"line_number":280,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":10,"id":"e7be21db_909da5a4","line":277,"in_reply_to":"be98e236_ab58b0b2","updated":"2021-08-09 14:53:02.000000000","message":"Done","commit_id":"89bb6015e13b9c28ee308621e7894228343ff120"}],"metropolis/node/go-veritysetup/BUILD.bazel":[{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":7,"context_line":"    visibility \u003d [\"//visibility:private\"],"},{"line_number":8,"context_line":")"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"go_binary("},{"line_number":11,"context_line":"    name \u003d \"go-veritysetup\","},{"line_number":12,"context_line":"    embed \u003d [\":go_default_library\"],"},{"line_number":13,"context_line":"    visibility \u003d [\"//visibility:private\"],"}],"source_content_type":"text/x-python","patch_set":3,"id":"b5be70e0_e744a69b","line":10,"updated":"2021-07-27 16:32:04.000000000","message":"Wrong spot for this code. //metropolis/node/ is a very top-level package. Should probably live within //metropolis/node/build/... .\n\nnit: I\u0027d probably also not call it go-veritysetup, but just veritysetup. Or even better, mkverity, as that fits `mkerofs` next to it.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    visibility \u003d [\"//visibility:private\"],"},{"line_number":8,"context_line":")"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"go_binary("},{"line_number":11,"context_line":"    name \u003d \"go-veritysetup\","},{"line_number":12,"context_line":"    embed \u003d [\":go_default_library\"],"},{"line_number":13,"context_line":"    visibility \u003d [\"//visibility:private\"],"}],"source_content_type":"text/x-python","patch_set":3,"id":"9d9677eb_8ec830d5","line":10,"in_reply_to":"b5be70e0_e744a69b","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"}],"metropolis/node/go-veritysetup/main.go":[{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":14,"context_line":"// See the License for the specific language governing permissions and"},{"line_number":15,"context_line":"// limitations under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"package main"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import ("},{"line_number":20,"context_line":"\t\"crypto/rand\""}],"source_content_type":"text/x-go","patch_set":3,"id":"a1426341_b7f37364","line":17,"updated":"2021-07-27 16:32:04.000000000","message":"Needs package-level doc (should eg. contain `The piece of code [...] ` from the commit message).\n\nhttps://blog.golang.org/godoc C-f \"comments on package\"","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":14,"context_line":"// See the License for the specific language governing permissions and"},{"line_number":15,"context_line":"// limitations under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"package main"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import ("},{"line_number":20,"context_line":"\t\"crypto/rand\""}],"source_content_type":"text/x-go","patch_set":3,"id":"9d346436_2601b750","line":17,"in_reply_to":"a1426341_b7f37364","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":26,"context_line":"\t\"os\""},{"line_number":27,"context_line":")"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"type veritySuperblock struct {"},{"line_number":30,"context_line":"\tsignature [8]uint8  // \"verity\\0\\0\""},{"line_number":31,"context_line":"\tversion   uint32    // superblock version"},{"line_number":32,"context_line":"\thash_type uint32    // \u00271\u0027"}],"source_content_type":"text/x-go","patch_set":3,"id":"798507b4_3eb34823","line":29,"range":{"start_line":29,"start_character":5,"end_line":29,"end_character":21},"updated":"2021-07-27 16:32:04.000000000","message":"Comment where this definition comes from (eg. link to Linux source code).","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":26,"context_line":"\t\"os\""},{"line_number":27,"context_line":")"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"type veritySuperblock struct {"},{"line_number":30,"context_line":"\tsignature [8]uint8  // \"verity\\0\\0\""},{"line_number":31,"context_line":"\tversion   uint32    // superblock version"},{"line_number":32,"context_line":"\thash_type uint32    // \u00271\u0027"}],"source_content_type":"text/x-go","patch_set":3,"id":"7d540c3a_4daa1aab","line":29,"range":{"start_line":29,"start_character":5,"end_line":29,"end_character":21},"in_reply_to":"798507b4_3eb34823","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":27,"context_line":")"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"type veritySuperblock struct {"},{"line_number":30,"context_line":"\tsignature [8]uint8  // \"verity\\0\\0\""},{"line_number":31,"context_line":"\tversion   uint32    // superblock version"},{"line_number":32,"context_line":"\thash_type uint32    // \u00271\u0027"},{"line_number":33,"context_line":"\tuuid      [16]uint8 // uuid of the hash device"}],"source_content_type":"text/x-go","patch_set":3,"id":"9f62baa8_8c59e959","line":30,"range":{"start_line":30,"start_character":21,"end_line":30,"end_character":36},"updated":"2021-07-27 16:32:04.000000000","message":"nit: These should be full blown godoc comments, eg.\n\n    type veritySuperblock struct {\n        // signature is the magic signature of a verity hash device superblock, \u0027verity\\00\u0027.\n        signature [8]uint8\n        // ...\n    }","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":27,"context_line":")"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"type veritySuperblock struct {"},{"line_number":30,"context_line":"\tsignature [8]uint8  // \"verity\\0\\0\""},{"line_number":31,"context_line":"\tversion   uint32    // superblock version"},{"line_number":32,"context_line":"\thash_type uint32    // \u00271\u0027"},{"line_number":33,"context_line":"\tuuid      [16]uint8 // uuid of the hash device"}],"source_content_type":"text/x-go","patch_set":3,"id":"7a9ac38f_6bd2c863","line":30,"range":{"start_line":30,"start_character":21,"end_line":30,"end_character":36},"in_reply_to":"9f62baa8_8c59e959","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":29,"context_line":"type veritySuperblock struct {"},{"line_number":30,"context_line":"\tsignature [8]uint8  // \"verity\\0\\0\""},{"line_number":31,"context_line":"\tversion   uint32    // superblock version"},{"line_number":32,"context_line":"\thash_type uint32    // \u00271\u0027"},{"line_number":33,"context_line":"\tuuid      [16]uint8 // uuid of the hash device"},{"line_number":34,"context_line":"\talgorithm [32]uint8 // hash algorithm name"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-go","patch_set":3,"id":"5a97e500_3a2f2362","line":32,"range":{"start_line":32,"start_character":1,"end_line":32,"end_character":10},"updated":"2021-07-27 16:32:04.000000000","message":"style: hashType (and elsewhere)","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":29,"context_line":"type veritySuperblock struct {"},{"line_number":30,"context_line":"\tsignature [8]uint8  // \"verity\\0\\0\""},{"line_number":31,"context_line":"\tversion   uint32    // superblock version"},{"line_number":32,"context_line":"\thash_type uint32    // \u00271\u0027"},{"line_number":33,"context_line":"\tuuid      [16]uint8 // uuid of the hash device"},{"line_number":34,"context_line":"\talgorithm [32]uint8 // hash algorithm name"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-go","patch_set":3,"id":"184773d6_c4f9c1ed","line":32,"range":{"start_line":32,"start_character":1,"end_line":32,"end_character":10},"in_reply_to":"5a97e500_3a2f2362","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":43,"context_line":"\t_pad2     [168]uint8"},{"line_number":44,"context_line":"}"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"func buildSuperblock(dataDevicePath string, hashDevicePath string) (*veritySuperblock, error) {"},{"line_number":47,"context_line":"\tsb :\u003d veritySuperblock{"},{"line_number":48,"context_line":"\t\tsignature: [8]uint8{\u0027v\u0027, \u0027e\u0027, \u0027r\u0027, \u0027i\u0027, \u0027t\u0027, \u0027y\u0027, 0, 0},"},{"line_number":49,"context_line":"\t\tversion:   1,"}],"source_content_type":"text/x-go","patch_set":3,"id":"d02de45e_1b7fccb3","line":46,"range":{"start_line":46,"start_character":5,"end_line":46,"end_character":20},"updated":"2021-07-27 16:32:04.000000000","message":"Nit: newSuperblock (by convention).","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":43,"context_line":"\t_pad2     [168]uint8"},{"line_number":44,"context_line":"}"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"func buildSuperblock(dataDevicePath string, hashDevicePath string) (*veritySuperblock, error) {"},{"line_number":47,"context_line":"\tsb :\u003d veritySuperblock{"},{"line_number":48,"context_line":"\t\tsignature: [8]uint8{\u0027v\u0027, \u0027e\u0027, \u0027r\u0027, \u0027i\u0027, \u0027t\u0027, \u0027y\u0027, 0, 0},"},{"line_number":49,"context_line":"\t\tversion:   1,"}],"source_content_type":"text/x-go","patch_set":3,"id":"e8fc68fe_83c91e25","line":46,"range":{"start_line":46,"start_character":44,"end_line":46,"end_character":58},"updated":"2021-07-27 16:32:04.000000000","message":"This seems to be unused?","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":43,"context_line":"\t_pad2     [168]uint8"},{"line_number":44,"context_line":"}"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"func buildSuperblock(dataDevicePath string, hashDevicePath string) (*veritySuperblock, error) {"},{"line_number":47,"context_line":"\tsb :\u003d veritySuperblock{"},{"line_number":48,"context_line":"\t\tsignature: [8]uint8{\u0027v\u0027, \u0027e\u0027, \u0027r\u0027, \u0027i\u0027, \u0027t\u0027, \u0027y\u0027, 0, 0},"},{"line_number":49,"context_line":"\t\tversion:   1,"}],"source_content_type":"text/x-go","patch_set":3,"id":"9058504b_f84fe8c6","line":46,"range":{"start_line":46,"start_character":5,"end_line":46,"end_character":20},"in_reply_to":"d02de45e_1b7fccb3","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":43,"context_line":"\t_pad2     [168]uint8"},{"line_number":44,"context_line":"}"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"func buildSuperblock(dataDevicePath string, hashDevicePath string) (*veritySuperblock, error) {"},{"line_number":47,"context_line":"\tsb :\u003d veritySuperblock{"},{"line_number":48,"context_line":"\t\tsignature: [8]uint8{\u0027v\u0027, \u0027e\u0027, \u0027r\u0027, \u0027i\u0027, \u0027t\u0027, \u0027y\u0027, 0, 0},"},{"line_number":49,"context_line":"\t\tversion:   1,"}],"source_content_type":"text/x-go","patch_set":3,"id":"df8e3e63_bf857a4d","line":46,"range":{"start_line":46,"start_character":44,"end_line":46,"end_character":58},"in_reply_to":"e8fc68fe_83c91e25","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"func buildSuperblock(dataDevicePath string, hashDevicePath string) (*veritySuperblock, error) {"},{"line_number":47,"context_line":"\tsb :\u003d veritySuperblock{"},{"line_number":48,"context_line":"\t\tsignature: [8]uint8{\u0027v\u0027, \u0027e\u0027, \u0027r\u0027, \u0027i\u0027, \u0027t\u0027, \u0027y\u0027, 0, 0},"},{"line_number":49,"context_line":"\t\tversion:   1,"},{"line_number":50,"context_line":"\t\thash_type: 1,"},{"line_number":51,"context_line":"\t\talgorithm: [32]uint8{\u0027s\u0027, \u0027h\u0027, \u0027a\u0027, \u00272\u0027, \u00275\u0027, \u00276\u0027, 0},"}],"source_content_type":"text/x-go","patch_set":3,"id":"840f4765_3adb21a8","line":48,"range":{"start_line":48,"start_character":52,"end_line":48,"end_character":53},"updated":"2021-07-27 16:32:04.000000000","message":"No need for terminating/padding zeroes, Go structures are null-initialized by default.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"func buildSuperblock(dataDevicePath string, hashDevicePath string) (*veritySuperblock, error) {"},{"line_number":47,"context_line":"\tsb :\u003d veritySuperblock{"},{"line_number":48,"context_line":"\t\tsignature: [8]uint8{\u0027v\u0027, \u0027e\u0027, \u0027r\u0027, \u0027i\u0027, \u0027t\u0027, \u0027y\u0027, 0, 0},"},{"line_number":49,"context_line":"\t\tversion:   1,"},{"line_number":50,"context_line":"\t\thash_type: 1,"},{"line_number":51,"context_line":"\t\talgorithm: [32]uint8{\u0027s\u0027, \u0027h\u0027, \u0027a\u0027, \u00272\u0027, \u00275\u0027, \u00276\u0027, 0},"}],"source_content_type":"text/x-go","patch_set":3,"id":"a4717699_a56a2a91","line":48,"range":{"start_line":48,"start_character":52,"end_line":48,"end_character":53},"in_reply_to":"5c4fdce7_e743334f","updated":"2021-08-03 10:09:42.000000000","message":"You can also mention this in a comment string.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":true,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"func buildSuperblock(dataDevicePath string, hashDevicePath string) (*veritySuperblock, error) {"},{"line_number":47,"context_line":"\tsb :\u003d veritySuperblock{"},{"line_number":48,"context_line":"\t\tsignature: [8]uint8{\u0027v\u0027, \u0027e\u0027, \u0027r\u0027, \u0027i\u0027, \u0027t\u0027, \u0027y\u0027, 0, 0},"},{"line_number":49,"context_line":"\t\tversion:   1,"},{"line_number":50,"context_line":"\t\thash_type: 1,"},{"line_number":51,"context_line":"\t\talgorithm: [32]uint8{\u0027s\u0027, \u0027h\u0027, \u0027a\u0027, \u00272\u0027, \u00275\u0027, \u00276\u0027, 0},"}],"source_content_type":"text/x-go","patch_set":3,"id":"5c4fdce7_e743334f","line":48,"range":{"start_line":48,"start_character":52,"end_line":48,"end_character":53},"in_reply_to":"840f4765_3adb21a8","updated":"2021-08-02 09:04:30.000000000","message":"dm-verity documentation specifies the magic signature with zeroes included (although I agree it directly quotes the C code), so it was more of a literate programming thing for me to include it verbatim.\n\nI removed the trailing zero after the algorithm.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":52,"context_line":"\t\tsalt_size: 256,"},{"line_number":53,"context_line":"\t}"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"\tdataDeviceInfo, dataStatErr :\u003d os.Stat(dataDevicePath)"},{"line_number":56,"context_line":"\tif dataStatErr !\u003d nil {"},{"line_number":57,"context_line":"\t\treturn nil, dataStatErr"},{"line_number":58,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"797db6c0_ef115232","line":55,"range":{"start_line":55,"start_character":1,"end_line":55,"end_character":15},"updated":"2021-07-27 16:32:04.000000000","message":"Style: go variable names should be as short as possible without being confusing. Generally, the furhter away they are used from a definition, the more descriptive this name should be.\n\n\u0027sb\u0027 is a good name, for example. dataDeviceInfo is a bit too long and I\u0027d rename it \u0027di\u0027 or \u0027ds\u0027 (data stat).","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":52,"context_line":"\t\tsalt_size: 256,"},{"line_number":53,"context_line":"\t}"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"\tdataDeviceInfo, dataStatErr :\u003d os.Stat(dataDevicePath)"},{"line_number":56,"context_line":"\tif dataStatErr !\u003d nil {"},{"line_number":57,"context_line":"\t\treturn nil, dataStatErr"},{"line_number":58,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"35d3c662_43a6bc44","line":55,"range":{"start_line":55,"start_character":17,"end_line":55,"end_character":28},"updated":"2021-07-27 16:32:04.000000000","message":"Style: this should be called err, unless you need to hold on for it longer than until it gets squashed by some other err assignment.\n\n(elsewhere, too)","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":52,"context_line":"\t\tsalt_size: 256,"},{"line_number":53,"context_line":"\t}"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"\tdataDeviceInfo, dataStatErr :\u003d os.Stat(dataDevicePath)"},{"line_number":56,"context_line":"\tif dataStatErr !\u003d nil {"},{"line_number":57,"context_line":"\t\treturn nil, dataStatErr"},{"line_number":58,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"7d168c50_3e8da96b","line":55,"range":{"start_line":55,"start_character":17,"end_line":55,"end_character":28},"in_reply_to":"35d3c662_43a6bc44","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"5c7c6bad18a0ccb0678a5bc23ccd537d0cddf8da","unresolved":false,"context_lines":[{"line_number":52,"context_line":"\t\tsalt_size: 256,"},{"line_number":53,"context_line":"\t}"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"\tdataDeviceInfo, dataStatErr :\u003d os.Stat(dataDevicePath)"},{"line_number":56,"context_line":"\tif dataStatErr !\u003d nil {"},{"line_number":57,"context_line":"\t\treturn nil, dataStatErr"},{"line_number":58,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"7e90c06e_bf3d0277","line":55,"range":{"start_line":55,"start_character":1,"end_line":55,"end_character":15},"in_reply_to":"797db6c0_ef115232","updated":"2021-08-02 16:05:36.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"\tdataDeviceInfo, dataStatErr :\u003d os.Stat(dataDevicePath)"},{"line_number":56,"context_line":"\tif dataStatErr !\u003d nil {"},{"line_number":57,"context_line":"\t\treturn nil, dataStatErr"},{"line_number":58,"context_line":"\t}"},{"line_number":59,"context_line":"\tif dataDeviceInfo.Mode().IsRegular() {"},{"line_number":60,"context_line":"\t\tsb.data_block_size \u003d 4096"}],"source_content_type":"text/x-go","patch_set":3,"id":"be29d928_72cec49b","line":57,"range":{"start_line":57,"start_character":14,"end_line":57,"end_character":25},"updated":"2021-07-27 16:32:04.000000000","message":"Wrap this error: return nil, fmt.Errorf(\"while stating data device: %w\", err)","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"\tdataDeviceInfo, dataStatErr :\u003d os.Stat(dataDevicePath)"},{"line_number":56,"context_line":"\tif dataStatErr !\u003d nil {"},{"line_number":57,"context_line":"\t\treturn nil, dataStatErr"},{"line_number":58,"context_line":"\t}"},{"line_number":59,"context_line":"\tif dataDeviceInfo.Mode().IsRegular() {"},{"line_number":60,"context_line":"\t\tsb.data_block_size \u003d 4096"}],"source_content_type":"text/x-go","patch_set":3,"id":"2543b443_33084e69","line":57,"range":{"start_line":57,"start_character":14,"end_line":57,"end_character":25},"in_reply_to":"be29d928_72cec49b","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":57,"context_line":"\t\treturn nil, dataStatErr"},{"line_number":58,"context_line":"\t}"},{"line_number":59,"context_line":"\tif dataDeviceInfo.Mode().IsRegular() {"},{"line_number":60,"context_line":"\t\tsb.data_block_size \u003d 4096"},{"line_number":61,"context_line":"\t\tsb.hash_block_size \u003d 4096"},{"line_number":62,"context_line":"\t\tsb.data_blocks \u003d uint64(dataDeviceInfo.Size()) / uint64(sb.data_block_size)"},{"line_number":63,"context_line":"\t\tif uint64(dataDeviceInfo.Size())%uint64(sb.data_block_size) !\u003d 0 {"}],"source_content_type":"text/x-go","patch_set":3,"id":"a53cf8b3_a5b6eeba","line":60,"updated":"2021-07-27 16:32:04.000000000","message":"You can probably populate this when initializing sb.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":57,"context_line":"\t\treturn nil, dataStatErr"},{"line_number":58,"context_line":"\t}"},{"line_number":59,"context_line":"\tif dataDeviceInfo.Mode().IsRegular() {"},{"line_number":60,"context_line":"\t\tsb.data_block_size \u003d 4096"},{"line_number":61,"context_line":"\t\tsb.hash_block_size \u003d 4096"},{"line_number":62,"context_line":"\t\tsb.data_blocks \u003d uint64(dataDeviceInfo.Size()) / uint64(sb.data_block_size)"},{"line_number":63,"context_line":"\t\tif uint64(dataDeviceInfo.Size())%uint64(sb.data_block_size) !\u003d 0 {"}],"source_content_type":"text/x-go","patch_set":3,"id":"055f8422_401a9c81","line":60,"in_reply_to":"a53cf8b3_a5b6eeba","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":61,"context_line":"\t\tsb.hash_block_size \u003d 4096"},{"line_number":62,"context_line":"\t\tsb.data_blocks \u003d uint64(dataDeviceInfo.Size()) / uint64(sb.data_block_size)"},{"line_number":63,"context_line":"\t\tif uint64(dataDeviceInfo.Size())%uint64(sb.data_block_size) !\u003d 0 {"},{"line_number":64,"context_line":"\t\t\treturn nil, fmt.Errorf(\"Image file must be padded to a 4096b boundary.\")"},{"line_number":65,"context_line":"\t\t}"},{"line_number":66,"context_line":"\t} else if dataDeviceInfo.Mode()\u0026os.ModeDevice !\u003d 0 {"},{"line_number":67,"context_line":"\t\treturn nil, fmt.Errorf(\"Block device operation unsupported.\")"}],"source_content_type":"text/x-go","patch_set":3,"id":"0f810ec3_d6ceba11","line":64,"range":{"start_line":64,"start_character":27,"end_line":64,"end_character":28},"updated":"2021-07-27 16:32:04.000000000","message":"nit: errors are not full sentences, but sentence parts, ie. `image not padded to a 4096 byte boundary`. This allows for wrapping:\n\n    fmt.Errorf(\"when building kernel: %w\", err))\n\nand embedding in logs:\n\n    log.Printf(\"Could not generate image: %v; retrying...\", err)\n\nfor human-readable end-user errors (eg. \"Could not generate image: when building kernel: image not padded to a 4096 byte boundary; retrying...\").\n\n(related nit: some people parse b as bit, not byte, better spell it out)","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":61,"context_line":"\t\tsb.hash_block_size \u003d 4096"},{"line_number":62,"context_line":"\t\tsb.data_blocks \u003d uint64(dataDeviceInfo.Size()) / uint64(sb.data_block_size)"},{"line_number":63,"context_line":"\t\tif uint64(dataDeviceInfo.Size())%uint64(sb.data_block_size) !\u003d 0 {"},{"line_number":64,"context_line":"\t\t\treturn nil, fmt.Errorf(\"Image file must be padded to a 4096b boundary.\")"},{"line_number":65,"context_line":"\t\t}"},{"line_number":66,"context_line":"\t} else if dataDeviceInfo.Mode()\u0026os.ModeDevice !\u003d 0 {"},{"line_number":67,"context_line":"\t\treturn nil, fmt.Errorf(\"Block device operation unsupported.\")"}],"source_content_type":"text/x-go","patch_set":3,"id":"7ac6d5f6_a2f41df1","line":64,"range":{"start_line":64,"start_character":27,"end_line":64,"end_character":28},"in_reply_to":"0f810ec3_d6ceba11","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":65,"context_line":"\t\t}"},{"line_number":66,"context_line":"\t} else if dataDeviceInfo.Mode()\u0026os.ModeDevice !\u003d 0 {"},{"line_number":67,"context_line":"\t\treturn nil, fmt.Errorf(\"Block device operation unsupported.\")"},{"line_number":68,"context_line":"\t}"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"\tuuid_size :\u003d 16"},{"line_number":71,"context_line":"\trandom :\u003d make([]uint8, int(uuid_size)+int(sb.salt_size))"}],"source_content_type":"text/x-go","patch_set":3,"id":"5358a722_f3f9d513","line":68,"updated":"2021-07-27 16:32:04.000000000","message":"Unhandled case of files that are not IsRegular() (should probably error).","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":65,"context_line":"\t\t}"},{"line_number":66,"context_line":"\t} else if dataDeviceInfo.Mode()\u0026os.ModeDevice !\u003d 0 {"},{"line_number":67,"context_line":"\t\treturn nil, fmt.Errorf(\"Block device operation unsupported.\")"},{"line_number":68,"context_line":"\t}"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"\tuuid_size :\u003d 16"},{"line_number":71,"context_line":"\trandom :\u003d make([]uint8, int(uuid_size)+int(sb.salt_size))"}],"source_content_type":"text/x-go","patch_set":3,"id":"63a5c2f5_5d828f92","line":68,"in_reply_to":"5358a722_f3f9d513","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":75,"context_line":"\t} else {"},{"line_number":76,"context_line":"\t\tcopy(sb.uuid[:], random[:uuid_size])"},{"line_number":77,"context_line":"\t\tcopy(sb.salt[:], random[uuid_size:])"},{"line_number":78,"context_line":"\t}"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"\treturn \u0026sb, nil"},{"line_number":81,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":3,"id":"fabfd519_8843a78b","line":78,"updated":"2021-07-27 16:32:04.000000000","message":"Why do a single rand.Read into a large buffer and then copy instead of two rand calls, eg. like this?\n\n  if _, err :\u003d rand.Read(sb.uuid[:]); err !\u003d nil {\n       return nil, fmt.Errorf(\"when generating uuid: %w\", err)\n  }","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":75,"context_line":"\t} else {"},{"line_number":76,"context_line":"\t\tcopy(sb.uuid[:], random[:uuid_size])"},{"line_number":77,"context_line":"\t\tcopy(sb.salt[:], random[uuid_size:])"},{"line_number":78,"context_line":"\t}"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"\treturn \u0026sb, nil"},{"line_number":81,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":3,"id":"8acd5950_bb51114f","line":78,"in_reply_to":"fabfd519_8843a78b","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":80,"context_line":"\treturn \u0026sb, nil"},{"line_number":81,"context_line":"}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"func saltedDigest(data []byte, sb veritySuperblock) [sha256.Size]byte {"},{"line_number":84,"context_line":"\tsalt :\u003d sb.salt[:int(sb.salt_size)]"},{"line_number":85,"context_line":"\tinput :\u003d make([]byte, len(salt)+len(data))"},{"line_number":86,"context_line":"\tcopy(input[:len(salt)], salt[:])"}],"source_content_type":"text/x-go","patch_set":3,"id":"ebd81c3d_cc2ffbf8","line":83,"updated":"2021-07-27 16:32:04.000000000","message":"nit: Declare this as a method on *verifySuperblock.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":80,"context_line":"\treturn \u0026sb, nil"},{"line_number":81,"context_line":"}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"func saltedDigest(data []byte, sb veritySuperblock) [sha256.Size]byte {"},{"line_number":84,"context_line":"\tsalt :\u003d sb.salt[:int(sb.salt_size)]"},{"line_number":85,"context_line":"\tinput :\u003d make([]byte, len(salt)+len(data))"},{"line_number":86,"context_line":"\tcopy(input[:len(salt)], salt[:])"}],"source_content_type":"text/x-go","patch_set":3,"id":"c42bbd25_de4e471d","line":83,"in_reply_to":"8b83002e_d2cc45d3","updated":"2021-08-03 10:09:42.000000000","message":"Go has object orientation in the sense that it has \u0027objects\u0027 and methods and even some inheritance (embedding), but it\u0027s not classic C++/Java/Python OO. It\u0027s low on inheritance trees and class structures and modelling things within the class type system, but on the other hand Go encourages defining methods on types wherever it makes sense. Another thing to consider is that Go allows defining types that aren\u0027t structs, for example `type foo \u003d map[string]uint8` and then defining methods on that (`func (f foo) sumKeys() uint8`). Type definitions like that are encouraged wherever you repeatedly interact with a particular type shape, and then once you define these you might as well attach methods to that type.\n\nIn practice, it generally makes sense to attach functions to types (as methods with that type as a receiver) if that type is the main source of data for this method, or that method heavily modifies the type. In the case of saltedDigest, the fact that it takes a bunch of stuff from sb, some bytes, and returns some other bytes makes me feel like it belongs to veritySuperblock, as it feels like a method of veritySuperblock. It\u0027s difficult to put into words, and it varies from person to person. But a good rule of thumb is that if you have a handful of methods that all act on some struct Foo, and you have the urge to call them fooThis, fooThat, fooOtherwise - they should be methods on Foo and be named this, that and otherwise.\n\nRegarding POD vs. logic types - this distinction in Go exists. Kinda. There\u0027s no technical POD/Class distinction like in C++, it more exists as a general type cleanliness thing, for example to not expose low-level properties of some serialization format to the high-level users of a library. But generally even when you feel like something should stay as a separate struct to reflect some external serialization format and contain its peculiarities in naming and structure, then you should still create another type that is the main holder of state and logic. This is especially true if your structure is being fed into something like encoding/json or encoding/binary or is a protobuf struct - the external format then dictates the struct layout, and it\u0027s somewhat likely you don\u0027t want to expose that verbosity to higher abstraction layers.\n\nSo in this case the important question is: how much does having to have superBlock maintain a format compatible with the on-disk representation of verity impact the readability of the rest of the code? Should we split this into two structures?\n\nIn an ideal world: probably? the fact that there\u0027s so many type casts to uint64 from uint32 superblock fields isn\u0027t great. It would make things probably cleaner if some second `builder` structure would have a much higher level idea of the verity hash device we want to create, so that we don\u0027t have to repeatedly call methods on superblock to figure out things like total data bytes, data blocks per hash block, etc.\n\nHowever, in this case: it\u0027s a bit ugly to have stuff defined on superBlock like that, but it\u0027s good enough. It\u0027s still quite readable, and spending too much time on this isn\u0027t worth the extra niceness, IMO.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":80,"context_line":"\treturn \u0026sb, nil"},{"line_number":81,"context_line":"}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"func saltedDigest(data []byte, sb veritySuperblock) [sha256.Size]byte {"},{"line_number":84,"context_line":"\tsalt :\u003d sb.salt[:int(sb.salt_size)]"},{"line_number":85,"context_line":"\tinput :\u003d make([]byte, len(salt)+len(data))"},{"line_number":86,"context_line":"\tcopy(input[:len(salt)], salt[:])"}],"source_content_type":"text/x-go","patch_set":3,"id":"88033251_1864707e","line":83,"in_reply_to":"c42bbd25_de4e471d","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"5c7c6bad18a0ccb0678a5bc23ccd537d0cddf8da","unresolved":true,"context_lines":[{"line_number":80,"context_line":"\treturn \u0026sb, nil"},{"line_number":81,"context_line":"}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"func saltedDigest(data []byte, sb veritySuperblock) [sha256.Size]byte {"},{"line_number":84,"context_line":"\tsalt :\u003d sb.salt[:int(sb.salt_size)]"},{"line_number":85,"context_line":"\tinput :\u003d make([]byte, len(salt)+len(data))"},{"line_number":86,"context_line":"\tcopy(input[:len(salt)], salt[:])"}],"source_content_type":"text/x-go","patch_set":3,"id":"8b83002e_d2cc45d3","line":83,"in_reply_to":"c681f5fc_137d8076","updated":"2021-08-02 16:05:36.000000000","message":"What I meant is, eg. computeLevelZero being a method defined on a superblock looks iffy, right?","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":true,"context_lines":[{"line_number":80,"context_line":"\treturn \u0026sb, nil"},{"line_number":81,"context_line":"}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"func saltedDigest(data []byte, sb veritySuperblock) [sha256.Size]byte {"},{"line_number":84,"context_line":"\tsalt :\u003d sb.salt[:int(sb.salt_size)]"},{"line_number":85,"context_line":"\tinput :\u003d make([]byte, len(salt)+len(data))"},{"line_number":86,"context_line":"\tcopy(input[:len(salt)], salt[:])"}],"source_content_type":"text/x-go","patch_set":3,"id":"c681f5fc_137d8076","line":83,"in_reply_to":"ebd81c3d_cc2ffbf8","updated":"2021-08-02 09:04:30.000000000","message":"I did that in other cases as well, though I\u0027m not sure how I feel about it, since I meant veritySuperblock to be a POD-style struct.\n\nIt\u0027s not how I\u0027d do it in the OO paradigm, but Go isn\u0027t even OO, is it? I don\u0027t know how to do it Go-style.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":85,"context_line":"\tinput :\u003d make([]byte, len(salt)+len(data))"},{"line_number":86,"context_line":"\tcopy(input[:len(salt)], salt[:])"},{"line_number":87,"context_line":"\tcopy(input[len(salt):], data[:])"},{"line_number":88,"context_line":"\treturn sha256.Sum256(input)"},{"line_number":89,"context_line":"}"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"func computeHashBlock(dataBlocks []byte, sb veritySuperblock) ([]byte, error) {"}],"source_content_type":"text/x-go","patch_set":3,"id":"c35dcc62_4b21f516","line":88,"updated":"2021-07-27 16:32:04.000000000","message":"Instead of building a buffer and copying into it you can make a Hash object and update it twice, first with the salt and then with the data.\n\n    h :\u003d sha256.New()\n    h.Write(sb.salt[:int(sb.salt_size)])\n    h.Write(input)\n    return h.Sum(nil)","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":85,"context_line":"\tinput :\u003d make([]byte, len(salt)+len(data))"},{"line_number":86,"context_line":"\tcopy(input[:len(salt)], salt[:])"},{"line_number":87,"context_line":"\tcopy(input[len(salt):], data[:])"},{"line_number":88,"context_line":"\treturn sha256.Sum256(input)"},{"line_number":89,"context_line":"}"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"func computeHashBlock(dataBlocks []byte, sb veritySuperblock) ([]byte, error) {"}],"source_content_type":"text/x-go","patch_set":3,"id":"fe915292_cffa4ea7","line":88,"in_reply_to":"c35dcc62_4b21f516","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":88,"context_line":"\treturn sha256.Sum256(input)"},{"line_number":89,"context_line":"}"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"func computeHashBlock(dataBlocks []byte, sb veritySuperblock) ([]byte, error) {"},{"line_number":92,"context_line":"\tif sb.hash_block_size%sha256.Size !\u003d 0 {"},{"line_number":93,"context_line":"\t\treturn []byte{}, fmt.Errorf(\"Checksum size doesn\u0027t divide the hash block evenly.\")"},{"line_number":94,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"ddcbf638_d9ad3600","line":91,"range":{"start_line":91,"start_character":5,"end_line":91,"end_character":21},"updated":"2021-07-27 16:32:04.000000000","message":"Needs godoc comment.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":88,"context_line":"\treturn sha256.Sum256(input)"},{"line_number":89,"context_line":"}"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"func computeHashBlock(dataBlocks []byte, sb veritySuperblock) ([]byte, error) {"},{"line_number":92,"context_line":"\tif sb.hash_block_size%sha256.Size !\u003d 0 {"},{"line_number":93,"context_line":"\t\treturn []byte{}, fmt.Errorf(\"Checksum size doesn\u0027t divide the hash block evenly.\")"},{"line_number":94,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"18a66997_f3b35e48","line":91,"range":{"start_line":91,"start_character":5,"end_line":91,"end_character":21},"in_reply_to":"ddcbf638_d9ad3600","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"func computeHashBlock(dataBlocks []byte, sb veritySuperblock) ([]byte, error) {"},{"line_number":92,"context_line":"\tif sb.hash_block_size%sha256.Size !\u003d 0 {"},{"line_number":93,"context_line":"\t\treturn []byte{}, fmt.Errorf(\"Checksum size doesn\u0027t divide the hash block evenly.\")"},{"line_number":94,"context_line":"\t}"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"\thashCount :\u003d len(dataBlocks) / int(sb.data_block_size)"}],"source_content_type":"text/x-go","patch_set":3,"id":"2879ef96_52ee934c","line":93,"range":{"start_line":93,"start_character":9,"end_line":93,"end_character":17},"updated":"2021-07-27 16:32:04.000000000","message":"Use `nil` (a nil slice \u003d\u003d an empty slice).\n\n(elsewhere too)","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"func computeHashBlock(dataBlocks []byte, sb veritySuperblock) ([]byte, error) {"},{"line_number":92,"context_line":"\tif sb.hash_block_size%sha256.Size !\u003d 0 {"},{"line_number":93,"context_line":"\t\treturn []byte{}, fmt.Errorf(\"Checksum size doesn\u0027t divide the hash block evenly.\")"},{"line_number":94,"context_line":"\t}"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"\thashCount :\u003d len(dataBlocks) / int(sb.data_block_size)"}],"source_content_type":"text/x-go","patch_set":3,"id":"77900b99_e5904f12","line":93,"range":{"start_line":93,"start_character":9,"end_line":93,"end_character":17},"in_reply_to":"2879ef96_52ee934c","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":97,"context_line":"\tmaxHashCount :\u003d int(sb.hash_block_size) / sha256.Size"},{"line_number":98,"context_line":"\tmaxInputSize :\u003d maxHashCount * int(sb.data_block_size)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"\tif len(dataBlocks) \u003e maxInputSize {"},{"line_number":101,"context_line":"\t\tlog.Fatal(\"computeHashBlock(): Input too long.\")"},{"line_number":102,"context_line":"\t}"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-go","patch_set":3,"id":"8293e0b1_cc9227bc","line":100,"range":{"start_line":100,"start_character":4,"end_line":100,"end_character":34},"updated":"2021-07-27 16:32:04.000000000","message":"When does this happen? The math above doesn\u0027t explain this clearly.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":false,"context_lines":[{"line_number":97,"context_line":"\tmaxHashCount :\u003d int(sb.hash_block_size) / sha256.Size"},{"line_number":98,"context_line":"\tmaxInputSize :\u003d maxHashCount * int(sb.data_block_size)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"\tif len(dataBlocks) \u003e maxInputSize {"},{"line_number":101,"context_line":"\t\tlog.Fatal(\"computeHashBlock(): Input too long.\")"},{"line_number":102,"context_line":"\t}"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-go","patch_set":3,"id":"3f80b6f5_7fd8fa78","line":100,"range":{"start_line":100,"start_character":4,"end_line":100,"end_character":34},"in_reply_to":"31af1518_7112480e","updated":"2021-08-03 10:09:42.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":true,"context_lines":[{"line_number":97,"context_line":"\tmaxHashCount :\u003d int(sb.hash_block_size) / sha256.Size"},{"line_number":98,"context_line":"\tmaxInputSize :\u003d maxHashCount * int(sb.data_block_size)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"\tif len(dataBlocks) \u003e maxInputSize {"},{"line_number":101,"context_line":"\t\tlog.Fatal(\"computeHashBlock(): Input too long.\")"},{"line_number":102,"context_line":"\t}"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-go","patch_set":3,"id":"31af1518_7112480e","line":100,"range":{"start_line":100,"start_character":4,"end_line":100,"end_character":34},"in_reply_to":"8293e0b1_cc9227bc","updated":"2021-08-02 09:04:30.000000000","message":"I\u0027ve explained it in a function godoc I just added.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":98,"context_line":"\tmaxInputSize :\u003d maxHashCount * int(sb.data_block_size)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"\tif len(dataBlocks) \u003e maxInputSize {"},{"line_number":101,"context_line":"\t\tlog.Fatal(\"computeHashBlock(): Input too long.\")"},{"line_number":102,"context_line":"\t}"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"\tpaddedDataBlocks :\u003d make([]byte, maxInputSize)"}],"source_content_type":"text/x-go","patch_set":3,"id":"5ac2ca75_a0ef4255","line":101,"updated":"2021-07-27 16:32:04.000000000","message":"Return an error instead of log.Fatal.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":98,"context_line":"\tmaxInputSize :\u003d maxHashCount * int(sb.data_block_size)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"\tif len(dataBlocks) \u003e maxInputSize {"},{"line_number":101,"context_line":"\t\tlog.Fatal(\"computeHashBlock(): Input too long.\")"},{"line_number":102,"context_line":"\t}"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"\tpaddedDataBlocks :\u003d make([]byte, maxInputSize)"}],"source_content_type":"text/x-go","patch_set":3,"id":"8d3b0c7c_dbfe420d","line":101,"in_reply_to":"5ac2ca75_a0ef4255","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":105,"context_line":"\tcopy(paddedDataBlocks[:len(dataBlocks)], dataBlocks[:])"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"\thashBlock :\u003d make([]byte, sb.hash_block_size)"},{"line_number":108,"context_line":"\tfor b :\u003d 0; b \u003c maxHashCount; b++ {"},{"line_number":109,"context_line":"\t\tdataBlockOffset :\u003d b * int(sb.data_block_size)"},{"line_number":110,"context_line":"\t\tdata :\u003d paddedDataBlocks[dataBlockOffset : dataBlockOffset+int(sb.data_block_size)]"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-go","patch_set":3,"id":"13c42a3f_5fee57f0","line":108,"updated":"2021-07-27 16:32:04.000000000","message":"I can\u0027t follow the logic of this as I don\u0027t understand the maxHashCount calcualtion above. Once explain in comments, I\u0027ll take a look at it.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"5c7c6bad18a0ccb0678a5bc23ccd537d0cddf8da","unresolved":false,"context_lines":[{"line_number":105,"context_line":"\tcopy(paddedDataBlocks[:len(dataBlocks)], dataBlocks[:])"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"\thashBlock :\u003d make([]byte, sb.hash_block_size)"},{"line_number":108,"context_line":"\tfor b :\u003d 0; b \u003c maxHashCount; b++ {"},{"line_number":109,"context_line":"\t\tdataBlockOffset :\u003d b * int(sb.data_block_size)"},{"line_number":110,"context_line":"\t\tdata :\u003d paddedDataBlocks[dataBlockOffset : dataBlockOffset+int(sb.data_block_size)]"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-go","patch_set":3,"id":"644e098a_08b0e31a","line":108,"in_reply_to":"13c42a3f_5fee57f0","updated":"2021-08-02 16:05:36.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":110,"context_line":"\t\tdata :\u003d paddedDataBlocks[dataBlockOffset : dataBlockOffset+int(sb.data_block_size)]"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"\t\tvar hash [32]byte"},{"line_number":113,"context_line":"\t\t// don\u0027t salt empty data blocks"},{"line_number":114,"context_line":"\t\tif b \u003c hashCount {"},{"line_number":115,"context_line":"\t\t\thash \u003d saltedDigest(data, sb)"},{"line_number":116,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"b8c81b3b_933a158a","line":113,"updated":"2021-07-27 16:32:04.000000000","message":"nit: Comments are full sentences that start with a capital letter and end with a punctuation sign.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":110,"context_line":"\t\tdata :\u003d paddedDataBlocks[dataBlockOffset : dataBlockOffset+int(sb.data_block_size)]"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"\t\tvar hash [32]byte"},{"line_number":113,"context_line":"\t\t// don\u0027t salt empty data blocks"},{"line_number":114,"context_line":"\t\tif b \u003c hashCount {"},{"line_number":115,"context_line":"\t\t\thash \u003d saltedDigest(data, sb)"},{"line_number":116,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"e0b67d0c_f34c4dcb","line":113,"in_reply_to":"b8c81b3b_933a158a","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":124,"context_line":"func readBlocks(dataDevice *os.File, blockSize int) ([]byte, error) {"},{"line_number":125,"context_line":"\tbuffer :\u003d make([]byte, blockSize)"},{"line_number":126,"context_line":"\treadOffset :\u003d 0"},{"line_number":127,"context_line":"\tfor {"},{"line_number":128,"context_line":"\t\tnbRead, readErr :\u003d dataDevice.Read(buffer[readOffset:])"},{"line_number":129,"context_line":"\t\tif readErr !\u003d nil {"},{"line_number":130,"context_line":"\t\t\treturn buffer[:readOffset], readErr"}],"source_content_type":"text/x-go","patch_set":3,"id":"daff2cf4_db67d28f","line":127,"range":{"start_line":127,"start_character":1,"end_line":127,"end_character":4},"updated":"2021-07-27 16:32:04.000000000","message":"This seems like a reimplementation of io.ReadFull (https://pkg.go.dev/io#ReadFull).","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":124,"context_line":"func readBlocks(dataDevice *os.File, blockSize int) ([]byte, error) {"},{"line_number":125,"context_line":"\tbuffer :\u003d make([]byte, blockSize)"},{"line_number":126,"context_line":"\treadOffset :\u003d 0"},{"line_number":127,"context_line":"\tfor {"},{"line_number":128,"context_line":"\t\tnbRead, readErr :\u003d dataDevice.Read(buffer[readOffset:])"},{"line_number":129,"context_line":"\t\tif readErr !\u003d nil {"},{"line_number":130,"context_line":"\t\t\treturn buffer[:readOffset], readErr"}],"source_content_type":"text/x-go","patch_set":3,"id":"4aa92e96_b4a7ec36","line":127,"range":{"start_line":127,"start_character":1,"end_line":127,"end_character":4},"in_reply_to":"daff2cf4_db67d28f","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"func writeBlock(hashDevice io.Writer, blockSize int, data []byte) (int, error) {"},{"line_number":142,"context_line":"\tif len(data) \u003e blockSize {"},{"line_number":143,"context_line":"\t\tlog.Fatal(\"writeBlock(): Input exceeds block size.\")"},{"line_number":144,"context_line":"\t}"},{"line_number":145,"context_line":"\tbuffer :\u003d make([]byte, blockSize)"},{"line_number":146,"context_line":"\tcopy(buffer[:len(data)], data[:])"}],"source_content_type":"text/x-go","patch_set":3,"id":"e1a83214_fcc5eb9a","line":143,"updated":"2021-07-27 16:32:04.000000000","message":"Return an error, don\u0027t log.Fatal.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"func writeBlock(hashDevice io.Writer, blockSize int, data []byte) (int, error) {"},{"line_number":142,"context_line":"\tif len(data) \u003e blockSize {"},{"line_number":143,"context_line":"\t\tlog.Fatal(\"writeBlock(): Input exceeds block size.\")"},{"line_number":144,"context_line":"\t}"},{"line_number":145,"context_line":"\tbuffer :\u003d make([]byte, blockSize)"},{"line_number":146,"context_line":"\tcopy(buffer[:len(data)], data[:])"}],"source_content_type":"text/x-go","patch_set":3,"id":"38ad7a85_c2ac0fa1","line":143,"in_reply_to":"4bcbf0bf_d86cf5a7","updated":"2021-08-03 10:09:42.000000000","message":"You can also panic() for obvious programming errors.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":true,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"func writeBlock(hashDevice io.Writer, blockSize int, data []byte) (int, error) {"},{"line_number":142,"context_line":"\tif len(data) \u003e blockSize {"},{"line_number":143,"context_line":"\t\tlog.Fatal(\"writeBlock(): Input exceeds block size.\")"},{"line_number":144,"context_line":"\t}"},{"line_number":145,"context_line":"\tbuffer :\u003d make([]byte, blockSize)"},{"line_number":146,"context_line":"\tcopy(buffer[:len(data)], data[:])"}],"source_content_type":"text/x-go","patch_set":3,"id":"4bcbf0bf_d86cf5a7","line":143,"in_reply_to":"e1a83214_fcc5eb9a","updated":"2021-08-02 09:04:30.000000000","message":"I was looking for a c-style assert() behavior here, since this conditional triggering would mean writeBlock() was used incorrectly.\n\nI updated it to return an error.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":146,"context_line":"\tcopy(buffer[:len(data)], data[:])"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"\twriteOffset :\u003d 0"},{"line_number":149,"context_line":"\tfor writeOffset \u003c blockSize {"},{"line_number":150,"context_line":"\t\tnbWritten, writeErr :\u003d hashDevice.Write(buffer[writeOffset:])"},{"line_number":151,"context_line":"\t\tif writeErr !\u003d nil {"},{"line_number":152,"context_line":"\t\t\treturn writeOffset, writeErr"}],"source_content_type":"text/x-go","patch_set":3,"id":"777b85c0_1afa5e1e","line":149,"updated":"2021-07-27 16:32:04.000000000","message":"This loop is unnecessary, io.Writer always performs either a full write or returns an error:\n\nhttps://pkg.go.dev/io#Writer : Write writes len(p) bytes from p to the underlying data stream. Write must return a non-nil error if it returns n \u003c len(p). Write must not modify the slice data, even temporarily.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":146,"context_line":"\tcopy(buffer[:len(data)], data[:])"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"\twriteOffset :\u003d 0"},{"line_number":149,"context_line":"\tfor writeOffset \u003c blockSize {"},{"line_number":150,"context_line":"\t\tnbWritten, writeErr :\u003d hashDevice.Write(buffer[writeOffset:])"},{"line_number":151,"context_line":"\t\tif writeErr !\u003d nil {"},{"line_number":152,"context_line":"\t\t\treturn writeOffset, writeErr"}],"source_content_type":"text/x-go","patch_set":3,"id":"403973b7_8a70d606","line":149,"in_reply_to":"3b60e55c_336c538f","updated":"2021-08-03 10:09:42.000000000","message":"\u003e I couldn\u0027t find info on Writer implementations being required to perform either a full write or return an unrecoverable error. \n\nWell, they can perform a partial write. But they are guaranteed to return an error if anything other than a full write occured: “Write must return a non-nil error if it returns n \u003c len(p).”. If I misunderstand this, it should come up during tests :).\n\nWith this in mind, writeBlock can be drastically simplified and merged into writeBlocks: see other comments I left.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"40fa85cf7c1ff81d10d29f02b9c9955da8b1edc6","unresolved":false,"context_lines":[{"line_number":146,"context_line":"\tcopy(buffer[:len(data)], data[:])"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"\twriteOffset :\u003d 0"},{"line_number":149,"context_line":"\tfor writeOffset \u003c blockSize {"},{"line_number":150,"context_line":"\t\tnbWritten, writeErr :\u003d hashDevice.Write(buffer[writeOffset:])"},{"line_number":151,"context_line":"\t\tif writeErr !\u003d nil {"},{"line_number":152,"context_line":"\t\t\treturn writeOffset, writeErr"}],"source_content_type":"text/x-go","patch_set":3,"id":"78a1c123_67a713c5","line":149,"in_reply_to":"403973b7_8a70d606","updated":"2021-08-05 16:06:43.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":true,"context_lines":[{"line_number":146,"context_line":"\tcopy(buffer[:len(data)], data[:])"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"\twriteOffset :\u003d 0"},{"line_number":149,"context_line":"\tfor writeOffset \u003c blockSize {"},{"line_number":150,"context_line":"\t\tnbWritten, writeErr :\u003d hashDevice.Write(buffer[writeOffset:])"},{"line_number":151,"context_line":"\t\tif writeErr !\u003d nil {"},{"line_number":152,"context_line":"\t\t\treturn writeOffset, writeErr"}],"source_content_type":"text/x-go","patch_set":3,"id":"3b60e55c_336c538f","line":149,"in_reply_to":"777b85c0_1afa5e1e","updated":"2021-08-02 09:04:30.000000000","message":"I changed the below termination condition to: writeErr !\u003d io.ErrShortWrite.\n\nI couldn\u0027t find info on Writer implementations being required to perform either a full write or return an unrecoverable error. If you\u0027re sure about that, I\u0027ll refactor writeBlock() and writeBlocks() to something simpler.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":156,"context_line":"\treturn writeOffset, nil"},{"line_number":157,"context_line":"}"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"func writeBlocks(hashDevice io.Writer, blockSize int, data []byte) (int, error) {"},{"line_number":160,"context_line":"\twriteOffset :\u003d 0"},{"line_number":161,"context_line":"\tfor pos :\u003d 0; pos \u003c len(data); pos +\u003d blockSize {"},{"line_number":162,"context_line":"\t\tendOffset :\u003d pos + blockSize"}],"source_content_type":"text/x-go","patch_set":3,"id":"f37e8e88_b829f398","line":159,"updated":"2021-07-27 16:32:04.000000000","message":"Needs comment - I\u0027m not sure what this function is supposed to do? I feel like it might not be necessary (see io.Writer interface contract).","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":156,"context_line":"\treturn writeOffset, nil"},{"line_number":157,"context_line":"}"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"func writeBlocks(hashDevice io.Writer, blockSize int, data []byte) (int, error) {"},{"line_number":160,"context_line":"\twriteOffset :\u003d 0"},{"line_number":161,"context_line":"\tfor pos :\u003d 0; pos \u003c len(data); pos +\u003d blockSize {"},{"line_number":162,"context_line":"\t\tendOffset :\u003d pos + blockSize"}],"source_content_type":"text/x-go","patch_set":3,"id":"c7c66710_f01ddf61","line":159,"in_reply_to":"f37e8e88_b829f398","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":178,"context_line":"\t\treturn writeErr"},{"line_number":179,"context_line":"\t}"},{"line_number":180,"context_line":"\toffset :\u003d binary.Size(sb)"},{"line_number":181,"context_line":"\tpaddingByteCount :\u003d int(sb.hash_block_size) - offset"},{"line_number":182,"context_line":"\tfor paddingBytesWritten :\u003d 0; paddingBytesWritten \u003c paddingByteCount; {"},{"line_number":183,"context_line":"\t\tnbWritten, writeErr :\u003d hashDevice.Write([]byte{0})"},{"line_number":184,"context_line":"\t\tif writeErr !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":3,"id":"ec3df735_bf249e2a","line":181,"updated":"2021-07-27 16:32:04.000000000","message":"This probably should have a check to ensure that this is not negative (indicating that the hackBlockSize is too small of the header size).","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":178,"context_line":"\t\treturn writeErr"},{"line_number":179,"context_line":"\t}"},{"line_number":180,"context_line":"\toffset :\u003d binary.Size(sb)"},{"line_number":181,"context_line":"\tpaddingByteCount :\u003d int(sb.hash_block_size) - offset"},{"line_number":182,"context_line":"\tfor paddingBytesWritten :\u003d 0; paddingBytesWritten \u003c paddingByteCount; {"},{"line_number":183,"context_line":"\t\tnbWritten, writeErr :\u003d hashDevice.Write([]byte{0})"},{"line_number":184,"context_line":"\t\tif writeErr !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":3,"id":"1360d4cf_aef6b943","line":181,"in_reply_to":"ec3df735_bf249e2a","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":179,"context_line":"\t}"},{"line_number":180,"context_line":"\toffset :\u003d binary.Size(sb)"},{"line_number":181,"context_line":"\tpaddingByteCount :\u003d int(sb.hash_block_size) - offset"},{"line_number":182,"context_line":"\tfor paddingBytesWritten :\u003d 0; paddingBytesWritten \u003c paddingByteCount; {"},{"line_number":183,"context_line":"\t\tnbWritten, writeErr :\u003d hashDevice.Write([]byte{0})"},{"line_number":184,"context_line":"\t\tif writeErr !\u003d nil {"},{"line_number":185,"context_line":"\t\t\treturn writeErr"}],"source_content_type":"text/x-go","patch_set":3,"id":"ee606459_f38a63e4","line":182,"updated":"2021-07-27 16:32:04.000000000","message":"hashDevice.Write(bytes.Repeat([]byte{0}, paddingByteCount)\n\nUnless paddingByteCount is some astronomical doesn\u0027t-fit-in-memory size then this is better than doing a ton of tiny writes.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":179,"context_line":"\t}"},{"line_number":180,"context_line":"\toffset :\u003d binary.Size(sb)"},{"line_number":181,"context_line":"\tpaddingByteCount :\u003d int(sb.hash_block_size) - offset"},{"line_number":182,"context_line":"\tfor paddingBytesWritten :\u003d 0; paddingBytesWritten \u003c paddingByteCount; {"},{"line_number":183,"context_line":"\t\tnbWritten, writeErr :\u003d hashDevice.Write([]byte{0})"},{"line_number":184,"context_line":"\t\tif writeErr !\u003d nil {"},{"line_number":185,"context_line":"\t\t\treturn writeErr"}],"source_content_type":"text/x-go","patch_set":3,"id":"d3a72376_4f6fa795","line":182,"in_reply_to":"ee606459_f38a63e4","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":189,"context_line":"\treturn nil"},{"line_number":190,"context_line":"}"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"func computeLevelZero(dataDevice *os.File, sb veritySuperblock) ([]byte, error) {"},{"line_number":193,"context_line":"\tdataBlocksPerHashBlock :\u003d int(sb.hash_block_size) / sha256.Size"},{"line_number":194,"context_line":"\thashBlockCount :\u003d int(sb.data_blocks) / dataBlocksPerHashBlock"},{"line_number":195,"context_line":"\tif hashBlockCount*dataBlocksPerHashBlock \u003c int(sb.data_blocks) {"}],"source_content_type":"text/x-go","patch_set":3,"id":"4f8e04d0_5ca7432a","line":192,"range":{"start_line":192,"start_character":5,"end_line":192,"end_character":21},"updated":"2021-07-27 16:32:04.000000000","message":"Needs godoc comment.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":189,"context_line":"\treturn nil"},{"line_number":190,"context_line":"}"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"func computeLevelZero(dataDevice *os.File, sb veritySuperblock) ([]byte, error) {"},{"line_number":193,"context_line":"\tdataBlocksPerHashBlock :\u003d int(sb.hash_block_size) / sha256.Size"},{"line_number":194,"context_line":"\thashBlockCount :\u003d int(sb.data_blocks) / dataBlocksPerHashBlock"},{"line_number":195,"context_line":"\tif hashBlockCount*dataBlocksPerHashBlock \u003c int(sb.data_blocks) {"}],"source_content_type":"text/x-go","patch_set":3,"id":"8db619f0_03835d78","line":192,"range":{"start_line":192,"start_character":5,"end_line":192,"end_character":21},"in_reply_to":"4f8e04d0_5ca7432a","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":190,"context_line":"}"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"func computeLevelZero(dataDevice *os.File, sb veritySuperblock) ([]byte, error) {"},{"line_number":193,"context_line":"\tdataBlocksPerHashBlock :\u003d int(sb.hash_block_size) / sha256.Size"},{"line_number":194,"context_line":"\thashBlockCount :\u003d int(sb.data_blocks) / dataBlocksPerHashBlock"},{"line_number":195,"context_line":"\tif hashBlockCount*dataBlocksPerHashBlock \u003c int(sb.data_blocks) {"},{"line_number":196,"context_line":"\t\thashBlockCount++"}],"source_content_type":"text/x-go","patch_set":3,"id":"eab9227a_71972fbd","line":193,"range":{"start_line":193,"start_character":1,"end_line":193,"end_character":23},"updated":"2021-07-27 16:32:04.000000000","message":"dataBlocksPerHashBlock and hashBlockCount seem to be calculated a few times - they\u0027d probably be better off as methods defined on veritySubperblock.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":false,"context_lines":[{"line_number":190,"context_line":"}"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"func computeLevelZero(dataDevice *os.File, sb veritySuperblock) ([]byte, error) {"},{"line_number":193,"context_line":"\tdataBlocksPerHashBlock :\u003d int(sb.hash_block_size) / sha256.Size"},{"line_number":194,"context_line":"\thashBlockCount :\u003d int(sb.data_blocks) / dataBlocksPerHashBlock"},{"line_number":195,"context_line":"\tif hashBlockCount*dataBlocksPerHashBlock \u003c int(sb.data_blocks) {"},{"line_number":196,"context_line":"\t\thashBlockCount++"}],"source_content_type":"text/x-go","patch_set":3,"id":"f7c1352a_f8175ead","line":193,"range":{"start_line":193,"start_character":1,"end_line":193,"end_character":23},"in_reply_to":"66d45287_ff9b8f2c","updated":"2021-08-03 10:09:42.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"5c7c6bad18a0ccb0678a5bc23ccd537d0cddf8da","unresolved":true,"context_lines":[{"line_number":190,"context_line":"}"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"func computeLevelZero(dataDevice *os.File, sb veritySuperblock) ([]byte, error) {"},{"line_number":193,"context_line":"\tdataBlocksPerHashBlock :\u003d int(sb.hash_block_size) / sha256.Size"},{"line_number":194,"context_line":"\thashBlockCount :\u003d int(sb.data_blocks) / dataBlocksPerHashBlock"},{"line_number":195,"context_line":"\tif hashBlockCount*dataBlocksPerHashBlock \u003c int(sb.data_blocks) {"},{"line_number":196,"context_line":"\t\thashBlockCount++"}],"source_content_type":"text/x-go","patch_set":3,"id":"66d45287_ff9b8f2c","line":193,"range":{"start_line":193,"start_character":1,"end_line":193,"end_character":23},"in_reply_to":"7c8f2ef4_729a7dfe","updated":"2021-08-02 16:05:36.000000000","message":"Update: it\u0027s all a bit different after refactoring.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":true,"context_lines":[{"line_number":190,"context_line":"}"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"func computeLevelZero(dataDevice *os.File, sb veritySuperblock) ([]byte, error) {"},{"line_number":193,"context_line":"\tdataBlocksPerHashBlock :\u003d int(sb.hash_block_size) / sha256.Size"},{"line_number":194,"context_line":"\thashBlockCount :\u003d int(sb.data_blocks) / dataBlocksPerHashBlock"},{"line_number":195,"context_line":"\tif hashBlockCount*dataBlocksPerHashBlock \u003c int(sb.data_blocks) {"},{"line_number":196,"context_line":"\t\thashBlockCount++"}],"source_content_type":"text/x-go","patch_set":3,"id":"7c8f2ef4_729a7dfe","line":193,"range":{"start_line":193,"start_character":1,"end_line":193,"end_character":23},"in_reply_to":"eab9227a_71972fbd","updated":"2021-08-02 09:04:30.000000000","message":"In case of dataBlockPerHashBlock, that\u0027s true. hashBlockCount, despite the same name, means something different in each context.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":192,"context_line":"func computeLevelZero(dataDevice *os.File, sb veritySuperblock) ([]byte, error) {"},{"line_number":193,"context_line":"\tdataBlocksPerHashBlock :\u003d int(sb.hash_block_size) / sha256.Size"},{"line_number":194,"context_line":"\thashBlockCount :\u003d int(sb.data_blocks) / dataBlocksPerHashBlock"},{"line_number":195,"context_line":"\tif hashBlockCount*dataBlocksPerHashBlock \u003c int(sb.data_blocks) {"},{"line_number":196,"context_line":"\t\thashBlockCount++"},{"line_number":197,"context_line":"\t}"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-go","patch_set":3,"id":"b338f276_95e6ae3b","line":195,"updated":"2021-07-27 16:32:04.000000000","message":"Needs comment explaining this.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":false,"context_lines":[{"line_number":192,"context_line":"func computeLevelZero(dataDevice *os.File, sb veritySuperblock) ([]byte, error) {"},{"line_number":193,"context_line":"\tdataBlocksPerHashBlock :\u003d int(sb.hash_block_size) / sha256.Size"},{"line_number":194,"context_line":"\thashBlockCount :\u003d int(sb.data_blocks) / dataBlocksPerHashBlock"},{"line_number":195,"context_line":"\tif hashBlockCount*dataBlocksPerHashBlock \u003c int(sb.data_blocks) {"},{"line_number":196,"context_line":"\t\thashBlockCount++"},{"line_number":197,"context_line":"\t}"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-go","patch_set":3,"id":"27ace93a_5a26e0cc","line":195,"in_reply_to":"21d1545f_29a702f8","updated":"2021-08-03 10:09:42.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":true,"context_lines":[{"line_number":192,"context_line":"func computeLevelZero(dataDevice *os.File, sb veritySuperblock) ([]byte, error) {"},{"line_number":193,"context_line":"\tdataBlocksPerHashBlock :\u003d int(sb.hash_block_size) / sha256.Size"},{"line_number":194,"context_line":"\thashBlockCount :\u003d int(sb.data_blocks) / dataBlocksPerHashBlock"},{"line_number":195,"context_line":"\tif hashBlockCount*dataBlocksPerHashBlock \u003c int(sb.data_blocks) {"},{"line_number":196,"context_line":"\t\thashBlockCount++"},{"line_number":197,"context_line":"\t}"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-go","patch_set":3,"id":"21d1545f_29a702f8","line":195,"in_reply_to":"b338f276_95e6ae3b","updated":"2021-08-02 09:04:30.000000000","message":"I replaced this and other occurences with divide_and_roundup().\n\nYes, I feel lame about coding it this way in the first place, but I was focusing on other parts back then.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":200,"context_line":"\tfor hashBlock :\u003d 0; hashBlock \u003c hashBlockCount; hashBlock++ {"},{"line_number":201,"context_line":"\t\tinputSize :\u003d dataBlocksPerHashBlock * int(sb.data_block_size)"},{"line_number":202,"context_line":"\t\tdataBuffer, readErr :\u003d readBlocks(dataDevice, inputSize)"},{"line_number":203,"context_line":"\t\tif readErr \u003d\u003d nil || readErr \u003d\u003d io.EOF {"},{"line_number":204,"context_line":"\t\t\thash, hashErr :\u003d computeHashBlock(dataBuffer, sb)"},{"line_number":205,"context_line":"\t\t\tif hashErr !\u003d nil {"},{"line_number":206,"context_line":"\t\t\t\treturn []byte{}, hashErr"}],"source_content_type":"text/x-go","patch_set":3,"id":"cfeae2af_024a1b7c","line":203,"range":{"start_line":203,"start_character":23,"end_line":203,"end_character":40},"updated":"2021-07-27 16:32:04.000000000","message":"Are we okay with EOF resulting a truncated result? Is this expected?","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":false,"context_lines":[{"line_number":200,"context_line":"\tfor hashBlock :\u003d 0; hashBlock \u003c hashBlockCount; hashBlock++ {"},{"line_number":201,"context_line":"\t\tinputSize :\u003d dataBlocksPerHashBlock * int(sb.data_block_size)"},{"line_number":202,"context_line":"\t\tdataBuffer, readErr :\u003d readBlocks(dataDevice, inputSize)"},{"line_number":203,"context_line":"\t\tif readErr \u003d\u003d nil || readErr \u003d\u003d io.EOF {"},{"line_number":204,"context_line":"\t\t\thash, hashErr :\u003d computeHashBlock(dataBuffer, sb)"},{"line_number":205,"context_line":"\t\t\tif hashErr !\u003d nil {"},{"line_number":206,"context_line":"\t\t\t\treturn []byte{}, hashErr"}],"source_content_type":"text/x-go","patch_set":3,"id":"97fc1505_405bb72c","line":203,"range":{"start_line":203,"start_character":23,"end_line":203,"end_character":40},"in_reply_to":"7a3ef099_0bfb743f","updated":"2021-08-03 10:09:42.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":true,"context_lines":[{"line_number":200,"context_line":"\tfor hashBlock :\u003d 0; hashBlock \u003c hashBlockCount; hashBlock++ {"},{"line_number":201,"context_line":"\t\tinputSize :\u003d dataBlocksPerHashBlock * int(sb.data_block_size)"},{"line_number":202,"context_line":"\t\tdataBuffer, readErr :\u003d readBlocks(dataDevice, inputSize)"},{"line_number":203,"context_line":"\t\tif readErr \u003d\u003d nil || readErr \u003d\u003d io.EOF {"},{"line_number":204,"context_line":"\t\t\thash, hashErr :\u003d computeHashBlock(dataBuffer, sb)"},{"line_number":205,"context_line":"\t\t\tif hashErr !\u003d nil {"},{"line_number":206,"context_line":"\t\t\t\treturn []byte{}, hashErr"}],"source_content_type":"text/x-go","patch_set":3,"id":"7a3ef099_0bfb743f","line":203,"range":{"start_line":203,"start_character":23,"end_line":203,"end_character":40},"in_reply_to":"cfeae2af_024a1b7c","updated":"2021-08-02 09:04:30.000000000","message":"Yes, and this is expected. I\u0027ll put a comment there and drop the requirement of image file size having to be aligned to a block boundary.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":216,"context_line":"\treturn hashBlockBuffer, nil"},{"line_number":217,"context_line":"}"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"func computeLevel(inputBlocks []byte, sb veritySuperblock) ([]byte, error) {"},{"line_number":220,"context_line":"\tblockCount :\u003d len(inputBlocks) / int(sb.data_block_size)"},{"line_number":221,"context_line":"\tif blockCount*int(sb.data_block_size) \u003c len(inputBlocks) {"},{"line_number":222,"context_line":"\t\tblockCount++"}],"source_content_type":"text/x-go","patch_set":3,"id":"4d9387b3_b234c49c","line":219,"range":{"start_line":219,"start_character":5,"end_line":219,"end_character":17},"updated":"2021-07-27 16:32:04.000000000","message":"Needs godoc comment. It should also explicitly state how this differs from computeLevelZero.\n\nMost of the comments from computeLevelZero also apply here.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":216,"context_line":"\treturn hashBlockBuffer, nil"},{"line_number":217,"context_line":"}"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"func computeLevel(inputBlocks []byte, sb veritySuperblock) ([]byte, error) {"},{"line_number":220,"context_line":"\tblockCount :\u003d len(inputBlocks) / int(sb.data_block_size)"},{"line_number":221,"context_line":"\tif blockCount*int(sb.data_block_size) \u003c len(inputBlocks) {"},{"line_number":222,"context_line":"\t\tblockCount++"}],"source_content_type":"text/x-go","patch_set":3,"id":"5c6cdee4_549d8289","line":219,"range":{"start_line":219,"start_character":5,"end_line":219,"end_character":17},"in_reply_to":"4d9387b3_b234c49c","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":247,"context_line":"\treturn hashBlockBuffer, nil"},{"line_number":248,"context_line":"}"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"func computeHashTreeLevels(dataDevice *os.File, sb veritySuperblock) ([][]byte, []byte, error) {"},{"line_number":251,"context_line":"\tvar levels [][]byte"},{"line_number":252,"context_line":"\tlevelZero, levelErr :\u003d computeLevelZero(dataDevice, sb)"},{"line_number":253,"context_line":"\tif levelErr !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":3,"id":"42b9b0a3_a4b30c2b","line":250,"range":{"start_line":250,"start_character":5,"end_line":250,"end_character":26},"updated":"2021-07-27 16:32:04.000000000","message":"Needs godoc comment.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":247,"context_line":"\treturn hashBlockBuffer, nil"},{"line_number":248,"context_line":"}"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"func computeHashTreeLevels(dataDevice *os.File, sb veritySuperblock) ([][]byte, []byte, error) {"},{"line_number":251,"context_line":"\tvar levels [][]byte"},{"line_number":252,"context_line":"\tlevelZero, levelErr :\u003d computeLevelZero(dataDevice, sb)"},{"line_number":253,"context_line":"\tif levelErr !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":3,"id":"f68ff0f3_dbddaf5c","line":250,"range":{"start_line":250,"start_character":51,"end_line":250,"end_character":67},"updated":"2021-07-27 16:32:04.000000000","message":"Nit: define this function as a method on veritySuperblock.\n\nYou probably also want to pass/receive this as pointer to avoid copies.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":247,"context_line":"\treturn hashBlockBuffer, nil"},{"line_number":248,"context_line":"}"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"func computeHashTreeLevels(dataDevice *os.File, sb veritySuperblock) ([][]byte, []byte, error) {"},{"line_number":251,"context_line":"\tvar levels [][]byte"},{"line_number":252,"context_line":"\tlevelZero, levelErr :\u003d computeLevelZero(dataDevice, sb)"},{"line_number":253,"context_line":"\tif levelErr !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":3,"id":"b9e7d84e_c73dcd56","line":250,"range":{"start_line":250,"start_character":5,"end_line":250,"end_character":26},"in_reply_to":"42b9b0a3_a4b30c2b","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2be54ed89a1397157a7eb58f3e8722f803882110","unresolved":true,"context_lines":[{"line_number":247,"context_line":"\treturn hashBlockBuffer, nil"},{"line_number":248,"context_line":"}"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"func computeHashTreeLevels(dataDevice *os.File, sb veritySuperblock) ([][]byte, []byte, error) {"},{"line_number":251,"context_line":"\tvar levels [][]byte"},{"line_number":252,"context_line":"\tlevelZero, levelErr :\u003d computeLevelZero(dataDevice, sb)"},{"line_number":253,"context_line":"\tif levelErr !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":3,"id":"ce8d12d3_01ca4f5e","line":250,"range":{"start_line":250,"start_character":51,"end_line":250,"end_character":67},"in_reply_to":"55e36b10_03576372","updated":"2021-08-03 10:09:42.000000000","message":"No, it doesn\u0027t get optimized, a copy will occur on each function/method call. It\u0027s okay for a tiny structure, probably not for a larger one like veritySuperblock. A pointer type will put more load on garbage collection, or value type will put more load on memory copies. Pick one :).\n\nPointer arguments and pointer receivers are quite common in Go and aren\u0027t a marker of \u0027I will mutate this\u0027. Function/method comments should state whether things get mutated or not if that\u0027s something not obvious from the function description.\n\nhttps://github.com/golang/go/wiki/CodeReviewComments#receiver-type","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"31f245d1e47f8a42a36a19a01540b87b81c67121","unresolved":false,"context_lines":[{"line_number":247,"context_line":"\treturn hashBlockBuffer, nil"},{"line_number":248,"context_line":"}"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"func computeHashTreeLevels(dataDevice *os.File, sb veritySuperblock) ([][]byte, []byte, error) {"},{"line_number":251,"context_line":"\tvar levels [][]byte"},{"line_number":252,"context_line":"\tlevelZero, levelErr :\u003d computeLevelZero(dataDevice, sb)"},{"line_number":253,"context_line":"\tif levelErr !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":3,"id":"19d8d376_b47d9fe9","line":250,"range":{"start_line":250,"start_character":51,"end_line":250,"end_character":67},"in_reply_to":"ce8d12d3_01ca4f5e","updated":"2021-08-06 10:21:59.000000000","message":"Done","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":true,"context_lines":[{"line_number":247,"context_line":"\treturn hashBlockBuffer, nil"},{"line_number":248,"context_line":"}"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"func computeHashTreeLevels(dataDevice *os.File, sb veritySuperblock) ([][]byte, []byte, error) {"},{"line_number":251,"context_line":"\tvar levels [][]byte"},{"line_number":252,"context_line":"\tlevelZero, levelErr :\u003d computeLevelZero(dataDevice, sb)"},{"line_number":253,"context_line":"\tif levelErr !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":3,"id":"55e36b10_03576372","line":250,"range":{"start_line":250,"start_character":51,"end_line":250,"end_character":67},"in_reply_to":"f68ff0f3_dbddaf5c","updated":"2021-08-02 09:04:30.000000000","message":"Wouldn\u0027t that get optimized away anyway? I don\u0027t want to suggest I\u0027m changing the structure by passing it via pointer.","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"3d09d2405eb8553b3b5d66966d11db897888e841","unresolved":true,"context_lines":[{"line_number":289,"context_line":"func format(dataDevicePath string, hashDevicePath string) ([]byte, error) {"},{"line_number":290,"context_line":"\tsb, sbErr :\u003d buildSuperblock(dataDevicePath, hashDevicePath)"},{"line_number":291,"context_line":"\tif sbErr !\u003d nil {"},{"line_number":292,"context_line":"\t\treturn []byte{}, sbErr"},{"line_number":293,"context_line":"\t}"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"\tdataDevice, dataDeviceErr :\u003d os.Open(dataDevicePath)"}],"source_content_type":"text/x-go","patch_set":3,"id":"a641c4c8_4441637d","line":292,"range":{"start_line":292,"start_character":19,"end_line":292,"end_character":24},"updated":"2021-07-27 16:32:04.000000000","message":"Wrap error (and elsewhere in this function).","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"71ffa5730391444f7e4b014090aaa4dbf9828610","unresolved":false,"context_lines":[{"line_number":289,"context_line":"func format(dataDevicePath string, hashDevicePath string) ([]byte, error) {"},{"line_number":290,"context_line":"\tsb, sbErr :\u003d buildSuperblock(dataDevicePath, hashDevicePath)"},{"line_number":291,"context_line":"\tif sbErr !\u003d nil {"},{"line_number":292,"context_line":"\t\treturn []byte{}, sbErr"},{"line_number":293,"context_line":"\t}"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"\tdataDevice, dataDeviceErr :\u003d os.Open(dataDevicePath)"}],"source_content_type":"text/x-go","patch_set":3,"id":"60059501_dcd06fc2","line":292,"range":{"start_line":292,"start_character":19,"end_line":292,"end_character":24},"in_reply_to":"a641c4c8_4441637d","updated":"2021-08-02 09:04:30.000000000","message":"Ack","commit_id":"bc94d7441872822ba414f7e7ee83d9896cf9862d"}]}
